3 Copyright 2009 Free Software Foundation, Inc.
4 Contributed by Simon Baldwin <simonb@google.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
35 #include "lto-streamer.h"
37 /* When a file is initially compiled, the options used when generating
38 the IL are not necessarily the same as those used when linking the
39 objects into the final executable. In general, most build systems
40 will proceed with something along the lines of:
42 $ gcc <cc-flags> -flto -c f1.c -o f1.o
43 $ gcc <cc-flags> -flto -c f2.c -o f2.o
45 $ gcc <cc-flags> -flto -c fN.c -o fN.o
47 And the final link may or may not include the same <cc-flags> used
48 to generate the initial object files:
50 $ gcc <ld-flags> -flto -o prog f1.o ... fN.o
52 Since we will be generating final code during the link step, some
53 of the flags used during the compile step need to be re-applied
54 during the link step. For instance, flags in the -m family.
56 The idea is to save a selected set of <cc-flags> in a special
57 section of the initial object files. This section is then read
58 during linking and the options re-applied.
60 FIXME lto. Currently the scheme is limited in that only the
61 options saved on the first object file (f1.o) are read back during
62 the link step. This means that the options used to compile f1.o
63 will be applied to ALL the object files in the final link step.
64 More work needs to be done to implement a merging and validation
65 mechanism, as this will not be enough for all cases. */
67 /* Saved options hold the type of the option (currently CL_TARGET or
68 CL_COMMON), and the code, argument, and value. */
70 typedef struct GTY(()) opt_d
79 DEF_VEC_ALLOC_O (opt_t, heap);
82 /* Options are held in two vectors, one for those registered by
83 command line handling code, and the other for those read in from
85 static VEC(opt_t, heap) *user_options = NULL;
86 static VEC(opt_t, heap) *file_options = NULL;
88 /* Iterate FROM in reverse, writing option codes not yet in CODES into *TO.
89 Mark each new option code encountered in CODES. */
92 reverse_iterate_options (VEC(opt_t, heap) *from, VEC(opt_t, heap) **to,
97 for (i = VEC_length (opt_t, from); i > 0; i--)
99 const opt_t *const o = VEC_index (opt_t, from, i - 1);
101 if (bitmap_set_bit (codes, o->code))
102 VEC_safe_push (opt_t, heap, *to, o);
106 /* Concatenate options vectors FIRST and SECOND, rationalize so that only the
107 final of any given option remains, and return the result. */
109 static VEC(opt_t, heap) *
110 concatenate_options (VEC(opt_t, heap) *first, VEC(opt_t, heap) *second)
112 VEC(opt_t, heap) *results = NULL;
113 bitmap codes = lto_bitmap_alloc ();
115 reverse_iterate_options (second, &results, codes);
116 reverse_iterate_options (first, &results, codes);
118 lto_bitmap_free (codes);
122 /* Clear the options vector in *OPTS_P and set it to NULL. */
125 clear_options (VEC(opt_t, heap) **opts_p)
130 for (i = 0; VEC_iterate (opt_t, *opts_p, i, o); i++)
133 VEC_free (opt_t, heap, *opts_p);
136 /* Write LENGTH bytes from ADDR to STREAM. */
139 output_data_stream (struct lto_output_stream *stream,
140 const void *addr, size_t length)
142 lto_output_data_stream (stream, addr, length);
145 /* Write string STRING to STREAM. */
148 output_string_stream (struct lto_output_stream *stream, const char *string)
154 const size_t length = strlen (string);
157 output_data_stream (stream, &flag, sizeof (flag));
158 output_data_stream (stream, &length, sizeof (length));
159 output_data_stream (stream, string, length);
162 output_data_stream (stream, &flag, sizeof (flag));
165 /* Read LENGTH bytes from STREAM to ADDR. */
168 input_data_block (struct lto_input_block *ib, void *addr, size_t length)
171 unsigned char *const buffer = (unsigned char *const) addr;
173 for (i = 0; i < length; i++)
174 buffer[i] = lto_input_1_unsigned (ib);
177 /* Return a string from IB. The string is allocated, and the caller is
178 responsible for freeing it. */
181 input_string_block (struct lto_input_block *ib)
185 input_data_block (ib, &flag, sizeof (flag));
191 input_data_block (ib, &length, sizeof (length));
192 string = (char *) xcalloc (1, length + 1);
193 input_data_block (ib, string, length);
201 /* Return true if this option is one we need to save in LTO output files.
202 At present, we pass along all target options, and common options that
203 involve position independent code.
205 TODO This list of options requires expansion and rationalization.
206 Among others, optimization options may well be appropriate here. */
209 register_user_option_p (size_t code, int type)
211 return type == CL_TARGET
212 || (type == CL_COMMON
214 || code == OPT_fcommon));
217 /* Note command line option with the given TYPE and CODE, ARG, and VALUE.
218 If relevant to LTO, save it in the user options vector. */
221 lto_register_user_option (size_t code, const char *arg, int value, int type)
223 if (register_user_option_p (code, type))
231 o.arg = (char *) xmalloc (strlen (arg) + 1);
237 VEC_safe_push (opt_t, heap, user_options, &o);
241 /* Empty the saved user options vector. */
244 lto_clear_user_options (void)
246 clear_options (&user_options);
249 /* Empty the saved file options vector. */
252 lto_clear_file_options (void)
254 clear_options (&file_options);
257 /* Concatenate the user options and any file options read from an LTO IL
258 file, and serialize them to STREAM. File options precede user options
259 so that the latter override the former when reissued. */
262 output_options (struct lto_output_stream *stream)
264 VEC(opt_t, heap) *opts = concatenate_options (file_options, user_options);
265 const size_t length = VEC_length (opt_t, opts);
269 output_data_stream (stream, &length, sizeof (length));
271 for (i = 0; VEC_iterate (opt_t, opts, i, o); i++)
273 output_data_stream (stream, &o->type, sizeof (o->type));
274 output_data_stream (stream, &o->code, sizeof (o->code));
275 output_string_stream (stream, o->arg);
276 output_data_stream (stream, &o->value, sizeof (o->value));
279 VEC_free (opt_t, heap, opts);
282 /* Write currently held options to an LTO IL section. */
285 lto_write_options (void)
287 char *const section_name = lto_get_section_name (LTO_section_opts, NULL);
288 struct lto_output_stream stream;
289 struct lto_simple_header header;
290 struct lto_output_stream *header_stream;
292 lto_begin_section (section_name, !flag_wpa);
295 memset (&stream, 0, sizeof (stream));
296 output_options (&stream);
298 memset (&header, 0, sizeof (header));
299 header.lto_header.major_version = LTO_major_version;
300 header.lto_header.minor_version = LTO_minor_version;
301 header.lto_header.section_type = LTO_section_opts;
303 header.compressed_size = 0;
304 header.main_size = stream.total_size;
306 header_stream = ((struct lto_output_stream *)
307 xcalloc (1, sizeof (*header_stream)));
308 lto_output_data_stream (header_stream, &header, sizeof (header));
309 lto_write_stream (header_stream);
310 free (header_stream);
312 lto_write_stream (&stream);
316 /* Unserialize an options vector from IB, and append to file_options. */
319 input_options (struct lto_input_block *ib)
323 input_data_block (ib, &length, sizeof (length));
325 for (i = 0; i < length; i++)
329 input_data_block (ib, &o.type, sizeof (o.type));
330 input_data_block (ib, &o.code, sizeof (o.code));
331 o.arg = input_string_block (ib);
332 input_data_block (ib, &o.value, sizeof (o.value));
333 VEC_safe_push (opt_t, heap, file_options, &o);
337 /* Read options from an LTO IL section. */
340 lto_read_file_options (struct lto_file_decl_data *file_data)
344 const struct lto_simple_header *header;
346 struct lto_input_block ib;
348 data = lto_get_section_data (file_data, LTO_section_opts, NULL, &len);
349 header = (const struct lto_simple_header *) data;
350 opts_offset = sizeof (*header);
352 lto_check_version (header->lto_header.major_version,
353 header->lto_header.minor_version);
355 LTO_INIT_INPUT_BLOCK (ib, data + opts_offset, 0, header->main_size);
358 lto_free_section_data (file_data, LTO_section_opts, 0, data, len);
361 /* Re-handle option with type TYPE and CODE, ARG, and VALUE. Logic extracted
362 from common_handle_option() in opts.c.
364 FIXME lto. This section is not complete. If extended to handle
365 optimization options, note that changing these after opts.c prescan may
366 involve also adjusting other options that were defaulted from initial
367 optimization option values. */
370 handle_common_option (size_t code, const char *arg ATTRIBUTE_UNUSED, int value)
379 flag_no_common = !value;
387 /* Concatenate the user options and any file options read from an LTO IL
388 file, and reissue them as if all had just been read in from the command
389 line. As with serialization, file options precede user options. */
392 lto_reissue_options (void)
394 VEC(opt_t, heap) *opts = concatenate_options (file_options, user_options);
398 for (i = 0; VEC_iterate (opt_t, opts, i, o); i++)
400 if (o->type == CL_TARGET)
401 targetm.handle_option (o->code, o->arg, o->value);
402 else if (o->type == CL_COMMON)
403 handle_common_option (o->code, o->arg, o->value);
408 VEC_free (opt_t, heap, opts);