Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / gcc / lto / lto-lang.c
1 /* Language-dependent hooks for LTO.
2    Copyright (C) 2009-2018 Free Software Foundation, Inc.
3    Contributed by CodeSourcery, Inc.
4
5 This file is part of GCC.
6
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
10 version.
11
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
15 for more details.
16
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/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "target.h"
25 #include "function.h"
26 #include "basic-block.h"
27 #include "tree.h"
28 #include "gimple.h"
29 #include "stringpool.h"
30 #include "diagnostic-core.h"
31 #include "stor-layout.h"
32 #include "langhooks.h"
33 #include "langhooks-def.h"
34 #include "debug.h"
35 #include "lto-tree.h"
36 #include "lto.h"
37 #include "stringpool.h"
38 #include "attribs.h"
39
40 static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
41 static tree handle_leaf_attribute (tree *, tree, tree, int, bool *);
42 static tree handle_const_attribute (tree *, tree, tree, int, bool *);
43 static tree handle_malloc_attribute (tree *, tree, tree, int, bool *);
44 static tree handle_pure_attribute (tree *, tree, tree, int, bool *);
45 static tree handle_novops_attribute (tree *, tree, tree, int, bool *);
46 static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
47 static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
48 static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *);
49 static tree handle_type_generic_attribute (tree *, tree, tree, int, bool *);
50 static tree handle_transaction_pure_attribute (tree *, tree, tree, int, bool *);
51 static tree handle_returns_twice_attribute (tree *, tree, tree, int, bool *);
52 static tree handle_patchable_function_entry_attribute (tree *, tree, tree,
53                                                        int, bool *);
54 static tree ignore_attribute (tree *, tree, tree, int, bool *);
55
56 static tree handle_format_attribute (tree *, tree, tree, int, bool *);
57 static tree handle_fnspec_attribute (tree *, tree, tree, int, bool *);
58 static tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
59
60 /* Helper to define attribute exclusions.  */
61 #define ATTR_EXCL(name, function, type, variable)       \
62   { name, function, type, variable }
63
64 /* Define attributes that are mutually exclusive with one another.  */
65 static const struct attribute_spec::exclusions attr_noreturn_exclusions[] =
66 {
67   ATTR_EXCL ("noreturn", true, true, true),
68   ATTR_EXCL ("alloc_align", true, true, true),
69   ATTR_EXCL ("alloc_size", true, true, true),
70   ATTR_EXCL ("const", true, true, true),
71   ATTR_EXCL ("malloc", true, true, true),
72   ATTR_EXCL ("pure", true, true, true),
73   ATTR_EXCL ("returns_twice", true, true, true),
74   ATTR_EXCL ("warn_unused_result", true, true, true),
75   ATTR_EXCL (NULL, false, false, false),
76 };
77
78 static const struct attribute_spec::exclusions attr_returns_twice_exclusions[] =
79 {
80   ATTR_EXCL ("noreturn", true, true, true),
81   ATTR_EXCL (NULL, false, false, false),
82 };
83
84 static const struct attribute_spec::exclusions attr_const_pure_exclusions[] =
85 {
86   ATTR_EXCL ("const", true, true, true),
87   ATTR_EXCL ("noreturn", true, true, true),
88   ATTR_EXCL ("pure", true, true, true),
89   ATTR_EXCL (NULL, false, false, false)
90 };
91
92 /* Table of machine-independent attributes supported in GIMPLE.  */
93 const struct attribute_spec lto_attribute_table[] =
94 {
95   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
96        affects_type_identity, handler, exclude } */
97   { "noreturn",               0, 0, true,  false, false, false,
98                               handle_noreturn_attribute,
99                               attr_noreturn_exclusions },
100   { "leaf",                   0, 0, true,  false, false, false,
101                               handle_leaf_attribute, NULL },
102   /* The same comments as for noreturn attributes apply to const ones.  */
103   { "const",                  0, 0, true,  false, false, false,
104                               handle_const_attribute,
105                               attr_const_pure_exclusions },
106   { "malloc",                 0, 0, true,  false, false, false,
107                               handle_malloc_attribute, NULL },
108   { "pure",                   0, 0, true,  false, false, false,
109                               handle_pure_attribute,
110                               attr_const_pure_exclusions },
111   { "no vops",                0, 0, true,  false, false, false,
112                               handle_novops_attribute, NULL },
113   { "nonnull",                0, -1, false, true, true, false,
114                               handle_nonnull_attribute, NULL },
115   { "nothrow",                0, 0, true,  false, false, false,
116                               handle_nothrow_attribute, NULL },
117   { "patchable_function_entry", 1, 2, true, false, false, false,
118                               handle_patchable_function_entry_attribute,
119                               NULL },
120   { "returns_twice",          0, 0, true,  false, false, false,
121                               handle_returns_twice_attribute,
122                               attr_returns_twice_exclusions },
123   { "sentinel",               0, 1, false, true, true, false,
124                               handle_sentinel_attribute, NULL },
125   { "type generic",           0, 0, false, true, true, false,
126                               handle_type_generic_attribute, NULL },
127   { "fn spec",                1, 1, false, true, true, false,
128                               handle_fnspec_attribute, NULL },
129   { "transaction_pure",       0, 0, false, true, true, false,
130                               handle_transaction_pure_attribute, NULL },
131   /* For internal use only.  The leading '*' both prevents its usage in
132      source code and signals that it may be overridden by machine tables.  */
133   { "*tm regparm",            0, 0, false, true, true, false,
134                               ignore_attribute, NULL },
135   { NULL,                     0, 0, false, false, false, false, NULL, NULL }
136 };
137
138 /* Give the specifications for the format attributes, used by C and all
139    descendants.  */
140
141 const struct attribute_spec lto_format_attribute_table[] =
142 {
143   /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
144        affects_type_identity, handler, exclude } */
145   { "format",                 3, 3, false, true,  true, false,
146                               handle_format_attribute, NULL },
147   { "format_arg",             1, 1, false, true,  true, false,
148                               handle_format_arg_attribute, NULL },
149   { NULL,                     0, 0, false, false, false, false, NULL, NULL }
150 };
151
152 enum built_in_attribute
153 {
154 #define DEF_ATTR_NULL_TREE(ENUM) ENUM,
155 #define DEF_ATTR_INT(ENUM, VALUE) ENUM,
156 #define DEF_ATTR_STRING(ENUM, VALUE) ENUM,
157 #define DEF_ATTR_IDENT(ENUM, STRING) ENUM,
158 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) ENUM,
159 #include "builtin-attrs.def"
160 #undef DEF_ATTR_NULL_TREE
161 #undef DEF_ATTR_INT
162 #undef DEF_ATTR_STRING
163 #undef DEF_ATTR_IDENT
164 #undef DEF_ATTR_TREE_LIST
165   ATTR_LAST
166 };
167
168 static GTY(()) tree built_in_attributes[(int) ATTR_LAST];
169
170 /* Builtin types.  */
171
172 enum lto_builtin_type
173 {
174 #define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
175 #define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
176 #define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
177 #define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
178 #define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
179 #define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
180 #define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME,
181 #define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
182                             ARG6) NAME,
183 #define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
184                             ARG6, ARG7) NAME,
185 #define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
186                             ARG6, ARG7, ARG8) NAME,
187 #define DEF_FUNCTION_TYPE_9(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
188                             ARG6, ARG7, ARG8, ARG9) NAME,
189 #define DEF_FUNCTION_TYPE_10(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
190                              ARG6, ARG7, ARG8, ARG9, ARG10) NAME,
191 #define DEF_FUNCTION_TYPE_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
192                              ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME,
193 #define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
194 #define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME,
195 #define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
196 #define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
197 #define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
198 #define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG6) \
199                                 NAME,
200 #define DEF_FUNCTION_TYPE_VAR_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
201                                  ARG6) NAME,
202 #define DEF_FUNCTION_TYPE_VAR_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
203                                 ARG6, ARG7) NAME,
204 #define DEF_POINTER_TYPE(NAME, TYPE) NAME,
205 #include "builtin-types.def"
206 #undef DEF_PRIMITIVE_TYPE
207 #undef DEF_FUNCTION_TYPE_0
208 #undef DEF_FUNCTION_TYPE_1
209 #undef DEF_FUNCTION_TYPE_2
210 #undef DEF_FUNCTION_TYPE_3
211 #undef DEF_FUNCTION_TYPE_4
212 #undef DEF_FUNCTION_TYPE_5
213 #undef DEF_FUNCTION_TYPE_6
214 #undef DEF_FUNCTION_TYPE_7
215 #undef DEF_FUNCTION_TYPE_8
216 #undef DEF_FUNCTION_TYPE_9
217 #undef DEF_FUNCTION_TYPE_10
218 #undef DEF_FUNCTION_TYPE_11
219 #undef DEF_FUNCTION_TYPE_VAR_0
220 #undef DEF_FUNCTION_TYPE_VAR_1
221 #undef DEF_FUNCTION_TYPE_VAR_2
222 #undef DEF_FUNCTION_TYPE_VAR_3
223 #undef DEF_FUNCTION_TYPE_VAR_4
224 #undef DEF_FUNCTION_TYPE_VAR_5
225 #undef DEF_FUNCTION_TYPE_VAR_6
226 #undef DEF_FUNCTION_TYPE_VAR_7
227 #undef DEF_POINTER_TYPE
228   BT_LAST
229 };
230
231 typedef enum lto_builtin_type builtin_type;
232
233 static GTY(()) tree builtin_types[(int) BT_LAST + 1];
234
235 static GTY(()) tree string_type_node;
236 static GTY(()) tree const_string_type_node;
237 static GTY(()) tree wint_type_node;
238 static GTY(()) tree intmax_type_node;
239 static GTY(()) tree uintmax_type_node;
240 static GTY(()) tree signed_size_type_node;
241
242 /* Flags needed to process builtins.def.  */
243 int flag_isoc94;
244 int flag_isoc99;
245 int flag_isoc11;
246
247 /* Attribute handlers.  */
248
249 /* Handle a "noreturn" attribute; arguments as in
250    struct attribute_spec.handler.  */
251
252 static tree
253 handle_noreturn_attribute (tree *node, tree ARG_UNUSED (name),
254                            tree ARG_UNUSED (args), int ARG_UNUSED (flags),
255                            bool * ARG_UNUSED (no_add_attrs))
256 {
257   tree type = TREE_TYPE (*node);
258
259   if (TREE_CODE (*node) == FUNCTION_DECL)
260     TREE_THIS_VOLATILE (*node) = 1;
261   else if (TREE_CODE (type) == POINTER_TYPE
262            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
263     TREE_TYPE (*node)
264       = build_pointer_type
265         (build_type_variant (TREE_TYPE (type),
266                              TYPE_READONLY (TREE_TYPE (type)), 1));
267   else
268     gcc_unreachable ();
269
270   return NULL_TREE;
271 }
272
273 /* Handle a "leaf" attribute; arguments as in
274    struct attribute_spec.handler.  */
275
276 static tree
277 handle_leaf_attribute (tree *node, tree name,
278                        tree ARG_UNUSED (args),
279                        int ARG_UNUSED (flags), bool *no_add_attrs)
280 {
281   if (TREE_CODE (*node) != FUNCTION_DECL)
282     {
283       warning (OPT_Wattributes, "%qE attribute ignored", name);
284       *no_add_attrs = true;
285     }
286   if (!TREE_PUBLIC (*node))
287     {
288       warning (OPT_Wattributes, "%qE attribute has no effect on unit local functions", name);
289       *no_add_attrs = true;
290     }
291
292   return NULL_TREE;
293 }
294
295 /* Handle a "const" attribute; arguments as in
296    struct attribute_spec.handler.  */
297
298 static tree
299 handle_const_attribute (tree *node, tree ARG_UNUSED (name),
300                         tree ARG_UNUSED (args), int ARG_UNUSED (flags),
301                         bool * ARG_UNUSED (no_add_attrs))
302 {
303   if (TREE_CODE (*node) != FUNCTION_DECL
304       || !DECL_BUILT_IN (*node))
305     inform (UNKNOWN_LOCATION, "%s:%s: %E: %E", __FILE__, __func__, *node, name);
306
307   tree type = TREE_TYPE (*node);
308
309   /* See FIXME comment on noreturn in c_common_attribute_table.  */
310   if (TREE_CODE (*node) == FUNCTION_DECL)
311     TREE_READONLY (*node) = 1;
312   else if (TREE_CODE (type) == POINTER_TYPE
313            && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
314     TREE_TYPE (*node)
315       = build_pointer_type
316         (build_type_variant (TREE_TYPE (type), 1,
317                              TREE_THIS_VOLATILE (TREE_TYPE (type))));
318   else
319     gcc_unreachable ();
320
321   return NULL_TREE;
322 }
323
324
325 /* Handle a "malloc" attribute; arguments as in
326    struct attribute_spec.handler.  */
327
328 static tree
329 handle_malloc_attribute (tree *node, tree ARG_UNUSED (name),
330                          tree ARG_UNUSED (args), int ARG_UNUSED (flags),
331                          bool * ARG_UNUSED (no_add_attrs))
332 {
333   if (TREE_CODE (*node) == FUNCTION_DECL
334       && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (*node))))
335     DECL_IS_MALLOC (*node) = 1;
336   else
337     gcc_unreachable ();
338
339   return NULL_TREE;
340 }
341
342
343 /* Handle a "pure" attribute; arguments as in
344    struct attribute_spec.handler.  */
345
346 static tree
347 handle_pure_attribute (tree *node, tree ARG_UNUSED (name),
348                        tree ARG_UNUSED (args), int ARG_UNUSED (flags),
349                        bool * ARG_UNUSED (no_add_attrs))
350 {
351   if (TREE_CODE (*node) == FUNCTION_DECL)
352     DECL_PURE_P (*node) = 1;
353   else
354     gcc_unreachable ();
355
356   return NULL_TREE;
357 }
358
359
360 /* Handle a "no vops" attribute; arguments as in
361    struct attribute_spec.handler.  */
362
363 static tree
364 handle_novops_attribute (tree *node, tree ARG_UNUSED (name),
365                          tree ARG_UNUSED (args), int ARG_UNUSED (flags),
366                          bool *ARG_UNUSED (no_add_attrs))
367 {
368   gcc_assert (TREE_CODE (*node) == FUNCTION_DECL);
369   DECL_IS_NOVOPS (*node) = 1;
370   return NULL_TREE;
371 }
372
373
374 /* Helper for nonnull attribute handling; fetch the operand number
375    from the attribute argument list.  */
376
377 static bool
378 get_nonnull_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp)
379 {
380   /* Verify the arg number is a constant.  */
381   if (!tree_fits_uhwi_p (arg_num_expr))
382     return false;
383
384   *valp = TREE_INT_CST_LOW (arg_num_expr);
385   return true;
386 }
387
388 /* Handle the "nonnull" attribute.  */
389
390 static tree
391 handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
392                           tree args, int ARG_UNUSED (flags),
393                           bool * ARG_UNUSED (no_add_attrs))
394 {
395   tree type = *node;
396
397   /* If no arguments are specified, all pointer arguments should be
398      non-null.  Verify a full prototype is given so that the arguments
399      will have the correct types when we actually check them later.
400      Avoid diagnosing type-generic built-ins since those have no
401      prototype.  */
402   if (!args)
403     {
404       gcc_assert (prototype_p (type)
405                   || !TYPE_ATTRIBUTES (type)
406                   || lookup_attribute ("type generic", TYPE_ATTRIBUTES (type)));
407
408       return NULL_TREE;
409     }
410
411   /* Argument list specified.  Verify that each argument number references
412      a pointer argument.  */
413   for (; args; args = TREE_CHAIN (args))
414     {
415       tree argument;
416       unsigned HOST_WIDE_INT arg_num = 0, ck_num;
417
418       if (!get_nonnull_operand (TREE_VALUE (args), &arg_num))
419         gcc_unreachable ();
420
421       argument = TYPE_ARG_TYPES (type);
422       if (argument)
423         {
424           for (ck_num = 1; ; ck_num++)
425             {
426               if (!argument || ck_num == arg_num)
427                 break;
428               argument = TREE_CHAIN (argument);
429             }
430
431           gcc_assert (argument
432                       && TREE_CODE (TREE_VALUE (argument)) == POINTER_TYPE);
433         }
434     }
435
436   return NULL_TREE;
437 }
438
439
440 /* Handle a "nothrow" attribute; arguments as in
441    struct attribute_spec.handler.  */
442
443 static tree
444 handle_nothrow_attribute (tree *node, tree ARG_UNUSED (name),
445                           tree ARG_UNUSED (args), int ARG_UNUSED (flags),
446                           bool * ARG_UNUSED (no_add_attrs))
447 {
448   if (TREE_CODE (*node) == FUNCTION_DECL)
449     TREE_NOTHROW (*node) = 1;
450   else
451     gcc_unreachable ();
452
453   return NULL_TREE;
454 }
455
456
457 /* Handle a "sentinel" attribute.  */
458
459 static tree
460 handle_sentinel_attribute (tree *node, tree ARG_UNUSED (name), tree args,
461                            int ARG_UNUSED (flags),
462                            bool * ARG_UNUSED (no_add_attrs))
463 {
464   gcc_assert (stdarg_p (*node));
465
466   if (args)
467     {
468       tree position = TREE_VALUE (args);
469       gcc_assert (TREE_CODE (position) == INTEGER_CST);
470       if (tree_int_cst_lt (position, integer_zero_node))
471         gcc_unreachable ();
472     }
473
474   return NULL_TREE;
475 }
476
477 /* Handle a "type_generic" attribute.  */
478
479 static tree
480 handle_type_generic_attribute (tree *node, tree ARG_UNUSED (name),
481                                tree ARG_UNUSED (args), int ARG_UNUSED (flags),
482                                bool * ARG_UNUSED (no_add_attrs))
483 {
484   /* Ensure we have a function type.  */
485   gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE);
486   
487   /* Ensure we have a variadic function.  */
488   gcc_assert (!prototype_p (*node) || stdarg_p (*node));
489
490   return NULL_TREE;
491 }
492
493 /* Handle a "transaction_pure" attribute.  */
494
495 static tree
496 handle_transaction_pure_attribute (tree *node, tree ARG_UNUSED (name),
497                                    tree ARG_UNUSED (args),
498                                    int ARG_UNUSED (flags),
499                                    bool * ARG_UNUSED (no_add_attrs))
500 {
501   /* Ensure we have a function type.  */
502   gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE);
503
504   return NULL_TREE;
505 }
506
507 /* Handle a "returns_twice" attribute.  */
508
509 static tree
510 handle_returns_twice_attribute (tree *node, tree ARG_UNUSED (name),
511                                 tree ARG_UNUSED (args),
512                                 int ARG_UNUSED (flags),
513                                 bool * ARG_UNUSED (no_add_attrs))
514 {
515   gcc_assert (TREE_CODE (*node) == FUNCTION_DECL);
516
517   DECL_IS_RETURNS_TWICE (*node) = 1;
518
519   return NULL_TREE;
520 }
521
522 static tree
523 handle_patchable_function_entry_attribute (tree *, tree, tree, int, bool *)
524 {
525   /* Nothing to be done here.  */
526   return NULL_TREE;
527 }
528
529 /* Ignore the given attribute.  Used when this attribute may be usefully
530    overridden by the target, but is not used generically.  */
531
532 static tree
533 ignore_attribute (tree * ARG_UNUSED (node), tree ARG_UNUSED (name),
534                   tree ARG_UNUSED (args), int ARG_UNUSED (flags),
535                   bool *no_add_attrs)
536 {
537   *no_add_attrs = true;
538   return NULL_TREE;
539 }
540
541 /* Handle a "format" attribute; arguments as in
542    struct attribute_spec.handler.  */
543
544 static tree
545 handle_format_attribute (tree * ARG_UNUSED (node), tree ARG_UNUSED (name),
546                          tree ARG_UNUSED (args), int ARG_UNUSED (flags),
547                          bool *no_add_attrs)
548 {
549   *no_add_attrs = true;
550   return NULL_TREE;
551 }
552
553
554 /* Handle a "format_arg" attribute; arguments as in
555    struct attribute_spec.handler.  */
556
557 tree
558 handle_format_arg_attribute (tree * ARG_UNUSED (node), tree ARG_UNUSED (name),
559                              tree ARG_UNUSED (args), int ARG_UNUSED (flags),
560                              bool *no_add_attrs)
561 {
562   *no_add_attrs = true;
563   return NULL_TREE;
564 }
565
566
567 /* Handle a "fn spec" attribute; arguments as in
568    struct attribute_spec.handler.  */
569
570 static tree
571 handle_fnspec_attribute (tree *node ATTRIBUTE_UNUSED, tree ARG_UNUSED (name),
572                          tree args, int ARG_UNUSED (flags),
573                          bool *no_add_attrs ATTRIBUTE_UNUSED)
574 {
575   gcc_assert (args
576               && TREE_CODE (TREE_VALUE (args)) == STRING_CST
577               && !TREE_CHAIN (args));
578   return NULL_TREE;
579 }
580
581 /* Cribbed from c-common.c.  */
582
583 static void
584 def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...)
585 {
586   tree t;
587   tree *args = XALLOCAVEC (tree, n);
588   va_list list;
589   int i;
590   bool err = false;
591
592   va_start (list, n);
593   for (i = 0; i < n; ++i)
594     {
595       builtin_type a = (builtin_type) va_arg (list, int);
596       t = builtin_types[a];
597       if (t == error_mark_node)
598         err = true;
599       args[i] = t;
600     }
601   va_end (list);
602
603   t = builtin_types[ret];
604   if (err)
605     t = error_mark_node;
606   if (t == error_mark_node)
607     ;
608   else if (var)
609     t = build_varargs_function_type_array (t, n, args);
610   else
611     t = build_function_type_array (t, n, args);
612
613   builtin_types[def] = t;
614 }
615
616 /* Used to help initialize the builtin-types.def table.  When a type of
617    the correct size doesn't exist, use error_mark_node instead of NULL.
618    The later results in segfaults even when a decl using the type doesn't
619    get invoked.  */
620
621 static tree
622 builtin_type_for_size (int size, bool unsignedp)
623 {
624   tree type = lang_hooks.types.type_for_size (size, unsignedp);
625   return type ? type : error_mark_node;
626 }
627
628 /* Support for DEF_BUILTIN.  */
629
630 static void
631 def_builtin_1 (enum built_in_function fncode, const char *name,
632                enum built_in_class fnclass, tree fntype, tree libtype,
633                bool both_p, bool fallback_p, bool nonansi_p,
634                tree fnattrs, bool implicit_p)
635 {
636   tree decl;
637   const char *libname;
638
639   if (fntype == error_mark_node)
640     return;
641
642   libname = name + strlen ("__builtin_");
643   decl = add_builtin_function (name, fntype, fncode, fnclass,
644                                (fallback_p ? libname : NULL),
645                                fnattrs);
646
647   if (both_p
648       && !flag_no_builtin
649       && !(nonansi_p && flag_no_nonansi_builtin))
650     add_builtin_function (libname, libtype, fncode, fnclass,
651                           NULL, fnattrs);
652
653   set_builtin_decl (fncode, decl, implicit_p);
654 }
655
656
657 /* Initialize the attribute table for all the supported builtins.  */
658
659 static void
660 lto_init_attributes (void)
661 {
662   /* Fill in the built_in_attributes array.  */
663 #define DEF_ATTR_NULL_TREE(ENUM)                                \
664   built_in_attributes[(int) ENUM] = NULL_TREE;
665 #define DEF_ATTR_INT(ENUM, VALUE)                               \
666   built_in_attributes[(int) ENUM] = build_int_cst (NULL_TREE, VALUE);
667 #define DEF_ATTR_STRING(ENUM, VALUE)                            \
668   built_in_attributes[(int) ENUM] = build_string (strlen (VALUE), VALUE);
669 #define DEF_ATTR_IDENT(ENUM, STRING)                            \
670   built_in_attributes[(int) ENUM] = get_identifier (STRING);
671 #define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \
672   built_in_attributes[(int) ENUM]                       \
673     = tree_cons (built_in_attributes[(int) PURPOSE],    \
674                  built_in_attributes[(int) VALUE],      \
675                  built_in_attributes[(int) CHAIN]);
676 #include "builtin-attrs.def"
677 #undef DEF_ATTR_NULL_TREE
678 #undef DEF_ATTR_INT
679 #undef DEF_ATTR_STRING
680 #undef DEF_ATTR_IDENT
681 #undef DEF_ATTR_TREE_LIST
682 }
683
684 /* Create builtin types and functions.  VA_LIST_REF_TYPE_NODE and
685    VA_LIST_ARG_TYPE_NODE are used in builtin-types.def.  */
686
687 static void
688 lto_define_builtins (tree va_list_ref_type_node ATTRIBUTE_UNUSED,
689                      tree va_list_arg_type_node ATTRIBUTE_UNUSED)
690 {
691 #define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
692   builtin_types[ENUM] = VALUE;
693 #define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \
694   def_fn_type (ENUM, RETURN, 0, 0);
695 #define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \
696   def_fn_type (ENUM, RETURN, 0, 1, ARG1);
697 #define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \
698   def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2);
699 #define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
700   def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3);
701 #define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
702   def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4);
703 #define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
704   def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
705 #define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
706                             ARG6)                                       \
707   def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
708 #define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
709                             ARG6, ARG7)                                 \
710   def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
711 #define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
712                             ARG6, ARG7, ARG8)                           \
713   def_fn_type (ENUM, RETURN, 0, 8, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,  \
714                ARG7, ARG8);
715 #define DEF_FUNCTION_TYPE_9(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
716                             ARG6, ARG7, ARG8, ARG9)                     \
717   def_fn_type (ENUM, RETURN, 0, 9, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,  \
718                ARG7, ARG8, ARG9);
719 #define DEF_FUNCTION_TYPE_10(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
720                              ARG6, ARG7, ARG8, ARG9, ARG10)              \
721   def_fn_type (ENUM, RETURN, 0, 10, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,  \
722                ARG7, ARG8, ARG9, ARG10);
723 #define DEF_FUNCTION_TYPE_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
724                              ARG6, ARG7, ARG8, ARG9, ARG10, ARG11)       \
725   def_fn_type (ENUM, RETURN, 0, 11, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6,  \
726                ARG7, ARG8, ARG9, ARG10, ARG11);
727 #define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \
728   def_fn_type (ENUM, RETURN, 1, 0);
729 #define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \
730   def_fn_type (ENUM, RETURN, 1, 1, ARG1);
731 #define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \
732   def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2);
733 #define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \
734   def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3);
735 #define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \
736   def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4);
737 #define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \
738   def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5);
739 #define DEF_FUNCTION_TYPE_VAR_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
740                                  ARG6)  \
741   def_fn_type (ENUM, RETURN, 1, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6);
742 #define DEF_FUNCTION_TYPE_VAR_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
743                                 ARG6, ARG7)                             \
744   def_fn_type (ENUM, RETURN, 1, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7);
745 #define DEF_POINTER_TYPE(ENUM, TYPE) \
746   builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]);
747
748 #include "builtin-types.def"
749
750 #undef DEF_PRIMITIVE_TYPE
751 #undef DEF_FUNCTION_TYPE_0
752 #undef DEF_FUNCTION_TYPE_1
753 #undef DEF_FUNCTION_TYPE_2
754 #undef DEF_FUNCTION_TYPE_3
755 #undef DEF_FUNCTION_TYPE_4
756 #undef DEF_FUNCTION_TYPE_5
757 #undef DEF_FUNCTION_TYPE_6
758 #undef DEF_FUNCTION_TYPE_7
759 #undef DEF_FUNCTION_TYPE_8
760 #undef DEF_FUNCTION_TYPE_9
761 #undef DEF_FUNCTION_TYPE_10
762 #undef DEF_FUNCTION_TYPE_11
763 #undef DEF_FUNCTION_TYPE_VAR_0
764 #undef DEF_FUNCTION_TYPE_VAR_1
765 #undef DEF_FUNCTION_TYPE_VAR_2
766 #undef DEF_FUNCTION_TYPE_VAR_3
767 #undef DEF_FUNCTION_TYPE_VAR_4
768 #undef DEF_FUNCTION_TYPE_VAR_5
769 #undef DEF_FUNCTION_TYPE_VAR_6
770 #undef DEF_FUNCTION_TYPE_VAR_7
771 #undef DEF_POINTER_TYPE
772   builtin_types[(int) BT_LAST] = NULL_TREE;
773
774   lto_init_attributes ();
775
776 #define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P,\
777                     NONANSI_P, ATTRS, IMPLICIT, COND)                   \
778     if (NAME && COND)                                                   \
779       def_builtin_1 (ENUM, NAME, CLASS, builtin_types[(int) TYPE],      \
780                      builtin_types[(int) LIBTYPE], BOTH_P, FALLBACK_P,  \
781                      NONANSI_P, built_in_attributes[(int) ATTRS], IMPLICIT);
782 #include "builtins.def"
783 }
784
785 static GTY(()) tree registered_builtin_types;
786
787 /* Language hooks.  */
788
789 static unsigned int
790 lto_option_lang_mask (void)
791 {
792   return CL_LTO;
793 }
794
795 static bool
796 lto_complain_wrong_lang_p (const struct cl_option *option ATTRIBUTE_UNUSED)
797 {
798   /* The LTO front end inherits all the options from the first front
799      end that was used.  However, not all the original front end
800      options make sense in LTO.
801
802      A real solution would be to filter this in collect2, but collect2
803      does not have access to all the option attributes to know what to
804      filter.  So, in lto1 we silently accept inherited flags and do
805      nothing about it.  */
806   return false;
807 }
808
809 static void
810 lto_init_options_struct (struct gcc_options *opts)
811 {
812   /* By default, C99-like requirements for complex multiply and divide.
813      ???  Until the complex method is encoded in the IL this is the only
814      safe choice.  This will pessimize Fortran code with LTO unless
815      people specify a complex method manually or use -ffast-math.  */
816   opts->x_flag_complex_method = 2;
817 }
818
819 /* Handle command-line option SCODE.  If the option takes an argument, it is
820    stored in ARG, which is otherwise NULL.  VALUE holds either a numerical
821    argument or a binary value indicating whether the positive or negative form
822    of the option was supplied.  */
823
824 const char *resolution_file_name;
825 static bool
826 lto_handle_option (size_t scode, const char *arg,
827                    int value ATTRIBUTE_UNUSED, int kind ATTRIBUTE_UNUSED,
828                    location_t loc ATTRIBUTE_UNUSED,
829                    const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED)
830 {
831   enum opt_code code = (enum opt_code) scode;
832   bool result = true;
833
834   switch (code)
835     {
836     case OPT_fresolution_:
837       resolution_file_name = arg;
838       break;
839
840     case OPT_Wabi:
841       warn_psabi = value;
842       break;
843
844     case OPT_fwpa:
845       flag_wpa = value ? "" : NULL;
846       break;
847
848     default:
849       break;
850     }
851
852   return result;
853 }
854
855 /* Perform post-option processing.  Does additional initialization based on
856    command-line options.  PFILENAME is the main input filename.  Returns false
857    to enable subsequent back-end initialization.  */
858
859 static bool
860 lto_post_options (const char **pfilename ATTRIBUTE_UNUSED)
861 {
862   /* -fltrans and -fwpa are mutually exclusive.  Check for that here.  */
863   if (flag_wpa && flag_ltrans)
864     error ("-fwpa and -fltrans are mutually exclusive");
865
866   if (flag_ltrans)
867     {
868       flag_generate_lto = 0;
869
870       /* During LTRANS, we are not looking at the whole program, only
871          a subset of the whole callgraph.  */
872       flag_whole_program = 0;
873     }
874
875   if (flag_wpa)
876     flag_generate_lto = 1;
877
878   /* Initialize the codegen flags according to the output type.  */
879   switch (flag_lto_linker_output)
880     {
881     case LTO_LINKER_OUTPUT_REL: /* .o: incremental link producing LTO IL  */
882       flag_whole_program = 0;
883       flag_incremental_link = 1;
884       break;
885
886     case LTO_LINKER_OUTPUT_DYN: /* .so: PID library */
887       /* On some targets, like i386 it makes sense to build PIC library wihout
888          -fpic for performance reasons.  So no need to adjust flags.  */
889       break;
890
891     case LTO_LINKER_OUTPUT_PIE: /* PIE binary */
892       /* If -fPIC or -fPIE was used at compile time, be sure that
893          flag_pie is 2.  */
894       flag_pie = MAX (flag_pie, flag_pic);
895       flag_pic = flag_pie;
896       flag_shlib = 0;
897       break;
898
899     case LTO_LINKER_OUTPUT_EXEC: /* Normal executable */
900       flag_pic = 0;
901       flag_pie = 0;
902       flag_shlib = 0;
903       break;
904
905     case LTO_LINKER_OUTPUT_UNKNOWN:
906       break;
907     }
908
909   /* Excess precision other than "fast" requires front-end
910      support.  */
911   flag_excess_precision_cmdline = EXCESS_PRECISION_FAST;
912
913   /* When partitioning, we can tear appart STRING_CSTs uses from the same
914      TU into multiple partitions.  Without constant merging the constants
915      might not be equal at runtime.  See PR50199.  */
916   if (!flag_merge_constants)
917     flag_merge_constants = 1;
918
919   /* Initialize the compiler back end.  */
920   return false;
921 }
922
923 /* Return a data type that has machine mode MODE.
924    If the mode is an integer,
925    then UNSIGNEDP selects between signed and unsigned types.
926    If the mode is a fixed-point mode,
927    then UNSIGNEDP selects between saturating and nonsaturating types.  */
928
929 static tree
930 lto_type_for_mode (machine_mode mode, int unsigned_p)
931 {
932   tree t;
933   int i;
934
935   if (mode == TYPE_MODE (integer_type_node))
936     return unsigned_p ? unsigned_type_node : integer_type_node;
937
938   if (mode == TYPE_MODE (signed_char_type_node))
939     return unsigned_p ? unsigned_char_type_node : signed_char_type_node;
940
941   if (mode == TYPE_MODE (short_integer_type_node))
942     return unsigned_p ? short_unsigned_type_node : short_integer_type_node;
943
944   if (mode == TYPE_MODE (long_integer_type_node))
945     return unsigned_p ? long_unsigned_type_node : long_integer_type_node;
946
947   if (mode == TYPE_MODE (long_long_integer_type_node))
948     return unsigned_p ? long_long_unsigned_type_node : long_long_integer_type_node;
949
950   for (i = 0; i < NUM_INT_N_ENTS; i ++)
951     if (int_n_enabled_p[i]
952         && mode == int_n_data[i].m)
953       return (unsigned_p ? int_n_trees[i].unsigned_type
954               : int_n_trees[i].signed_type);
955
956   if (mode == QImode)
957     return unsigned_p ? unsigned_intQI_type_node : intQI_type_node;
958
959   if (mode == HImode)
960     return unsigned_p ? unsigned_intHI_type_node : intHI_type_node;
961
962   if (mode == SImode)
963     return unsigned_p ? unsigned_intSI_type_node : intSI_type_node;
964
965   if (mode == DImode)
966     return unsigned_p ? unsigned_intDI_type_node : intDI_type_node;
967
968 #if HOST_BITS_PER_WIDE_INT >= 64
969   if (mode == TYPE_MODE (intTI_type_node))
970     return unsigned_p ? unsigned_intTI_type_node : intTI_type_node;
971 #endif
972
973   if (mode == TYPE_MODE (float_type_node))
974     return float_type_node;
975
976   if (mode == TYPE_MODE (double_type_node))
977     return double_type_node;
978
979   if (mode == TYPE_MODE (long_double_type_node))
980     return long_double_type_node;
981
982   if (mode == TYPE_MODE (void_type_node))
983     return void_type_node;
984
985   if (mode == TYPE_MODE (build_pointer_type (char_type_node))
986       || mode == TYPE_MODE (build_pointer_type (integer_type_node)))
987     {
988       unsigned int precision
989         = GET_MODE_PRECISION (as_a <scalar_int_mode> (mode));
990       return (unsigned_p
991               ? make_unsigned_type (precision)
992               : make_signed_type (precision));
993     }
994
995   if (COMPLEX_MODE_P (mode))
996     {
997       machine_mode inner_mode;
998       tree inner_type;
999
1000       if (mode == TYPE_MODE (complex_float_type_node))
1001         return complex_float_type_node;
1002       if (mode == TYPE_MODE (complex_double_type_node))
1003         return complex_double_type_node;
1004       if (mode == TYPE_MODE (complex_long_double_type_node))
1005         return complex_long_double_type_node;
1006
1007       if (mode == TYPE_MODE (complex_integer_type_node) && !unsigned_p)
1008         return complex_integer_type_node;
1009
1010       inner_mode = GET_MODE_INNER (mode);
1011       inner_type = lto_type_for_mode (inner_mode, unsigned_p);
1012       if (inner_type != NULL_TREE)
1013         return build_complex_type (inner_type);
1014     }
1015   else if (GET_MODE_CLASS (mode) == MODE_VECTOR_BOOL
1016            && valid_vector_subparts_p (GET_MODE_NUNITS (mode)))
1017     {
1018       unsigned int elem_bits = vector_element_size (GET_MODE_BITSIZE (mode),
1019                                                     GET_MODE_NUNITS (mode));
1020       tree bool_type = build_nonstandard_boolean_type (elem_bits);
1021       return build_vector_type_for_mode (bool_type, mode);
1022     }
1023   else if (VECTOR_MODE_P (mode)
1024            && valid_vector_subparts_p (GET_MODE_NUNITS (mode)))
1025     {
1026       machine_mode inner_mode = GET_MODE_INNER (mode);
1027       tree inner_type = lto_type_for_mode (inner_mode, unsigned_p);
1028       if (inner_type != NULL_TREE)
1029         return build_vector_type_for_mode (inner_type, mode);
1030     }
1031
1032   if (mode == TYPE_MODE (dfloat32_type_node))
1033     return dfloat32_type_node;
1034   if (mode == TYPE_MODE (dfloat64_type_node))
1035     return dfloat64_type_node;
1036   if (mode == TYPE_MODE (dfloat128_type_node))
1037     return dfloat128_type_node;
1038
1039   if (ALL_SCALAR_FIXED_POINT_MODE_P (mode))
1040     {
1041       if (mode == TYPE_MODE (short_fract_type_node))
1042         return unsigned_p ? sat_short_fract_type_node : short_fract_type_node;
1043       if (mode == TYPE_MODE (fract_type_node))
1044         return unsigned_p ? sat_fract_type_node : fract_type_node;
1045       if (mode == TYPE_MODE (long_fract_type_node))
1046         return unsigned_p ? sat_long_fract_type_node : long_fract_type_node;
1047       if (mode == TYPE_MODE (long_long_fract_type_node))
1048         return unsigned_p ? sat_long_long_fract_type_node
1049                          : long_long_fract_type_node;
1050
1051       if (mode == TYPE_MODE (unsigned_short_fract_type_node))
1052         return unsigned_p ? sat_unsigned_short_fract_type_node
1053                          : unsigned_short_fract_type_node;
1054       if (mode == TYPE_MODE (unsigned_fract_type_node))
1055         return unsigned_p ? sat_unsigned_fract_type_node
1056                          : unsigned_fract_type_node;
1057       if (mode == TYPE_MODE (unsigned_long_fract_type_node))
1058         return unsigned_p ? sat_unsigned_long_fract_type_node
1059                          : unsigned_long_fract_type_node;
1060       if (mode == TYPE_MODE (unsigned_long_long_fract_type_node))
1061         return unsigned_p ? sat_unsigned_long_long_fract_type_node
1062                          : unsigned_long_long_fract_type_node;
1063
1064       if (mode == TYPE_MODE (short_accum_type_node))
1065         return unsigned_p ? sat_short_accum_type_node : short_accum_type_node;
1066       if (mode == TYPE_MODE (accum_type_node))
1067         return unsigned_p ? sat_accum_type_node : accum_type_node;
1068       if (mode == TYPE_MODE (long_accum_type_node))
1069         return unsigned_p ? sat_long_accum_type_node : long_accum_type_node;
1070       if (mode == TYPE_MODE (long_long_accum_type_node))
1071         return unsigned_p ? sat_long_long_accum_type_node
1072                          : long_long_accum_type_node;
1073
1074       if (mode == TYPE_MODE (unsigned_short_accum_type_node))
1075         return unsigned_p ? sat_unsigned_short_accum_type_node
1076                          : unsigned_short_accum_type_node;
1077       if (mode == TYPE_MODE (unsigned_accum_type_node))
1078         return unsigned_p ? sat_unsigned_accum_type_node
1079                          : unsigned_accum_type_node;
1080       if (mode == TYPE_MODE (unsigned_long_accum_type_node))
1081         return unsigned_p ? sat_unsigned_long_accum_type_node
1082                          : unsigned_long_accum_type_node;
1083       if (mode == TYPE_MODE (unsigned_long_long_accum_type_node))
1084         return unsigned_p ? sat_unsigned_long_long_accum_type_node
1085                          : unsigned_long_long_accum_type_node;
1086
1087       if (mode == QQmode)
1088         return unsigned_p ? sat_qq_type_node : qq_type_node;
1089       if (mode == HQmode)
1090         return unsigned_p ? sat_hq_type_node : hq_type_node;
1091       if (mode == SQmode)
1092         return unsigned_p ? sat_sq_type_node : sq_type_node;
1093       if (mode == DQmode)
1094         return unsigned_p ? sat_dq_type_node : dq_type_node;
1095       if (mode == TQmode)
1096         return unsigned_p ? sat_tq_type_node : tq_type_node;
1097
1098       if (mode == UQQmode)
1099         return unsigned_p ? sat_uqq_type_node : uqq_type_node;
1100       if (mode == UHQmode)
1101         return unsigned_p ? sat_uhq_type_node : uhq_type_node;
1102       if (mode == USQmode)
1103         return unsigned_p ? sat_usq_type_node : usq_type_node;
1104       if (mode == UDQmode)
1105         return unsigned_p ? sat_udq_type_node : udq_type_node;
1106       if (mode == UTQmode)
1107         return unsigned_p ? sat_utq_type_node : utq_type_node;
1108
1109       if (mode == HAmode)
1110         return unsigned_p ? sat_ha_type_node : ha_type_node;
1111       if (mode == SAmode)
1112         return unsigned_p ? sat_sa_type_node : sa_type_node;
1113       if (mode == DAmode)
1114         return unsigned_p ? sat_da_type_node : da_type_node;
1115       if (mode == TAmode)
1116         return unsigned_p ? sat_ta_type_node : ta_type_node;
1117
1118       if (mode == UHAmode)
1119         return unsigned_p ? sat_uha_type_node : uha_type_node;
1120       if (mode == USAmode)
1121         return unsigned_p ? sat_usa_type_node : usa_type_node;
1122       if (mode == UDAmode)
1123         return unsigned_p ? sat_uda_type_node : uda_type_node;
1124       if (mode == UTAmode)
1125         return unsigned_p ? sat_uta_type_node : uta_type_node;
1126     }
1127
1128   for (t = registered_builtin_types; t; t = TREE_CHAIN (t))
1129     if (TYPE_MODE (TREE_VALUE (t)) == mode)
1130       return TREE_VALUE (t);
1131
1132   return NULL_TREE;
1133 }
1134
1135 /* Return true if we are in the global binding level.  */
1136
1137 static bool
1138 lto_global_bindings_p (void)
1139 {
1140   return cfun == NULL;
1141 }
1142
1143 static void
1144 lto_set_decl_assembler_name (tree decl)
1145 {
1146   /* This is almost the same as lhd_set_decl_assembler_name, except that
1147      we need to uniquify file-scope names, even if they are not
1148      TREE_PUBLIC, to avoid conflicts between individual files.  */
1149   tree id;
1150
1151   if (TREE_PUBLIC (decl))
1152     id = targetm.mangle_decl_assembler_name (decl, DECL_NAME (decl));
1153   else
1154     {
1155       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
1156       char *label;
1157
1158       ASM_FORMAT_PRIVATE_NAME (label, name, DECL_UID (decl));
1159       id = get_identifier (label);
1160     }
1161
1162   SET_DECL_ASSEMBLER_NAME (decl, id);
1163 }
1164
1165 static tree
1166 lto_pushdecl (tree t ATTRIBUTE_UNUSED)
1167 {
1168   /* Do nothing, since we get all information from DWARF and LTO
1169      sections.  */
1170   return NULL_TREE;
1171 }
1172
1173 static tree
1174 lto_getdecls (void)
1175 {
1176   /* We have our own write_globals langhook, hence the getdecls
1177      langhook shouldn't be used, except by dbxout.c, so we can't
1178      just abort here.  */
1179   return NULL_TREE;
1180 }
1181
1182 static tree
1183 lto_builtin_function (tree decl)
1184 {
1185   return decl;
1186 }
1187
1188 static void
1189 lto_register_builtin_type (tree type, const char *name)
1190 {
1191   tree decl;
1192
1193   if (!TYPE_NAME (type))
1194     {
1195       decl = build_decl (UNKNOWN_LOCATION, TYPE_DECL,
1196                          get_identifier (name), type);
1197       DECL_ARTIFICIAL (decl) = 1;
1198       TYPE_NAME (type) = decl;
1199     }
1200
1201   registered_builtin_types = tree_cons (0, type, registered_builtin_types);
1202 }
1203
1204 /* Build nodes that would have be created by the C front-end; necessary
1205    for including builtin-types.def and ultimately builtins.def.  */
1206
1207 static void
1208 lto_build_c_type_nodes (void)
1209 {
1210   gcc_assert (void_type_node);
1211
1212   void_list_node = build_tree_list (NULL_TREE, void_type_node);
1213   string_type_node = build_pointer_type (char_type_node);
1214   const_string_type_node
1215     = build_pointer_type (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
1216
1217   if (strcmp (SIZE_TYPE, "unsigned int") == 0)
1218     {
1219       intmax_type_node = integer_type_node;
1220       uintmax_type_node = unsigned_type_node;
1221       signed_size_type_node = integer_type_node;
1222     }
1223   else if (strcmp (SIZE_TYPE, "long unsigned int") == 0)
1224     {
1225       intmax_type_node = long_integer_type_node;
1226       uintmax_type_node = long_unsigned_type_node;
1227       signed_size_type_node = long_integer_type_node;
1228     }
1229   else if (strcmp (SIZE_TYPE, "long long unsigned int") == 0)
1230     {
1231       intmax_type_node = long_long_integer_type_node;
1232       uintmax_type_node = long_long_unsigned_type_node;
1233       signed_size_type_node = long_long_integer_type_node;
1234     }
1235   else
1236     {
1237       int i;
1238
1239       signed_size_type_node = NULL_TREE;
1240       for (i = 0; i < NUM_INT_N_ENTS; i++)
1241         if (int_n_enabled_p[i])
1242           {
1243             char name[50];
1244             sprintf (name, "__int%d unsigned", int_n_data[i].bitsize);
1245
1246             if (strcmp (name, SIZE_TYPE) == 0)
1247               {
1248                 intmax_type_node = int_n_trees[i].signed_type;
1249                 uintmax_type_node = int_n_trees[i].unsigned_type;
1250                 signed_size_type_node = int_n_trees[i].signed_type;
1251               }
1252           }
1253       if (signed_size_type_node == NULL_TREE)
1254         gcc_unreachable ();
1255     }
1256
1257   wint_type_node = unsigned_type_node;
1258   pid_type_node = integer_type_node;
1259 }
1260
1261 /* Perform LTO-specific initialization.  */
1262
1263 static bool
1264 lto_init (void)
1265 {
1266   int i;
1267
1268   /* Initialize LTO-specific data structures.  */
1269   in_lto_p = true;
1270
1271   /* We need to generate LTO if running in WPA mode.  */
1272   flag_generate_lto = (flag_wpa != NULL);
1273
1274   /* Create the basic integer types.  */
1275   build_common_tree_nodes (flag_signed_char);
1276
1277   /* The global tree for the main identifier is filled in by
1278      language-specific front-end initialization that is not run in the
1279      LTO back-end.  It appears that all languages that perform such
1280      initialization currently do so in the same way, so we do it here.  */
1281   if (main_identifier_node == NULL_TREE)
1282     main_identifier_node = get_identifier ("main");
1283
1284   /* In the C++ front-end, fileptr_type_node is defined as a variant
1285      copy of ptr_type_node, rather than ptr_node itself.  The
1286      distinction should only be relevant to the front-end, so we
1287      always use the C definition here in lto1.
1288      Likewise for const struct tm*.  */
1289   for (unsigned i = 0;
1290        i < sizeof (builtin_structptr_types) / sizeof (builtin_structptr_type);
1291        ++i)
1292     {
1293       gcc_assert (builtin_structptr_types[i].node
1294                   == builtin_structptr_types[i].base);
1295       gcc_assert (TYPE_MAIN_VARIANT (builtin_structptr_types[i].node)
1296                   == builtin_structptr_types[i].base);
1297     }
1298
1299   lto_build_c_type_nodes ();
1300   gcc_assert (va_list_type_node);
1301
1302   if (TREE_CODE (va_list_type_node) == ARRAY_TYPE)
1303     {
1304       tree x = build_pointer_type (TREE_TYPE (va_list_type_node));
1305       lto_define_builtins (x, x);
1306     }
1307   else
1308     {
1309       lto_define_builtins (build_reference_type (va_list_type_node),
1310                            va_list_type_node);
1311     }
1312
1313   targetm.init_builtins ();
1314   build_common_builtin_nodes ();
1315
1316   /* Assign names to the builtin types, otherwise they'll end up
1317      as __unknown__ in debug info.
1318      ???  We simply need to stop pre-seeding the streamer cache.
1319      Below is modeled after from c-common.c:c_common_nodes_and_builtins  */
1320 #define NAME_TYPE(t,n) \
1321   if (t) \
1322     TYPE_NAME (t) = build_decl (UNKNOWN_LOCATION, TYPE_DECL, \
1323                                 get_identifier (n), t)
1324   NAME_TYPE (integer_type_node, "int");
1325   NAME_TYPE (char_type_node, "char");
1326   NAME_TYPE (long_integer_type_node, "long int");
1327   NAME_TYPE (unsigned_type_node, "unsigned int");
1328   NAME_TYPE (long_unsigned_type_node, "long unsigned int");
1329   NAME_TYPE (long_long_integer_type_node, "long long int");
1330   NAME_TYPE (long_long_unsigned_type_node, "long long unsigned int");
1331   NAME_TYPE (short_integer_type_node, "short int");
1332   NAME_TYPE (short_unsigned_type_node, "short unsigned int");
1333   if (signed_char_type_node != char_type_node)
1334     NAME_TYPE (signed_char_type_node, "signed char");
1335   if (unsigned_char_type_node != char_type_node)
1336     NAME_TYPE (unsigned_char_type_node, "unsigned char");
1337   NAME_TYPE (float_type_node, "float");
1338   NAME_TYPE (double_type_node, "double");
1339   NAME_TYPE (long_double_type_node, "long double");
1340   NAME_TYPE (void_type_node, "void");
1341   NAME_TYPE (boolean_type_node, "bool");
1342   NAME_TYPE (complex_float_type_node, "complex float");
1343   NAME_TYPE (complex_double_type_node, "complex double");
1344   NAME_TYPE (complex_long_double_type_node, "complex long double");
1345   for (i = 0; i < NUM_INT_N_ENTS; i++)
1346     if (int_n_enabled_p[i])
1347       {
1348         char name[50];
1349         sprintf (name, "__int%d", int_n_data[i].bitsize);
1350         NAME_TYPE (int_n_trees[i].signed_type, name);
1351       }
1352 #undef NAME_TYPE
1353
1354   return true;
1355 }
1356
1357 /* Initialize tree structures required by the LTO front end.  */
1358
1359 static void lto_init_ts (void)
1360 {
1361   tree_contains_struct[NAMESPACE_DECL][TS_DECL_MINIMAL] = 1;
1362 }
1363
1364 #undef LANG_HOOKS_NAME
1365 #define LANG_HOOKS_NAME "GNU GIMPLE"
1366 #undef LANG_HOOKS_OPTION_LANG_MASK
1367 #define LANG_HOOKS_OPTION_LANG_MASK lto_option_lang_mask
1368 #undef LANG_HOOKS_COMPLAIN_WRONG_LANG_P
1369 #define LANG_HOOKS_COMPLAIN_WRONG_LANG_P lto_complain_wrong_lang_p
1370 #undef LANG_HOOKS_INIT_OPTIONS_STRUCT
1371 #define LANG_HOOKS_INIT_OPTIONS_STRUCT lto_init_options_struct
1372 #undef LANG_HOOKS_HANDLE_OPTION
1373 #define LANG_HOOKS_HANDLE_OPTION lto_handle_option
1374 #undef LANG_HOOKS_POST_OPTIONS
1375 #define LANG_HOOKS_POST_OPTIONS lto_post_options
1376 #undef LANG_HOOKS_GET_ALIAS_SET
1377 #define LANG_HOOKS_GET_ALIAS_SET gimple_get_alias_set
1378 #undef LANG_HOOKS_TYPE_FOR_MODE
1379 #define LANG_HOOKS_TYPE_FOR_MODE lto_type_for_mode
1380 #undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME
1381 #define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME lto_set_decl_assembler_name
1382 #undef LANG_HOOKS_GLOBAL_BINDINGS_P
1383 #define LANG_HOOKS_GLOBAL_BINDINGS_P lto_global_bindings_p
1384 #undef LANG_HOOKS_PUSHDECL
1385 #define LANG_HOOKS_PUSHDECL lto_pushdecl
1386 #undef LANG_HOOKS_GETDECLS
1387 #define LANG_HOOKS_GETDECLS lto_getdecls
1388 #undef LANG_HOOKS_REGISTER_BUILTIN_TYPE
1389 #define LANG_HOOKS_REGISTER_BUILTIN_TYPE lto_register_builtin_type
1390 #undef LANG_HOOKS_BUILTIN_FUNCTION
1391 #define LANG_HOOKS_BUILTIN_FUNCTION lto_builtin_function
1392 #undef LANG_HOOKS_INIT
1393 #define LANG_HOOKS_INIT lto_init
1394 #undef LANG_HOOKS_PARSE_FILE
1395 #define LANG_HOOKS_PARSE_FILE lto_main
1396 #undef LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS
1397 #define LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS true
1398 #undef LANG_HOOKS_TYPES_COMPATIBLE_P
1399 #define LANG_HOOKS_TYPES_COMPATIBLE_P NULL
1400 #undef LANG_HOOKS_EH_PERSONALITY
1401 #define LANG_HOOKS_EH_PERSONALITY lto_eh_personality
1402
1403 /* Attribute hooks.  */
1404 #undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE
1405 #define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE lto_attribute_table
1406 #undef LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE
1407 #define LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE lto_format_attribute_table
1408
1409 #undef LANG_HOOKS_BEGIN_SECTION
1410 #define LANG_HOOKS_BEGIN_SECTION lto_obj_begin_section
1411 #undef LANG_HOOKS_APPEND_DATA
1412 #define LANG_HOOKS_APPEND_DATA lto_obj_append_data
1413 #undef LANG_HOOKS_END_SECTION
1414 #define LANG_HOOKS_END_SECTION lto_obj_end_section
1415
1416 #undef LANG_HOOKS_INIT_TS
1417 #define LANG_HOOKS_INIT_TS lto_init_ts
1418
1419 struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
1420
1421 /* Language hooks that are not part of lang_hooks.  */
1422
1423 tree
1424 convert (tree type ATTRIBUTE_UNUSED, tree expr ATTRIBUTE_UNUSED)
1425 {
1426   gcc_unreachable ();
1427 }
1428
1429 /* Tree walking support.  */
1430
1431 static enum lto_tree_node_structure_enum
1432 lto_tree_node_structure (union lang_tree_node *t ATTRIBUTE_UNUSED)
1433 {
1434   return TS_LTO_GENERIC;
1435 }
1436
1437 #include "gtype-lto.h"
1438 #include "gt-lto-lto-lang.h"