don't use TYPE_ARG_TYPES in the Ada frontend
[gcc.git] / gcc / lto-opts.c
1 /* LTO IL options.
2
3 Copyright 2009, 2010, 2011 Free Software Foundation, Inc.
4 Contributed by Simon Baldwin <simonb@google.com>
5
6 This file is part of GCC.
7
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
11 version.
12
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
16 for more details.
17
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/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tree.h"
26 #include "hashtab.h"
27 #include "ggc.h"
28 #include "vec.h"
29 #include "bitmap.h"
30 #include "flags.h"
31 #include "opts.h"
32 #include "options.h"
33 #include "target.h"
34 #include "diagnostic.h"
35 #include "lto-streamer.h"
36
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:
41
42 $ gcc <cc-flags> -flto -c f1.c -o f1.o
43 $ gcc <cc-flags> -flto -c f2.c -o f2.o
44 ...
45 $ gcc <cc-flags> -flto -c fN.c -o fN.o
46
47 And the final link may or may not include the same <cc-flags> used
48 to generate the initial object files:
49
50 $ gcc <ld-flags> -flto -o prog f1.o ... fN.o
51
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.
55
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.
59
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. */
66
67 /* Saved options hold the type of the option (currently CL_TARGET or
68 CL_COMMON), and the code, argument, and value. */
69
70 typedef struct GTY(()) opt_d
71 {
72 unsigned int type;
73 size_t code;
74 char *arg;
75 int value;
76 } opt_t;
77
78 DEF_VEC_O (opt_t);
79 DEF_VEC_ALLOC_O (opt_t, heap);
80
81
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
84 any LTO IL input. */
85 static VEC(opt_t, heap) *user_options = NULL;
86 static VEC(opt_t, heap) *file_options = NULL;
87
88 /* Iterate FROM in reverse, writing option codes not yet in CODES into *TO.
89 Mark each new option code encountered in CODES. */
90
91 static void
92 reverse_iterate_options (VEC(opt_t, heap) *from, VEC(opt_t, heap) **to,
93 bitmap codes)
94 {
95 int i;
96
97 for (i = VEC_length (opt_t, from); i > 0; i--)
98 {
99 const opt_t *const o = VEC_index (opt_t, from, i - 1);
100
101 if (bitmap_set_bit (codes, o->code))
102 VEC_safe_push (opt_t, heap, *to, o);
103 }
104 }
105
106 /* Concatenate options vectors FIRST and SECOND, rationalize so that only the
107 final of any given option remains, and return the result. */
108
109 static VEC(opt_t, heap) *
110 concatenate_options (VEC(opt_t, heap) *first, VEC(opt_t, heap) *second)
111 {
112 VEC(opt_t, heap) *results = NULL;
113 bitmap codes = lto_bitmap_alloc ();
114
115 reverse_iterate_options (second, &results, codes);
116 reverse_iterate_options (first, &results, codes);
117
118 lto_bitmap_free (codes);
119 return results;
120 }
121
122 /* Clear the options vector in *OPTS_P and set it to NULL. */
123
124 static void
125 clear_options (VEC(opt_t, heap) **opts_p)
126 {
127 int i;
128 opt_t *o;
129
130 FOR_EACH_VEC_ELT (opt_t, *opts_p, i, o)
131 free (o->arg);
132
133 VEC_free (opt_t, heap, *opts_p);
134 }
135
136 /* Write LENGTH bytes from ADDR to STREAM. */
137
138 static void
139 output_data_stream (struct lto_output_stream *stream,
140 const void *addr, size_t length)
141 {
142 lto_output_data_stream (stream, addr, length);
143 }
144
145 /* Write string STRING to STREAM. */
146
147 static void
148 output_string_stream (struct lto_output_stream *stream, const char *string)
149 {
150 bool flag = false;
151
152 if (string != NULL)
153 {
154 const size_t length = strlen (string);
155
156 flag = true;
157 output_data_stream (stream, &flag, sizeof (flag));
158 output_data_stream (stream, &length, sizeof (length));
159 output_data_stream (stream, string, length);
160 }
161 else
162 output_data_stream (stream, &flag, sizeof (flag));
163 }
164
165 /* Return a string from IB. The string is allocated, and the caller is
166 responsible for freeing it. */
167
168 static char *
169 input_string_block (struct lto_input_block *ib)
170 {
171 bool flag;
172
173 lto_input_data_block (ib, &flag, sizeof (flag));
174 if (flag)
175 {
176 size_t length;
177 char *string;
178
179 lto_input_data_block (ib, &length, sizeof (length));
180 string = (char *) xcalloc (1, length + 1);
181 lto_input_data_block (ib, string, length);
182
183 return string;
184 }
185 else
186 return NULL;
187 }
188
189 /* Return true if this option is one we need to save in LTO output files.
190 At present, we pass along all target options, and common options that
191 involve position independent code.
192
193 TODO This list of options requires expansion and rationalization.
194 Among others, optimization options may well be appropriate here. */
195
196 static bool
197 register_user_option_p (size_t code, unsigned int type)
198 {
199 if (type == CL_TARGET)
200 return true;
201 else if (type == CL_COMMON)
202 {
203 return (code == OPT_fPIC
204 || code == OPT_fpic
205 || code == OPT_fPIE
206 || code == OPT_fpie
207 || code == OPT_fcommon
208 || code == OPT_fexceptions);
209 }
210
211 return false;
212 }
213
214 /* Note command line option with the given TYPE and CODE, ARG, and VALUE.
215 If relevant to LTO, save it in the user options vector. */
216
217 void
218 lto_register_user_option (size_t code, const char *arg, int value,
219 unsigned int type)
220 {
221 if (register_user_option_p (code, type))
222 {
223 opt_t o;
224
225 o.type = type;
226 o.code = code;
227 if (arg != NULL)
228 {
229 o.arg = (char *) xmalloc (strlen (arg) + 1);
230 strcpy (o.arg, arg);
231 }
232 else
233 o.arg = NULL;
234 o.value = value;
235 VEC_safe_push (opt_t, heap, user_options, &o);
236 }
237 }
238
239 /* Empty the saved user options vector. */
240
241 void
242 lto_clear_user_options (void)
243 {
244 clear_options (&user_options);
245 }
246
247 /* Empty the saved file options vector. */
248
249 void
250 lto_clear_file_options (void)
251 {
252 clear_options (&file_options);
253 }
254
255 /* Concatenate the user options and any file options read from an LTO IL
256 file, and serialize them to STREAM. File options precede user options
257 so that the latter override the former when reissued. */
258
259 static void
260 output_options (struct lto_output_stream *stream)
261 {
262 VEC(opt_t, heap) *opts = concatenate_options (file_options, user_options);
263 const size_t length = VEC_length (opt_t, opts);
264 int i;
265 opt_t *o;
266
267 output_data_stream (stream, &length, sizeof (length));
268
269 FOR_EACH_VEC_ELT (opt_t, opts, i, o)
270 {
271 output_data_stream (stream, &o->type, sizeof (o->type));
272 output_data_stream (stream, &o->code, sizeof (o->code));
273 output_string_stream (stream, o->arg);
274 output_data_stream (stream, &o->value, sizeof (o->value));
275 }
276
277 VEC_free (opt_t, heap, opts);
278 }
279
280 /* Write currently held options to an LTO IL section. */
281
282 void
283 lto_write_options (void)
284 {
285 char *const section_name = lto_get_section_name (LTO_section_opts, NULL, NULL);
286 struct lto_output_stream stream;
287 struct lto_simple_header header;
288 struct lto_output_stream *header_stream;
289
290 /* Targets and languages can provide defaults for -fexceptions but
291 we only process user options from the command-line. Until we
292 serialize out a white list of options from the new global state
293 explicitly append important options as user options here. */
294 if (flag_exceptions)
295 lto_register_user_option (OPT_fexceptions, NULL, 1, CL_COMMON);
296
297 lto_begin_section (section_name, !flag_wpa);
298 free (section_name);
299
300 memset (&stream, 0, sizeof (stream));
301 output_options (&stream);
302
303 memset (&header, 0, sizeof (header));
304 header.lto_header.major_version = LTO_major_version;
305 header.lto_header.minor_version = LTO_minor_version;
306 header.lto_header.section_type = LTO_section_opts;
307
308 header.compressed_size = 0;
309 header.main_size = stream.total_size;
310
311 header_stream = ((struct lto_output_stream *)
312 xcalloc (1, sizeof (*header_stream)));
313 lto_output_data_stream (header_stream, &header, sizeof (header));
314 lto_write_stream (header_stream);
315 free (header_stream);
316
317 lto_write_stream (&stream);
318 lto_end_section ();
319 }
320
321 /* Unserialize an options vector from IB, and append to file_options. */
322
323 static void
324 input_options (struct lto_input_block *ib)
325 {
326 size_t length, i;
327
328 lto_input_data_block (ib, &length, sizeof (length));
329
330 for (i = 0; i < length; i++)
331 {
332 opt_t o;
333
334 lto_input_data_block (ib, &o.type, sizeof (o.type));
335 lto_input_data_block (ib, &o.code, sizeof (o.code));
336 o.arg = input_string_block (ib);
337 lto_input_data_block (ib, &o.value, sizeof (o.value));
338 VEC_safe_push (opt_t, heap, file_options, &o);
339 }
340 }
341
342 /* Read options from an LTO IL section. */
343
344 void
345 lto_read_file_options (struct lto_file_decl_data *file_data)
346 {
347 size_t len, l, skip;
348 const char *data, *p;
349 const struct lto_simple_header *header;
350 int32_t opts_offset;
351 struct lto_input_block ib;
352
353 data = lto_get_section_data (file_data, LTO_section_opts, NULL, &len);
354 if (!data)
355 return;
356
357 /* Option could be multiple sections merged (through ld -r)
358 Keep reading all options. This is ok right now because
359 the options just get mashed together anyways.
360 This will have to be done differently once lto-opts knows
361 how to associate options with different files. */
362 l = len;
363 p = data;
364 do
365 {
366 header = (const struct lto_simple_header *) p;
367 opts_offset = sizeof (*header);
368
369 lto_check_version (header->lto_header.major_version,
370 header->lto_header.minor_version);
371
372 LTO_INIT_INPUT_BLOCK (ib, p + opts_offset, 0, header->main_size);
373 input_options (&ib);
374
375 skip = header->main_size + opts_offset;
376 l -= skip;
377 p += skip;
378 }
379 while (l > 0);
380
381 lto_free_section_data (file_data, LTO_section_opts, 0, data, len);
382 }
383
384 /* Concatenate the user options and any file options read from an LTO IL
385 file, and reissue them as if all had just been read in from the command
386 line. As with serialization, file options precede user options. */
387
388 void
389 lto_reissue_options (void)
390 {
391 VEC(opt_t, heap) *opts = concatenate_options (file_options, user_options);
392 int i;
393 opt_t *o;
394
395 FOR_EACH_VEC_ELT (opt_t, opts, i, o)
396 {
397 void *flag_var = option_flag_var (o->code, &global_options);
398
399 if (flag_var)
400 set_option (&global_options, &global_options_set,
401 o->code, o->value, o->arg,
402 DK_UNSPECIFIED, UNKNOWN_LOCATION, global_dc);
403
404 if (o->type == CL_TARGET)
405 {
406 struct cl_decoded_option decoded;
407 generate_option (o->code, o->arg, o->value, CL_TARGET, &decoded);
408 targetm.handle_option (&global_options, &global_options_set,
409 &decoded, UNKNOWN_LOCATION);
410 }
411 else if (o->type == CL_COMMON)
412 gcc_assert (flag_var);
413 else
414 gcc_unreachable ();
415 }
416
417 /* Flag_shlib is usually set by finish_options, but we are issuing flag_pic
418 too late. */
419 if (flag_pic && !flag_pie)
420 flag_shlib = 1;
421 VEC_free (opt_t, heap, opts);
422 }