1 /* LTO routines to use object files.
2 Copyright 2010 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"
24 #include "diagnostic-core.h"
28 #include "lto-streamer.h"
29 #include "libiberty.h"
30 #include "simple-object.h"
32 /* Handle opening elf files on hosts, such as Windows, that may use
33 text file handling that will break binary access. */
38 /* Segment name for LTO sections. This is only used for Mach-O.
39 FIXME: This needs to be kept in sync with darwin.c. */
41 #define LTO_SEGMENT_NAME "__GNU_LTO"
43 /* An LTO file wrapped around an simple_object. */
45 struct lto_simple_object
47 /* The base information. */
50 /* The system file descriptor. */
53 /* The simple_object if we are reading the file. */
54 simple_object_read
*sobj_r
;
56 /* The simple_object if we are writing the file. */
57 simple_object_write
*sobj_w
;
59 /* The currently active section. */
60 simple_object_write_section
*section
;
63 /* Saved simple_object attributes. FIXME: Once set, this is never
66 static simple_object_attributes
*saved_attributes
;
68 /* Initialize FILE, an LTO file object for FILENAME. */
71 lto_file_init (lto_file
*file
, const char *filename
, off_t offset
)
73 file
->filename
= filename
;
74 file
->offset
= offset
;
77 /* Open the file FILENAME. It WRITABLE is true, the file is opened
78 for write and, if necessary, created. Otherwise, the file is
79 opened for reading. Returns the opened file. */
82 lto_obj_file_open (const char *filename
, bool writable
)
89 struct lto_simple_object
*lo
;
93 offset_p
= strrchr (filename
, '@');
95 && offset_p
!= filename
96 && sscanf (offset_p
, "@%li%n", &loffset
, &consumed
) >= 1
97 && strlen (offset_p
) == (unsigned int) consumed
)
99 fname
= XNEWVEC (char, offset_p
- filename
+ 1);
100 memcpy (fname
, filename
, offset_p
- filename
);
101 fname
[offset_p
- filename
] = '\0';
102 offset
= (off_t
) loffset
;
106 fname
= xstrdup (filename
);
110 lo
= XCNEW (struct lto_simple_object
);
111 lto_file_init ((lto_file
*) lo
, fname
, offset
);
113 lo
->fd
= open (fname
,
115 ? O_WRONLY
| O_CREAT
| O_BINARY
116 : O_RDONLY
| O_BINARY
),
120 error ("open %s failed: %s", fname
, xstrerror (errno
));
126 simple_object_attributes
*attrs
;
128 lo
->sobj_r
= simple_object_start_read (lo
->fd
, offset
, LTO_SEGMENT_NAME
,
130 if (lo
->sobj_r
== NULL
)
133 attrs
= simple_object_fetch_attributes (lo
->sobj_r
, &errmsg
, &err
);
137 if (saved_attributes
== NULL
)
138 saved_attributes
= attrs
;
141 errmsg
= simple_object_attributes_merge (saved_attributes
, attrs
,
149 gcc_assert (saved_attributes
!= NULL
);
150 lo
->sobj_w
= simple_object_start_write (saved_attributes
,
153 if (lo
->sobj_w
== NULL
)
161 error ("%s: %s", fname
, errmsg
);
163 error ("%s: %s: %s", fname
, errmsg
, xstrerror (err
));
167 lto_obj_file_close ((lto_file
*) lo
);
171 /* Close FILE. If FILE was opened for writing, it is written out
175 lto_obj_file_close (lto_file
*file
)
177 struct lto_simple_object
*lo
= (struct lto_simple_object
*) file
;
179 if (lo
->sobj_r
!= NULL
)
180 simple_object_release_read (lo
->sobj_r
);
181 else if (lo
->sobj_w
!= NULL
)
186 gcc_assert (lo
->base
.offset
== 0);
188 errmsg
= simple_object_write_to_file (lo
->sobj_w
, lo
->fd
, &err
);
192 fatal_error ("%s", errmsg
);
194 fatal_error ("%s: %s", errmsg
, xstrerror (err
));
197 simple_object_release_write (lo
->sobj_w
);
202 if (close (lo
->fd
) < 0)
203 fatal_error ("close: %s", xstrerror (errno
));
207 /* This is passed to lto_obj_add_section. */
209 struct lto_obj_add_section_data
211 /* The hash table of sections. */
212 htab_t section_hash_table
;
213 /* The offset of this file. */
217 /* This is called for each section in the file. */
220 lto_obj_add_section (void *data
, const char *name
, off_t offset
,
223 struct lto_obj_add_section_data
*loasd
=
224 (struct lto_obj_add_section_data
*) data
;
225 htab_t section_hash_table
= (htab_t
) loasd
->section_hash_table
;
227 struct lto_section_slot s_slot
;
230 if (strncmp (name
, LTO_SECTION_NAME_PREFIX
,
231 strlen (LTO_SECTION_NAME_PREFIX
)) != 0)
234 new_name
= xstrdup (name
);
235 s_slot
.name
= new_name
;
236 slot
= htab_find_slot (section_hash_table
, &s_slot
, INSERT
);
239 struct lto_section_slot
*new_slot
= XNEW (struct lto_section_slot
);
241 new_slot
->name
= new_name
;
242 new_slot
->start
= loasd
->base_offset
+ offset
;
243 new_slot
->len
= length
;
248 error ("two or more sections for %s", new_name
);
255 /* Build a hash table whose key is the section name and whose data is
256 the start and size of each section in the .o file. */
259 lto_obj_build_section_table (lto_file
*lto_file
)
261 struct lto_simple_object
*lo
= (struct lto_simple_object
*) lto_file
;
262 htab_t section_hash_table
;
263 struct lto_obj_add_section_data loasd
;
267 section_hash_table
= lto_obj_create_section_hash_table ();
269 gcc_assert (lo
->sobj_r
!= NULL
&& lo
->sobj_w
== NULL
);
270 loasd
.section_hash_table
= section_hash_table
;
271 loasd
.base_offset
= lo
->base
.offset
;
272 errmsg
= simple_object_find_sections (lo
->sobj_r
, lto_obj_add_section
,
277 error ("%s", errmsg
);
279 error ("%s: %s", errmsg
, xstrerror (err
));
280 htab_delete (section_hash_table
);
284 return section_hash_table
;
287 /* The current output file. */
289 static lto_file
*current_out_file
;
291 /* Set the current output file. Return the old one. */
294 lto_set_current_out_file (lto_file
*file
)
298 old_file
= current_out_file
;
299 current_out_file
= file
;
303 /* Return the current output file. */
306 lto_get_current_out_file (void)
308 return current_out_file
;
311 /* Begin writing a new section named NAME in the current output
315 lto_obj_begin_section (const char *name
)
317 struct lto_simple_object
*lo
;
322 lo
= (struct lto_simple_object
*) current_out_file
;
323 gcc_assert (lo
!= NULL
324 && lo
->sobj_r
== NULL
325 && lo
->sobj_w
!= NULL
326 && lo
->section
== NULL
);
328 align
= exact_log2 (POINTER_SIZE
/ BITS_PER_UNIT
);
329 lo
->section
= simple_object_write_create_section (lo
->sobj_w
, name
, align
,
331 if (lo
->section
== NULL
)
334 fatal_error ("%s", errmsg
);
336 fatal_error ("%s: %s", errmsg
, xstrerror (errno
));
340 /* Add data to a section. BLOCK is a pointer to memory containing
344 lto_obj_append_data (const void *data
, size_t len
, void *block
)
346 struct lto_simple_object
*lo
;
350 lo
= (struct lto_simple_object
*) current_out_file
;
351 gcc_assert (lo
!= NULL
&& lo
->section
!= NULL
);
353 errmsg
= simple_object_write_add_data (lo
->sobj_w
, lo
->section
, data
, len
,
358 fatal_error ("%s", errmsg
);
360 fatal_error ("%s: %s", errmsg
, xstrerror (errno
));
366 /* Stop writing to the current output section. */
369 lto_obj_end_section (void)
371 struct lto_simple_object
*lo
;
373 lo
= (struct lto_simple_object
*) current_out_file
;
374 gcc_assert (lo
!= NULL
&& lo
->section
!= NULL
);