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