1 /* LTO routines to use object files.
2 Copyright (C) 2010-2018 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Google.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
25 #include "diagnostic-core.h"
27 #include "lto-section-names.h"
28 #include "simple-object.h"
30 /* An LTO file wrapped around an simple_object. */
32 struct lto_simple_object
34 /* The base information. */
37 /* The system file descriptor. */
40 /* The simple_object if we are reading the file. */
41 simple_object_read
*sobj_r
;
43 /* The simple_object if we are writing the file. */
44 simple_object_write
*sobj_w
;
46 /* The currently active section. */
47 simple_object_write_section
*section
;
50 /* Saved simple_object attributes. FIXME: Once set, this is never
53 static simple_object_attributes
*saved_attributes
;
55 /* Initialize FILE, an LTO file object for FILENAME. */
58 lto_file_init (lto_file
*file
, const char *filename
, off_t offset
)
60 file
->filename
= filename
;
61 file
->offset
= offset
;
64 /* Open the file FILENAME. It WRITABLE is true, the file is opened
65 for write and, if necessary, created. Otherwise, the file is
66 opened for reading. Returns the opened file. */
69 lto_obj_file_open (const char *filename
, bool writable
)
76 struct lto_simple_object
*lo
;
80 offset_p
= strrchr (filename
, '@');
82 && offset_p
!= filename
83 && sscanf (offset_p
, "@%li%n", &loffset
, &consumed
) >= 1
84 && strlen (offset_p
) == (unsigned int) consumed
)
86 fname
= XNEWVEC (char, offset_p
- filename
+ 1);
87 memcpy (fname
, filename
, offset_p
- filename
);
88 fname
[offset_p
- filename
] = '\0';
89 offset
= (off_t
) loffset
;
93 fname
= xstrdup (filename
);
97 lo
= XCNEW (struct lto_simple_object
);
98 lto_file_init ((lto_file
*) lo
, fname
, offset
);
100 lo
->fd
= open (fname
,
102 ? O_WRONLY
| O_CREAT
| O_BINARY
103 : O_RDONLY
| O_BINARY
),
107 error ("open %s failed: %s", fname
, xstrerror (errno
));
113 simple_object_attributes
*attrs
;
115 lo
->sobj_r
= simple_object_start_read (lo
->fd
, offset
, LTO_SEGMENT_NAME
,
117 if (lo
->sobj_r
== NULL
)
120 attrs
= simple_object_fetch_attributes (lo
->sobj_r
, &errmsg
, &err
);
124 if (saved_attributes
== NULL
)
125 saved_attributes
= attrs
;
128 errmsg
= simple_object_attributes_merge (saved_attributes
, attrs
,
139 gcc_assert (saved_attributes
!= NULL
);
140 lo
->sobj_w
= simple_object_start_write (saved_attributes
,
143 if (lo
->sobj_w
== NULL
)
151 error ("%s: %s", fname
, errmsg
);
153 error ("%s: %s: %s", fname
, errmsg
, xstrerror (err
));
157 lto_obj_file_close ((lto_file
*) lo
);
163 /* Close FILE. If FILE was opened for writing, it is written out
167 lto_obj_file_close (lto_file
*file
)
169 struct lto_simple_object
*lo
= (struct lto_simple_object
*) file
;
171 if (lo
->sobj_r
!= NULL
)
172 simple_object_release_read (lo
->sobj_r
);
173 else if (lo
->sobj_w
!= NULL
)
178 gcc_assert (lo
->base
.offset
== 0);
180 errmsg
= simple_object_write_to_file (lo
->sobj_w
, lo
->fd
, &err
);
184 fatal_error (input_location
, "%s", errmsg
);
186 fatal_error (input_location
, "%s: %s", errmsg
, xstrerror (err
));
189 simple_object_release_write (lo
->sobj_w
);
194 if (close (lo
->fd
) < 0)
195 fatal_error (input_location
, "close: %s", xstrerror (errno
));
199 /* This is passed to lto_obj_add_section. */
201 struct lto_obj_add_section_data
203 /* The hash table of sections. */
204 htab_t section_hash_table
;
205 /* The offset of this file. */
207 /* List in linker order */
208 struct lto_section_list
*list
;
211 /* This is called for each section in the file. */
214 lto_obj_add_section (void *data
, const char *name
, off_t offset
,
217 struct lto_obj_add_section_data
*loasd
=
218 (struct lto_obj_add_section_data
*) data
;
219 htab_t section_hash_table
= (htab_t
) loasd
->section_hash_table
;
221 struct lto_section_slot s_slot
;
223 struct lto_section_list
*list
= loasd
->list
;
225 if (strncmp (name
, section_name_prefix
, strlen (section_name_prefix
)))
228 new_name
= xstrdup (name
);
229 s_slot
.name
= new_name
;
230 slot
= htab_find_slot (section_hash_table
, &s_slot
, INSERT
);
233 struct lto_section_slot
*new_slot
= XCNEW (struct lto_section_slot
);
235 new_slot
->name
= new_name
;
236 new_slot
->start
= loasd
->base_offset
+ offset
;
237 new_slot
->len
= length
;
243 list
->first
= new_slot
;
245 list
->last
->next
= new_slot
;
246 list
->last
= new_slot
;
251 error ("two or more sections for %s", new_name
);
258 /* Build a hash table whose key is the section name and whose data is
259 the start and size of each section in the .o file. */
262 lto_obj_build_section_table (lto_file
*lto_file
, struct lto_section_list
*list
)
264 struct lto_simple_object
*lo
= (struct lto_simple_object
*) lto_file
;
265 htab_t section_hash_table
;
266 struct lto_obj_add_section_data loasd
;
270 section_hash_table
= lto_obj_create_section_hash_table ();
272 gcc_assert (lo
->sobj_r
!= NULL
&& lo
->sobj_w
== NULL
);
273 loasd
.section_hash_table
= section_hash_table
;
274 loasd
.base_offset
= lo
->base
.offset
;
276 errmsg
= simple_object_find_sections (lo
->sobj_r
, lto_obj_add_section
,
281 error ("%s", errmsg
);
283 error ("%s: %s", errmsg
, xstrerror (err
));
284 htab_delete (section_hash_table
);
288 return section_hash_table
;
291 /* The current output file. */
293 static lto_file
*current_out_file
;
295 /* Set the current output file. Return the old one. */
298 lto_set_current_out_file (lto_file
*file
)
302 old_file
= current_out_file
;
303 current_out_file
= file
;
307 /* Return the current output file. */
310 lto_get_current_out_file (void)
312 return current_out_file
;
315 /* Begin writing a new section named NAME in the current output
319 lto_obj_begin_section (const char *name
)
321 struct lto_simple_object
*lo
;
326 lo
= (struct lto_simple_object
*) current_out_file
;
327 gcc_assert (lo
!= NULL
328 && lo
->sobj_r
== NULL
329 && lo
->sobj_w
!= NULL
330 && lo
->section
== NULL
);
332 align
= ceil_log2 (POINTER_SIZE_UNITS
);
333 lo
->section
= simple_object_write_create_section (lo
->sobj_w
, name
, align
,
335 if (lo
->section
== NULL
)
338 fatal_error (input_location
, "%s", errmsg
);
340 fatal_error (input_location
, "%s: %s", errmsg
, xstrerror (errno
));
344 /* Add data to a section. BLOCK is a pointer to memory containing
348 lto_obj_append_data (const void *data
, size_t len
, void *)
350 struct lto_simple_object
*lo
;
354 lo
= (struct lto_simple_object
*) current_out_file
;
355 gcc_assert (lo
!= NULL
&& lo
->section
!= NULL
);
357 errmsg
= simple_object_write_add_data (lo
->sobj_w
, lo
->section
, data
, len
,
362 fatal_error (input_location
, "%s", errmsg
);
364 fatal_error (input_location
, "%s: %s", errmsg
, xstrerror (errno
));
368 /* Stop writing to the current output section. */
371 lto_obj_end_section (void)
373 struct lto_simple_object
*lo
;
375 lo
= (struct lto_simple_object
*) current_out_file
;
376 gcc_assert (lo
!= NULL
&& lo
->section
!= NULL
);