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