]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/c-family/c-attribs.c
PR tree-optimization/84725 - enable attribute nonstring for all narrow character...
[thirdparty/gcc.git] / gcc / c-family / c-attribs.c
1 /* C-family attributes handling.
2 Copyright (C) 1992-2018 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "target.h"
24 #include "function.h"
25 #include "tree.h"
26 #include "memmodel.h"
27 #include "c-common.h"
28 #include "gimple-expr.h"
29 #include "tm_p.h"
30 #include "stringpool.h"
31 #include "cgraph.h"
32 #include "diagnostic.h"
33 #include "intl.h"
34 #include "stor-layout.h"
35 #include "calls.h"
36 #include "attribs.h"
37 #include "varasm.h"
38 #include "trans-mem.h"
39 #include "c-objc.h"
40 #include "common/common-target.h"
41 #include "langhooks.h"
42 #include "tree-inline.h"
43 #include "toplev.h"
44 #include "tree-iterator.h"
45 #include "opts.h"
46 #include "gimplify.h"
47
48 static tree handle_packed_attribute (tree *, tree, tree, int, bool *);
49 static tree handle_nocommon_attribute (tree *, tree, tree, int, bool *);
50 static tree handle_common_attribute (tree *, tree, tree, int, bool *);
51 static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *);
52 static tree handle_hot_attribute (tree *, tree, tree, int, bool *);
53 static tree handle_cold_attribute (tree *, tree, tree, int, bool *);
54 static tree handle_no_sanitize_attribute (tree *, tree, tree, int, bool *);
55 static tree handle_no_sanitize_address_attribute (tree *, tree, tree,
56 int, bool *);
57 static tree handle_no_sanitize_thread_attribute (tree *, tree, tree,
58 int, bool *);
59 static tree handle_no_address_safety_analysis_attribute (tree *, tree, tree,
60 int, bool *);
61 static tree handle_no_sanitize_undefined_attribute (tree *, tree, tree, int,
62 bool *);
63 static tree handle_asan_odr_indicator_attribute (tree *, tree, tree, int,
64 bool *);
65 static tree handle_stack_protect_attribute (tree *, tree, tree, int, bool *);
66 static tree handle_noinline_attribute (tree *, tree, tree, int, bool *);
67 static tree handle_noclone_attribute (tree *, tree, tree, int, bool *);
68 static tree handle_nocf_check_attribute (tree *, tree, tree, int, bool *);
69 static tree handle_noicf_attribute (tree *, tree, tree, int, bool *);
70 static tree handle_noipa_attribute (tree *, tree, tree, int, bool *);
71 static tree handle_leaf_attribute (tree *, tree, tree, int, bool *);
72 static tree handle_always_inline_attribute (tree *, tree, tree, int,
73 bool *);
74 static tree handle_gnu_inline_attribute (tree *, tree, tree, int, bool *);
75 static tree handle_artificial_attribute (tree *, tree, tree, int, bool *);
76 static tree handle_flatten_attribute (tree *, tree, tree, int, bool *);
77 static tree handle_error_attribute (tree *, tree, tree, int, bool *);
78 static tree handle_used_attribute (tree *, tree, tree, int, bool *);
79 static tree handle_externally_visible_attribute (tree *, tree, tree, int,
80 bool *);
81 static tree handle_no_reorder_attribute (tree *, tree, tree, int,
82 bool *);
83 static tree handle_const_attribute (tree *, tree, tree, int, bool *);
84 static tree handle_transparent_union_attribute (tree *, tree, tree,
85 int, bool *);
86 static tree handle_scalar_storage_order_attribute (tree *, tree, tree,
87 int, bool *);
88 static tree handle_constructor_attribute (tree *, tree, tree, int, bool *);
89 static tree handle_destructor_attribute (tree *, tree, tree, int, bool *);
90 static tree handle_mode_attribute (tree *, tree, tree, int, bool *);
91 static tree handle_section_attribute (tree *, tree, tree, int, bool *);
92 static tree handle_aligned_attribute (tree *, tree, tree, int, bool *);
93 static tree handle_warn_if_not_aligned_attribute (tree *, tree, tree,
94 int, bool *);
95 static tree handle_weak_attribute (tree *, tree, tree, int, bool *) ;
96 static tree handle_noplt_attribute (tree *, tree, tree, int, bool *) ;
97 static tree handle_alias_ifunc_attribute (bool, tree *, tree, tree, bool *);
98 static tree handle_ifunc_attribute (tree *, tree, tree, int, bool *);
99 static tree handle_alias_attribute (tree *, tree, tree, int, bool *);
100 static tree handle_weakref_attribute (tree *, tree, tree, int, bool *) ;
101 static tree handle_visibility_attribute (tree *, tree, tree, int,
102 bool *);
103 static tree handle_tls_model_attribute (tree *, tree, tree, int,
104 bool *);
105 static tree handle_no_instrument_function_attribute (tree *, tree,
106 tree, int, bool *);
107 static tree handle_no_profile_instrument_function_attribute (tree *, tree,
108 tree, int, bool *);
109 static tree handle_malloc_attribute (tree *, tree, tree, int, bool *);
110 static tree handle_returns_twice_attribute (tree *, tree, tree, int, bool *);
111 static tree handle_no_limit_stack_attribute (tree *, tree, tree, int,
112 bool *);
113 static tree handle_pure_attribute (tree *, tree, tree, int, bool *);
114 static tree handle_tm_attribute (tree *, tree, tree, int, bool *);
115 static tree handle_tm_wrap_attribute (tree *, tree, tree, int, bool *);
116 static tree handle_novops_attribute (tree *, tree, tree, int, bool *);
117 static tree handle_deprecated_attribute (tree *, tree, tree, int,
118 bool *);
119 static tree handle_vector_size_attribute (tree *, tree, tree, int,
120 bool *);
121 static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
122 static tree handle_nonstring_attribute (tree *, tree, tree, int, bool *);
123 static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
124 static tree handle_cleanup_attribute (tree *, tree, tree, int, bool *);
125 static tree handle_warn_unused_result_attribute (tree *, tree, tree, int,
126 bool *);
127 static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *);
128 static tree handle_type_generic_attribute (tree *, tree, tree, int, bool *);
129 static tree handle_alloc_size_attribute (tree *, tree, tree, int, bool *);
130 static tree handle_alloc_align_attribute (tree *, tree, tree, int, bool *);
131 static tree handle_assume_aligned_attribute (tree *, tree, tree, int, bool *);
132 static tree handle_target_attribute (tree *, tree, tree, int, bool *);
133 static tree handle_target_clones_attribute (tree *, tree, tree, int, bool *);
134 static tree handle_optimize_attribute (tree *, tree, tree, int, bool *);
135 static tree ignore_attribute (tree *, tree, tree, int, bool *);
136 static tree handle_no_split_stack_attribute (tree *, tree, tree, int, bool *);
137 static tree handle_fnspec_attribute (tree *, tree, tree, int, bool *);
138 static tree handle_warn_unused_attribute (tree *, tree, tree, int, bool *);
139 static tree handle_returns_nonnull_attribute (tree *, tree, tree, int, bool *);
140 static tree handle_omp_declare_simd_attribute (tree *, tree, tree, int,
141 bool *);
142 static tree handle_simd_attribute (tree *, tree, tree, int, bool *);
143 static tree handle_omp_declare_target_attribute (tree *, tree, tree, int,
144 bool *);
145 static tree handle_designated_init_attribute (tree *, tree, tree, int, bool *);
146 static tree handle_bnd_variable_size_attribute (tree *, tree, tree, int, bool *);
147 static tree handle_bnd_legacy (tree *, tree, tree, int, bool *);
148 static tree handle_bnd_instrument (tree *, tree, tree, int, bool *);
149 static tree handle_fallthrough_attribute (tree *, tree, tree, int, bool *);
150 static tree handle_patchable_function_entry_attribute (tree *, tree, tree,
151 int, bool *);
152
153 /* Helper to define attribute exclusions. */
154 #define ATTR_EXCL(name, function, type, variable) \
155 { name, function, type, variable }
156
157 /* Define attributes that are mutually exclusive with one another. */
158 static const struct attribute_spec::exclusions attr_aligned_exclusions[] =
159 {
160 /* Attribute name exclusion applies to:
161 function, type, variable */
162 ATTR_EXCL ("aligned", true, false, false),
163 ATTR_EXCL ("packed", true, false, false),
164 ATTR_EXCL (NULL, false, false, false)
165 };
166
167 static const struct attribute_spec::exclusions attr_cold_hot_exclusions[] =
168 {
169 ATTR_EXCL ("cold", true, true, true),
170 ATTR_EXCL ("hot", true, true, true),
171 ATTR_EXCL (NULL, false, false, false)
172 };
173
174 static const struct attribute_spec::exclusions attr_common_exclusions[] =
175 {
176 ATTR_EXCL ("common", true, true, true),
177 ATTR_EXCL ("nocommon", true, true, true),
178 ATTR_EXCL (NULL, false, false, false),
179 };
180
181 static const struct attribute_spec::exclusions attr_inline_exclusions[] =
182 {
183 ATTR_EXCL ("noinline", true, true, true),
184 ATTR_EXCL (NULL, false, false, false),
185 };
186
187 static const struct attribute_spec::exclusions attr_noinline_exclusions[] =
188 {
189 ATTR_EXCL ("always_inline", true, true, true),
190 ATTR_EXCL ("gnu_inline", true, true, true),
191 ATTR_EXCL (NULL, false, false, false),
192 };
193
194 static const struct attribute_spec::exclusions attr_noreturn_exclusions[] =
195 {
196 ATTR_EXCL ("alloc_align", true, true, true),
197 ATTR_EXCL ("alloc_size", true, true, true),
198 ATTR_EXCL ("const", true, true, true),
199 ATTR_EXCL ("malloc", true, true, true),
200 ATTR_EXCL ("pure", true, true, true),
201 ATTR_EXCL ("returns_twice", true, true, true),
202 ATTR_EXCL ("warn_unused_result", true, true, true),
203 ATTR_EXCL (NULL, false, false, false),
204 };
205
206 static const struct attribute_spec::exclusions
207 attr_warn_unused_result_exclusions[] =
208 {
209 ATTR_EXCL ("noreturn", true, true, true),
210 ATTR_EXCL ("warn_unused_result", true, true, true),
211 ATTR_EXCL (NULL, false, false, false),
212 };
213
214 static const struct attribute_spec::exclusions attr_returns_twice_exclusions[] =
215 {
216 ATTR_EXCL ("noreturn", true, true, true),
217 ATTR_EXCL (NULL, false, false, false),
218 };
219
220 /* Exclusions that apply to attribute alloc_align, alloc_size, and malloc. */
221 static const struct attribute_spec::exclusions attr_alloc_exclusions[] =
222 {
223 ATTR_EXCL ("const", true, true, true),
224 ATTR_EXCL ("noreturn", true, true, true),
225 ATTR_EXCL ("pure", true, true, true),
226 ATTR_EXCL (NULL, false, false, false),
227 };
228
229 static const struct attribute_spec::exclusions attr_const_pure_exclusions[] =
230 {
231 ATTR_EXCL ("const", true, true, true),
232 ATTR_EXCL ("alloc_align", true, true, true),
233 ATTR_EXCL ("alloc_size", true, true, true),
234 ATTR_EXCL ("malloc", true, true, true),
235 ATTR_EXCL ("noreturn", true, true, true),
236 ATTR_EXCL ("pure", true, true, true),
237 ATTR_EXCL (NULL, false, false, false)
238 };
239
240 /* Table of machine-independent attributes common to all C-like languages.
241
242 All attributes referencing arguments should be additionally processed
243 in chkp_copy_function_type_adding_bounds for correct instrumentation
244 by Pointer Bounds Checker.
245 Current list of processed common attributes: nonnull. */
246 const struct attribute_spec c_common_attribute_table[] =
247 {
248 /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
249 affects_type_identity, handler, exclude } */
250 { "packed", 0, 0, false, false, false, false,
251 handle_packed_attribute,
252 attr_aligned_exclusions },
253 { "nocommon", 0, 0, true, false, false, false,
254 handle_nocommon_attribute,
255 attr_common_exclusions },
256 { "common", 0, 0, true, false, false, false,
257 handle_common_attribute,
258 attr_common_exclusions },
259 /* FIXME: logically, noreturn attributes should be listed as
260 "false, true, true" and apply to function types. But implementing this
261 would require all the places in the compiler that use TREE_THIS_VOLATILE
262 on a decl to identify non-returning functions to be located and fixed
263 to check the function type instead. */
264 { "noreturn", 0, 0, true, false, false, false,
265 handle_noreturn_attribute,
266 attr_noreturn_exclusions },
267 { "volatile", 0, 0, true, false, false, false,
268 handle_noreturn_attribute, NULL },
269 { "stack_protect", 0, 0, true, false, false, false,
270 handle_stack_protect_attribute, NULL },
271 { "noinline", 0, 0, true, false, false, false,
272 handle_noinline_attribute,
273 attr_noinline_exclusions },
274 { "noclone", 0, 0, true, false, false, false,
275 handle_noclone_attribute, NULL },
276 { "no_icf", 0, 0, true, false, false, false,
277 handle_noicf_attribute, NULL },
278 { "noipa", 0, 0, true, false, false, false,
279 handle_noipa_attribute, NULL },
280 { "leaf", 0, 0, true, false, false, false,
281 handle_leaf_attribute, NULL },
282 { "always_inline", 0, 0, true, false, false, false,
283 handle_always_inline_attribute,
284 attr_inline_exclusions },
285 { "gnu_inline", 0, 0, true, false, false, false,
286 handle_gnu_inline_attribute,
287 attr_inline_exclusions },
288 { "artificial", 0, 0, true, false, false, false,
289 handle_artificial_attribute, NULL },
290 { "flatten", 0, 0, true, false, false, false,
291 handle_flatten_attribute, NULL },
292 { "used", 0, 0, true, false, false, false,
293 handle_used_attribute, NULL },
294 { "unused", 0, 0, false, false, false, false,
295 handle_unused_attribute, NULL },
296 { "externally_visible", 0, 0, true, false, false, false,
297 handle_externally_visible_attribute, NULL },
298 { "no_reorder", 0, 0, true, false, false, false,
299 handle_no_reorder_attribute, NULL },
300 /* The same comments as for noreturn attributes apply to const ones. */
301 { "const", 0, 0, true, false, false, false,
302 handle_const_attribute,
303 attr_const_pure_exclusions },
304 { "scalar_storage_order", 1, 1, false, false, false, false,
305 handle_scalar_storage_order_attribute, NULL },
306 { "transparent_union", 0, 0, false, false, false, false,
307 handle_transparent_union_attribute, NULL },
308 { "constructor", 0, 1, true, false, false, false,
309 handle_constructor_attribute, NULL },
310 { "destructor", 0, 1, true, false, false, false,
311 handle_destructor_attribute, NULL },
312 { "mode", 1, 1, false, true, false, false,
313 handle_mode_attribute, NULL },
314 { "section", 1, 1, true, false, false, false,
315 handle_section_attribute, NULL },
316 { "aligned", 0, 1, false, false, false, false,
317 handle_aligned_attribute,
318 attr_aligned_exclusions },
319 { "warn_if_not_aligned", 0, 1, false, false, false, false,
320 handle_warn_if_not_aligned_attribute, NULL },
321 { "weak", 0, 0, true, false, false, false,
322 handle_weak_attribute, NULL },
323 { "noplt", 0, 0, true, false, false, false,
324 handle_noplt_attribute, NULL },
325 { "ifunc", 1, 1, true, false, false, false,
326 handle_ifunc_attribute, NULL },
327 { "alias", 1, 1, true, false, false, false,
328 handle_alias_attribute, NULL },
329 { "weakref", 0, 1, true, false, false, false,
330 handle_weakref_attribute, NULL },
331 { "no_instrument_function", 0, 0, true, false, false, false,
332 handle_no_instrument_function_attribute,
333 NULL },
334 { "no_profile_instrument_function", 0, 0, true, false, false, false,
335 handle_no_profile_instrument_function_attribute,
336 NULL },
337 { "malloc", 0, 0, true, false, false, false,
338 handle_malloc_attribute, attr_alloc_exclusions },
339 { "returns_twice", 0, 0, true, false, false, false,
340 handle_returns_twice_attribute,
341 attr_returns_twice_exclusions },
342 { "no_stack_limit", 0, 0, true, false, false, false,
343 handle_no_limit_stack_attribute, NULL },
344 { "pure", 0, 0, true, false, false, false,
345 handle_pure_attribute,
346 attr_const_pure_exclusions },
347 { "transaction_callable", 0, 0, false, true, false, false,
348 handle_tm_attribute, NULL },
349 { "transaction_unsafe", 0, 0, false, true, false, true,
350 handle_tm_attribute, NULL },
351 { "transaction_safe", 0, 0, false, true, false, true,
352 handle_tm_attribute, NULL },
353 { "transaction_safe_dynamic", 0, 0, true, false, false, false,
354 handle_tm_attribute, NULL },
355 { "transaction_may_cancel_outer", 0, 0, false, true, false, false,
356 handle_tm_attribute, NULL },
357 /* ??? These two attributes didn't make the transition from the
358 Intel language document to the multi-vendor language document. */
359 { "transaction_pure", 0, 0, false, true, false, false,
360 handle_tm_attribute, NULL },
361 { "transaction_wrap", 1, 1, true, false, false, false,
362 handle_tm_wrap_attribute, NULL },
363 /* For internal use (marking of builtins) only. The name contains space
364 to prevent its usage in source code. */
365 { "no vops", 0, 0, true, false, false, false,
366 handle_novops_attribute, NULL },
367 { "deprecated", 0, 1, false, false, false, false,
368 handle_deprecated_attribute, NULL },
369 { "vector_size", 1, 1, false, true, false, true,
370 handle_vector_size_attribute, NULL },
371 { "visibility", 1, 1, false, false, false, false,
372 handle_visibility_attribute, NULL },
373 { "tls_model", 1, 1, true, false, false, false,
374 handle_tls_model_attribute, NULL },
375 { "nonnull", 0, -1, false, true, true, false,
376 handle_nonnull_attribute, NULL },
377 { "nonstring", 0, 0, true, false, false, false,
378 handle_nonstring_attribute, NULL },
379 { "nothrow", 0, 0, true, false, false, false,
380 handle_nothrow_attribute, NULL },
381 { "may_alias", 0, 0, false, true, false, false, NULL, NULL },
382 { "cleanup", 1, 1, true, false, false, false,
383 handle_cleanup_attribute, NULL },
384 { "warn_unused_result", 0, 0, false, true, true, false,
385 handle_warn_unused_result_attribute,
386 attr_warn_unused_result_exclusions },
387 { "sentinel", 0, 1, false, true, true, false,
388 handle_sentinel_attribute, NULL },
389 /* For internal use (marking of builtins) only. The name contains space
390 to prevent its usage in source code. */
391 { "type generic", 0, 0, false, true, true, false,
392 handle_type_generic_attribute, NULL },
393 { "alloc_size", 1, 2, false, true, true, false,
394 handle_alloc_size_attribute,
395 attr_alloc_exclusions },
396 { "cold", 0, 0, true, false, false, false,
397 handle_cold_attribute,
398 attr_cold_hot_exclusions },
399 { "hot", 0, 0, true, false, false, false,
400 handle_hot_attribute,
401 attr_cold_hot_exclusions },
402 { "no_address_safety_analysis",
403 0, 0, true, false, false, false,
404 handle_no_address_safety_analysis_attribute,
405 NULL },
406 { "no_sanitize", 1, 1, true, false, false, false,
407 handle_no_sanitize_attribute, NULL },
408 { "no_sanitize_address", 0, 0, true, false, false, false,
409 handle_no_sanitize_address_attribute, NULL },
410 { "no_sanitize_thread", 0, 0, true, false, false, false,
411 handle_no_sanitize_thread_attribute, NULL },
412 { "no_sanitize_undefined", 0, 0, true, false, false, false,
413 handle_no_sanitize_undefined_attribute, NULL },
414 { "asan odr indicator", 0, 0, true, false, false, false,
415 handle_asan_odr_indicator_attribute, NULL },
416 { "warning", 1, 1, true, false, false, false,
417 handle_error_attribute, NULL },
418 { "error", 1, 1, true, false, false, false,
419 handle_error_attribute, NULL },
420 { "target", 1, -1, true, false, false, false,
421 handle_target_attribute, NULL },
422 { "target_clones", 1, -1, true, false, false, false,
423 handle_target_clones_attribute, NULL },
424 { "optimize", 1, -1, true, false, false, false,
425 handle_optimize_attribute, NULL },
426 /* For internal use only. The leading '*' both prevents its usage in
427 source code and signals that it may be overridden by machine tables. */
428 { "*tm regparm", 0, 0, false, true, true, false,
429 ignore_attribute, NULL },
430 { "no_split_stack", 0, 0, true, false, false, false,
431 handle_no_split_stack_attribute, NULL },
432 /* For internal use (marking of builtins and runtime functions) only.
433 The name contains space to prevent its usage in source code. */
434 { "fn spec", 1, 1, false, true, true, false,
435 handle_fnspec_attribute, NULL },
436 { "warn_unused", 0, 0, false, false, false, false,
437 handle_warn_unused_attribute, NULL },
438 { "returns_nonnull", 0, 0, false, true, true, false,
439 handle_returns_nonnull_attribute, NULL },
440 { "omp declare simd", 0, -1, true, false, false, false,
441 handle_omp_declare_simd_attribute, NULL },
442 { "simd", 0, 1, true, false, false, false,
443 handle_simd_attribute, NULL },
444 { "omp declare target", 0, 0, true, false, false, false,
445 handle_omp_declare_target_attribute, NULL },
446 { "omp declare target link", 0, 0, true, false, false, false,
447 handle_omp_declare_target_attribute, NULL },
448 { "alloc_align", 1, 1, false, true, true, false,
449 handle_alloc_align_attribute,
450 attr_alloc_exclusions },
451 { "assume_aligned", 1, 2, false, true, true, false,
452 handle_assume_aligned_attribute, NULL },
453 { "designated_init", 0, 0, false, true, false, false,
454 handle_designated_init_attribute, NULL },
455 { "bnd_variable_size", 0, 0, true, false, false, false,
456 handle_bnd_variable_size_attribute, NULL },
457 { "bnd_legacy", 0, 0, true, false, false, false,
458 handle_bnd_legacy, NULL },
459 { "bnd_instrument", 0, 0, true, false, false, false,
460 handle_bnd_instrument, NULL },
461 { "fallthrough", 0, 0, false, false, false, false,
462 handle_fallthrough_attribute, NULL },
463 { "patchable_function_entry", 1, 2, true, false, false, false,
464 handle_patchable_function_entry_attribute,
465 NULL },
466 { "nocf_check", 0, 0, false, true, true, true,
467 handle_nocf_check_attribute, NULL },
468 { NULL, 0, 0, false, false, false, false, NULL, NULL }
469 };
470
471 /* Give the specifications for the format attributes, used by C and all
472 descendants.
473
474 All attributes referencing arguments should be additionally processed
475 in chkp_copy_function_type_adding_bounds for correct instrumentation
476 by Pointer Bounds Checker.
477 Current list of processed format attributes: format, format_arg. */
478 const struct attribute_spec c_common_format_attribute_table[] =
479 {
480 /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
481 affects_type_identity, handler, exclude } */
482 { "format", 3, 3, false, true, true, false,
483 handle_format_attribute, NULL },
484 { "format_arg", 1, 1, false, true, true, false,
485 handle_format_arg_attribute, NULL },
486 { NULL, 0, 0, false, false, false, false, NULL, NULL }
487 };
488
489 /* Returns TRUE iff the attribute indicated by ATTR_ID takes a plain
490 identifier as an argument, so the front end shouldn't look it up. */
491
492 bool
493 attribute_takes_identifier_p (const_tree attr_id)
494 {
495 const struct attribute_spec *spec = lookup_attribute_spec (attr_id);
496 if (spec == NULL)
497 /* Unknown attribute that we'll end up ignoring, return true so we
498 don't complain about an identifier argument. */
499 return true;
500 else if (!strcmp ("mode", spec->name)
501 || !strcmp ("format", spec->name)
502 || !strcmp ("cleanup", spec->name))
503 return true;
504 else
505 return targetm.attribute_takes_identifier_p (attr_id);
506 }
507
508 /* Attribute handlers common to C front ends. */
509
510 /* Handle a "packed" attribute; arguments as in
511 struct attribute_spec.handler. */
512
513 static tree
514 handle_packed_attribute (tree *node, tree name, tree ARG_UNUSED (args),
515 int flags, bool *no_add_attrs)
516 {
517 if (TYPE_P (*node))
518 {
519 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
520 *node = build_variant_type_copy (*node);
521 TYPE_PACKED (*node) = 1;
522 }
523 else if (TREE_CODE (*node) == FIELD_DECL)
524 {
525 if (TYPE_ALIGN (TREE_TYPE (*node)) <= BITS_PER_UNIT
526 /* Still pack bitfields. */
527 && ! DECL_C_BIT_FIELD (*node))
528 warning (OPT_Wattributes,
529 "%qE attribute ignored for field of type %qT",
530 name, TREE_TYPE (*node));
531 else
532 DECL_PACKED (*node) = 1;
533 }
534 /* We can't set DECL_PACKED for a VAR_DECL, because the bit is
535 used for DECL_REGISTER. It wouldn't mean anything anyway.
536 We can't set DECL_PACKED on the type of a TYPE_DECL, because
537 that changes what the typedef is typing. */
538 else
539 {
540 warning (OPT_Wattributes, "%qE attribute ignored", name);
541 *no_add_attrs = true;
542 }
543
544 return NULL_TREE;
545 }
546
547 /* Handle a "nocommon" attribute; arguments as in
548 struct attribute_spec.handler. */
549
550 static tree
551 handle_nocommon_attribute (tree *node, tree name,
552 tree ARG_UNUSED (args),
553 int ARG_UNUSED (flags), bool *no_add_attrs)
554 {
555 if (VAR_P (*node))
556 DECL_COMMON (*node) = 0;
557 else
558 {
559 warning (OPT_Wattributes, "%qE attribute ignored", name);
560 *no_add_attrs = true;
561 }
562
563 return NULL_TREE;
564 }
565
566 /* Handle a "common" attribute; arguments as in
567 struct attribute_spec.handler. */
568
569 static tree
570 handle_common_attribute (tree *node, tree name, tree ARG_UNUSED (args),
571 int ARG_UNUSED (flags), bool *no_add_attrs)
572 {
573 if (VAR_P (*node))
574 DECL_COMMON (*node) = 1;
575 else
576 {
577 warning (OPT_Wattributes, "%qE attribute ignored", name);
578 *no_add_attrs = true;
579 }
580
581 return NULL_TREE;
582 }
583
584 /* Handle a "noreturn" attribute; arguments as in
585 struct attribute_spec.handler. */
586
587 static tree
588 handle_noreturn_attribute (tree *node, tree name, tree ARG_UNUSED (args),
589 int ARG_UNUSED (flags), bool *no_add_attrs)
590 {
591 tree type = TREE_TYPE (*node);
592
593 /* See FIXME comment in c_common_attribute_table. */
594 if (TREE_CODE (*node) == FUNCTION_DECL
595 || objc_method_decl (TREE_CODE (*node)))
596 TREE_THIS_VOLATILE (*node) = 1;
597 else if (TREE_CODE (type) == POINTER_TYPE
598 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
599 TREE_TYPE (*node)
600 = (build_qualified_type
601 (build_pointer_type
602 (build_type_variant (TREE_TYPE (type),
603 TYPE_READONLY (TREE_TYPE (type)), 1)),
604 TYPE_QUALS (type)));
605 else
606 {
607 warning (OPT_Wattributes, "%qE attribute ignored", name);
608 *no_add_attrs = true;
609 }
610
611 return NULL_TREE;
612 }
613
614 /* Handle a "hot" and attribute; arguments as in
615 struct attribute_spec.handler. */
616
617 static tree
618 handle_hot_attribute (tree *node, tree name, tree ARG_UNUSED (args),
619 int ARG_UNUSED (flags), bool *no_add_attrs)
620 {
621 if (TREE_CODE (*node) == FUNCTION_DECL
622 || TREE_CODE (*node) == LABEL_DECL)
623 {
624 /* Attribute hot processing is done later with lookup_attribute. */
625 }
626 else
627 {
628 warning (OPT_Wattributes, "%qE attribute ignored", name);
629 *no_add_attrs = true;
630 }
631
632 return NULL_TREE;
633 }
634
635 /* Handle a "cold" and attribute; arguments as in
636 struct attribute_spec.handler. */
637
638 static tree
639 handle_cold_attribute (tree *node, tree name, tree ARG_UNUSED (args),
640 int ARG_UNUSED (flags), bool *no_add_attrs)
641 {
642 if (TREE_CODE (*node) == FUNCTION_DECL
643 || TREE_CODE (*node) == LABEL_DECL)
644 {
645 /* Attribute cold processing is done later with lookup_attribute. */
646 }
647 else
648 {
649 warning (OPT_Wattributes, "%qE attribute ignored", name);
650 *no_add_attrs = true;
651 }
652
653 return NULL_TREE;
654 }
655
656 /* Add FLAGS for a function NODE to no_sanitize_flags in DECL_ATTRIBUTES. */
657
658 void
659 add_no_sanitize_value (tree node, unsigned int flags)
660 {
661 tree attr = lookup_attribute ("no_sanitize", DECL_ATTRIBUTES (node));
662 if (attr)
663 {
664 unsigned int old_value = tree_to_uhwi (TREE_VALUE (attr));
665 flags |= old_value;
666
667 if (flags == old_value)
668 return;
669
670 TREE_VALUE (attr) = build_int_cst (unsigned_type_node, flags);
671 }
672 else
673 DECL_ATTRIBUTES (node)
674 = tree_cons (get_identifier ("no_sanitize"),
675 build_int_cst (unsigned_type_node, flags),
676 DECL_ATTRIBUTES (node));
677 }
678
679 /* Handle a "no_sanitize" attribute; arguments as in
680 struct attribute_spec.handler. */
681
682 static tree
683 handle_no_sanitize_attribute (tree *node, tree name, tree args, int,
684 bool *no_add_attrs)
685 {
686 *no_add_attrs = true;
687 tree id = TREE_VALUE (args);
688 if (TREE_CODE (*node) != FUNCTION_DECL)
689 {
690 warning (OPT_Wattributes, "%qE attribute ignored", name);
691 return NULL_TREE;
692 }
693
694 if (TREE_CODE (id) != STRING_CST)
695 {
696 error ("no_sanitize argument not a string");
697 return NULL_TREE;
698 }
699
700 char *string = ASTRDUP (TREE_STRING_POINTER (id));
701 unsigned int flags = parse_no_sanitize_attribute (string);
702
703 add_no_sanitize_value (*node, flags);
704
705 return NULL_TREE;
706 }
707
708 /* Handle a "no_sanitize_address" attribute; arguments as in
709 struct attribute_spec.handler. */
710
711 static tree
712 handle_no_sanitize_address_attribute (tree *node, tree name, tree, int,
713 bool *no_add_attrs)
714 {
715 *no_add_attrs = true;
716 if (TREE_CODE (*node) != FUNCTION_DECL)
717 warning (OPT_Wattributes, "%qE attribute ignored", name);
718 else
719 add_no_sanitize_value (*node, SANITIZE_ADDRESS);
720
721 return NULL_TREE;
722 }
723
724 /* Handle a "no_sanitize_thread" attribute; arguments as in
725 struct attribute_spec.handler. */
726
727 static tree
728 handle_no_sanitize_thread_attribute (tree *node, tree name, tree, int,
729 bool *no_add_attrs)
730 {
731 *no_add_attrs = true;
732 if (TREE_CODE (*node) != FUNCTION_DECL)
733 warning (OPT_Wattributes, "%qE attribute ignored", name);
734 else
735 add_no_sanitize_value (*node, SANITIZE_THREAD);
736
737 return NULL_TREE;
738 }
739
740
741 /* Handle a "no_address_safety_analysis" attribute; arguments as in
742 struct attribute_spec.handler. */
743
744 static tree
745 handle_no_address_safety_analysis_attribute (tree *node, tree name, tree, int,
746 bool *no_add_attrs)
747 {
748 *no_add_attrs = true;
749 if (TREE_CODE (*node) != FUNCTION_DECL)
750 warning (OPT_Wattributes, "%qE attribute ignored", name);
751 else
752 add_no_sanitize_value (*node, SANITIZE_ADDRESS);
753
754 return NULL_TREE;
755 }
756
757 /* Handle a "no_sanitize_undefined" attribute; arguments as in
758 struct attribute_spec.handler. */
759
760 static tree
761 handle_no_sanitize_undefined_attribute (tree *node, tree name, tree, int,
762 bool *no_add_attrs)
763 {
764 *no_add_attrs = true;
765 if (TREE_CODE (*node) != FUNCTION_DECL)
766 warning (OPT_Wattributes, "%qE attribute ignored", name);
767 else
768 add_no_sanitize_value (*node,
769 SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT);
770
771 return NULL_TREE;
772 }
773
774 /* Handle an "asan odr indicator" attribute; arguments as in
775 struct attribute_spec.handler. */
776
777 static tree
778 handle_asan_odr_indicator_attribute (tree *, tree, tree, int, bool *)
779 {
780 return NULL_TREE;
781 }
782
783 /* Handle a "stack_protect" attribute; arguments as in
784 struct attribute_spec.handler. */
785
786 static tree
787 handle_stack_protect_attribute (tree *node, tree name, tree, int,
788 bool *no_add_attrs)
789 {
790 if (TREE_CODE (*node) != FUNCTION_DECL)
791 {
792 warning (OPT_Wattributes, "%qE attribute ignored", name);
793 *no_add_attrs = true;
794 }
795
796 return NULL_TREE;
797 }
798
799 /* Handle a "noipa" attribute; arguments as in
800 struct attribute_spec.handler. */
801
802 static tree
803 handle_noipa_attribute (tree *node, tree name, tree, int, bool *no_add_attrs)
804 {
805 if (TREE_CODE (*node) != FUNCTION_DECL)
806 {
807 warning (OPT_Wattributes, "%qE attribute ignored", name);
808 *no_add_attrs = true;
809 }
810
811 return NULL_TREE;
812 }
813
814 /* Handle a "noinline" attribute; arguments as in
815 struct attribute_spec.handler. */
816
817 static tree
818 handle_noinline_attribute (tree *node, tree name,
819 tree ARG_UNUSED (args),
820 int ARG_UNUSED (flags), bool *no_add_attrs)
821 {
822 if (TREE_CODE (*node) == FUNCTION_DECL)
823 {
824 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
825 {
826 warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
827 "with attribute %qs", name, "always_inline");
828 *no_add_attrs = true;
829 }
830 else
831 DECL_UNINLINABLE (*node) = 1;
832 }
833 else
834 {
835 warning (OPT_Wattributes, "%qE attribute ignored", name);
836 *no_add_attrs = true;
837 }
838
839 return NULL_TREE;
840 }
841
842 /* Handle a "noclone" attribute; arguments as in
843 struct attribute_spec.handler. */
844
845 static tree
846 handle_noclone_attribute (tree *node, tree name,
847 tree ARG_UNUSED (args),
848 int ARG_UNUSED (flags), bool *no_add_attrs)
849 {
850 if (TREE_CODE (*node) != FUNCTION_DECL)
851 {
852 warning (OPT_Wattributes, "%qE attribute ignored", name);
853 *no_add_attrs = true;
854 }
855
856 return NULL_TREE;
857 }
858
859 /* Handle a "nocf_check" attribute; arguments as in
860 struct attribute_spec.handler. */
861
862 static tree
863 handle_nocf_check_attribute (tree *node, tree name,
864 tree ARG_UNUSED (args),
865 int ARG_UNUSED (flags), bool *no_add_attrs)
866 {
867 if (TREE_CODE (*node) != FUNCTION_TYPE
868 && TREE_CODE (*node) != METHOD_TYPE)
869 {
870 warning (OPT_Wattributes, "%qE attribute ignored", name);
871 *no_add_attrs = true;
872 }
873 else if (!(flag_cf_protection & CF_BRANCH))
874 {
875 warning (OPT_Wattributes, "%qE attribute ignored. Use "
876 "-fcf-protection option to enable it", name);
877 *no_add_attrs = true;
878 }
879
880 return NULL_TREE;
881 }
882
883 /* Handle a "no_icf" attribute; arguments as in
884 struct attribute_spec.handler. */
885
886 static tree
887 handle_noicf_attribute (tree *node, tree name,
888 tree ARG_UNUSED (args),
889 int ARG_UNUSED (flags), bool *no_add_attrs)
890 {
891 if (TREE_CODE (*node) != FUNCTION_DECL)
892 {
893 warning (OPT_Wattributes, "%qE attribute ignored", name);
894 *no_add_attrs = true;
895 }
896
897 return NULL_TREE;
898 }
899
900
901 /* Handle a "always_inline" attribute; arguments as in
902 struct attribute_spec.handler. */
903
904 static tree
905 handle_always_inline_attribute (tree *node, tree name,
906 tree ARG_UNUSED (args),
907 int ARG_UNUSED (flags),
908 bool *no_add_attrs)
909 {
910 if (TREE_CODE (*node) == FUNCTION_DECL)
911 {
912 if (lookup_attribute ("noinline", DECL_ATTRIBUTES (*node)))
913 {
914 warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
915 "with %qs attribute", name, "noinline");
916 *no_add_attrs = true;
917 }
918 else if (lookup_attribute ("target_clones", DECL_ATTRIBUTES (*node)))
919 {
920 warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
921 "with %qs attribute", name, "target_clones");
922 *no_add_attrs = true;
923 }
924 else
925 /* Set the attribute and mark it for disregarding inline
926 limits. */
927 DECL_DISREGARD_INLINE_LIMITS (*node) = 1;
928 }
929 else
930 {
931 warning (OPT_Wattributes, "%qE attribute ignored", name);
932 *no_add_attrs = true;
933 }
934
935 return NULL_TREE;
936 }
937
938 /* Handle a "gnu_inline" attribute; arguments as in
939 struct attribute_spec.handler. */
940
941 static tree
942 handle_gnu_inline_attribute (tree *node, tree name,
943 tree ARG_UNUSED (args),
944 int ARG_UNUSED (flags),
945 bool *no_add_attrs)
946 {
947 if (TREE_CODE (*node) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (*node))
948 {
949 /* Do nothing else, just set the attribute. We'll get at
950 it later with lookup_attribute. */
951 }
952 else
953 {
954 warning (OPT_Wattributes, "%qE attribute ignored", name);
955 *no_add_attrs = true;
956 }
957
958 return NULL_TREE;
959 }
960
961 /* Handle a "leaf" attribute; arguments as in
962 struct attribute_spec.handler. */
963
964 static tree
965 handle_leaf_attribute (tree *node, tree name,
966 tree ARG_UNUSED (args),
967 int ARG_UNUSED (flags), bool *no_add_attrs)
968 {
969 if (TREE_CODE (*node) != FUNCTION_DECL)
970 {
971 warning (OPT_Wattributes, "%qE attribute ignored", name);
972 *no_add_attrs = true;
973 }
974 if (!TREE_PUBLIC (*node))
975 {
976 warning (OPT_Wattributes, "%qE attribute has no effect on unit local "
977 "functions", name);
978 *no_add_attrs = true;
979 }
980
981 return NULL_TREE;
982 }
983
984 /* Handle an "artificial" attribute; arguments as in
985 struct attribute_spec.handler. */
986
987 static tree
988 handle_artificial_attribute (tree *node, tree name,
989 tree ARG_UNUSED (args),
990 int ARG_UNUSED (flags),
991 bool *no_add_attrs)
992 {
993 if (TREE_CODE (*node) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (*node))
994 {
995 /* Do nothing else, just set the attribute. We'll get at
996 it later with lookup_attribute. */
997 }
998 else
999 {
1000 warning (OPT_Wattributes, "%qE attribute ignored", name);
1001 *no_add_attrs = true;
1002 }
1003
1004 return NULL_TREE;
1005 }
1006
1007 /* Handle a "flatten" attribute; arguments as in
1008 struct attribute_spec.handler. */
1009
1010 static tree
1011 handle_flatten_attribute (tree *node, tree name,
1012 tree args ATTRIBUTE_UNUSED,
1013 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
1014 {
1015 if (TREE_CODE (*node) == FUNCTION_DECL)
1016 /* Do nothing else, just set the attribute. We'll get at
1017 it later with lookup_attribute. */
1018 ;
1019 else
1020 {
1021 warning (OPT_Wattributes, "%qE attribute ignored", name);
1022 *no_add_attrs = true;
1023 }
1024
1025 return NULL_TREE;
1026 }
1027
1028 /* Handle a "warning" or "error" attribute; arguments as in
1029 struct attribute_spec.handler. */
1030
1031 static tree
1032 handle_error_attribute (tree *node, tree name, tree args,
1033 int ARG_UNUSED (flags), bool *no_add_attrs)
1034 {
1035 if (TREE_CODE (*node) == FUNCTION_DECL
1036 && TREE_CODE (TREE_VALUE (args)) == STRING_CST)
1037 /* Do nothing else, just set the attribute. We'll get at
1038 it later with lookup_attribute. */
1039 ;
1040 else
1041 {
1042 warning (OPT_Wattributes, "%qE attribute ignored", name);
1043 *no_add_attrs = true;
1044 }
1045
1046 return NULL_TREE;
1047 }
1048
1049 /* Handle a "used" attribute; arguments as in
1050 struct attribute_spec.handler. */
1051
1052 static tree
1053 handle_used_attribute (tree *pnode, tree name, tree ARG_UNUSED (args),
1054 int ARG_UNUSED (flags), bool *no_add_attrs)
1055 {
1056 tree node = *pnode;
1057
1058 if (TREE_CODE (node) == FUNCTION_DECL
1059 || (VAR_P (node) && TREE_STATIC (node))
1060 || (TREE_CODE (node) == TYPE_DECL))
1061 {
1062 TREE_USED (node) = 1;
1063 DECL_PRESERVE_P (node) = 1;
1064 if (VAR_P (node))
1065 DECL_READ_P (node) = 1;
1066 }
1067 else
1068 {
1069 warning (OPT_Wattributes, "%qE attribute ignored", name);
1070 *no_add_attrs = true;
1071 }
1072
1073 return NULL_TREE;
1074 }
1075
1076 /* Handle a "unused" attribute; arguments as in
1077 struct attribute_spec.handler. */
1078
1079 tree
1080 handle_unused_attribute (tree *node, tree name, tree ARG_UNUSED (args),
1081 int flags, bool *no_add_attrs)
1082 {
1083 if (DECL_P (*node))
1084 {
1085 tree decl = *node;
1086
1087 if (TREE_CODE (decl) == PARM_DECL
1088 || VAR_OR_FUNCTION_DECL_P (decl)
1089 || TREE_CODE (decl) == LABEL_DECL
1090 || TREE_CODE (decl) == CONST_DECL
1091 || TREE_CODE (decl) == TYPE_DECL)
1092 {
1093 TREE_USED (decl) = 1;
1094 if (VAR_P (decl) || TREE_CODE (decl) == PARM_DECL)
1095 DECL_READ_P (decl) = 1;
1096 }
1097 else
1098 {
1099 warning (OPT_Wattributes, "%qE attribute ignored", name);
1100 *no_add_attrs = true;
1101 }
1102 }
1103 else
1104 {
1105 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
1106 *node = build_variant_type_copy (*node);
1107 TREE_USED (*node) = 1;
1108 }
1109
1110 return NULL_TREE;
1111 }
1112
1113 /* Handle a "externally_visible" attribute; arguments as in
1114 struct attribute_spec.handler. */
1115
1116 static tree
1117 handle_externally_visible_attribute (tree *pnode, tree name,
1118 tree ARG_UNUSED (args),
1119 int ARG_UNUSED (flags),
1120 bool *no_add_attrs)
1121 {
1122 tree node = *pnode;
1123
1124 if (VAR_OR_FUNCTION_DECL_P (node))
1125 {
1126 if ((!TREE_STATIC (node) && TREE_CODE (node) != FUNCTION_DECL
1127 && !DECL_EXTERNAL (node)) || !TREE_PUBLIC (node))
1128 {
1129 warning (OPT_Wattributes,
1130 "%qE attribute have effect only on public objects", name);
1131 *no_add_attrs = true;
1132 }
1133 }
1134 else
1135 {
1136 warning (OPT_Wattributes, "%qE attribute ignored", name);
1137 *no_add_attrs = true;
1138 }
1139
1140 return NULL_TREE;
1141 }
1142
1143 /* Handle the "no_reorder" attribute. Arguments as in
1144 struct attribute_spec.handler. */
1145
1146 static tree
1147 handle_no_reorder_attribute (tree *pnode,
1148 tree name,
1149 tree,
1150 int,
1151 bool *no_add_attrs)
1152 {
1153 tree node = *pnode;
1154
1155 if (!VAR_OR_FUNCTION_DECL_P (node)
1156 && !(TREE_STATIC (node) || DECL_EXTERNAL (node)))
1157 {
1158 warning (OPT_Wattributes,
1159 "%qE attribute only affects top level objects",
1160 name);
1161 *no_add_attrs = true;
1162 }
1163
1164 return NULL_TREE;
1165 }
1166
1167 /* Handle a "const" attribute; arguments as in
1168 struct attribute_spec.handler. */
1169
1170 static tree
1171 handle_const_attribute (tree *node, tree name, tree ARG_UNUSED (args),
1172 int flags, bool *no_add_attrs)
1173 {
1174 tree type = TREE_TYPE (*node);
1175
1176 /* See FIXME comment on noreturn in c_common_attribute_table. */
1177 if (TREE_CODE (*node) == FUNCTION_DECL)
1178 TREE_READONLY (*node) = 1;
1179 else if (TREE_CODE (type) == POINTER_TYPE
1180 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE)
1181 TREE_TYPE (*node)
1182 = (build_qualified_type
1183 (build_pointer_type
1184 (build_type_variant (TREE_TYPE (type), 1,
1185 TREE_THIS_VOLATILE (TREE_TYPE (type)))),
1186 TYPE_QUALS (type)));
1187 else
1188 {
1189 warning (OPT_Wattributes, "%qE attribute ignored", name);
1190 *no_add_attrs = true;
1191 }
1192
1193 /* void __builtin_unreachable(void) is const. Accept other such
1194 built-ins but warn on user-defined functions that return void. */
1195 if (!(flags & ATTR_FLAG_BUILT_IN)
1196 && TREE_CODE (*node) == FUNCTION_DECL
1197 && VOID_TYPE_P (TREE_TYPE (type)))
1198 warning (OPT_Wattributes, "%qE attribute on function "
1199 "returning %<void%>", name);
1200
1201 return NULL_TREE;
1202 }
1203
1204 /* Handle a "scalar_storage_order" attribute; arguments as in
1205 struct attribute_spec.handler. */
1206
1207 static tree
1208 handle_scalar_storage_order_attribute (tree *node, tree name, tree args,
1209 int flags, bool *no_add_attrs)
1210 {
1211 tree id = TREE_VALUE (args);
1212 tree type;
1213
1214 if (TREE_CODE (*node) == TYPE_DECL
1215 && ! (flags & ATTR_FLAG_CXX11))
1216 node = &TREE_TYPE (*node);
1217 type = *node;
1218
1219 if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
1220 {
1221 error ("scalar_storage_order is not supported because endianness "
1222 "is not uniform");
1223 return NULL_TREE;
1224 }
1225
1226 if (RECORD_OR_UNION_TYPE_P (type) && !c_dialect_cxx ())
1227 {
1228 bool reverse = false;
1229
1230 if (TREE_CODE (id) == STRING_CST
1231 && strcmp (TREE_STRING_POINTER (id), "big-endian") == 0)
1232 reverse = !BYTES_BIG_ENDIAN;
1233 else if (TREE_CODE (id) == STRING_CST
1234 && strcmp (TREE_STRING_POINTER (id), "little-endian") == 0)
1235 reverse = BYTES_BIG_ENDIAN;
1236 else
1237 {
1238 error ("scalar_storage_order argument must be one of \"big-endian\""
1239 " or \"little-endian\"");
1240 return NULL_TREE;
1241 }
1242
1243 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
1244 {
1245 if (reverse)
1246 /* A type variant isn't good enough, since we don't want a cast
1247 to such a type to be removed as a no-op. */
1248 *node = type = build_duplicate_type (type);
1249 }
1250
1251 TYPE_REVERSE_STORAGE_ORDER (type) = reverse;
1252 return NULL_TREE;
1253 }
1254
1255 warning (OPT_Wattributes, "%qE attribute ignored", name);
1256 *no_add_attrs = true;
1257 return NULL_TREE;
1258 }
1259
1260 /* Handle a "transparent_union" attribute; arguments as in
1261 struct attribute_spec.handler. */
1262
1263 static tree
1264 handle_transparent_union_attribute (tree *node, tree name,
1265 tree ARG_UNUSED (args), int flags,
1266 bool *no_add_attrs)
1267 {
1268 tree type;
1269
1270 *no_add_attrs = true;
1271
1272 if (TREE_CODE (*node) == TYPE_DECL
1273 && ! (flags & ATTR_FLAG_CXX11))
1274 node = &TREE_TYPE (*node);
1275 type = *node;
1276
1277 if (TREE_CODE (type) == UNION_TYPE)
1278 {
1279 /* Make sure that the first field will work for a transparent union.
1280 If the type isn't complete yet, leave the check to the code in
1281 finish_struct. */
1282 if (TYPE_SIZE (type))
1283 {
1284 tree first = first_field (type);
1285 if (first == NULL_TREE
1286 || DECL_ARTIFICIAL (first)
1287 || TYPE_MODE (type) != DECL_MODE (first))
1288 goto ignored;
1289 }
1290
1291 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
1292 {
1293 /* If the type isn't complete yet, setting the flag
1294 on a variant wouldn't ever be checked. */
1295 if (!TYPE_SIZE (type))
1296 goto ignored;
1297
1298 /* build_duplicate_type doesn't work for C++. */
1299 if (c_dialect_cxx ())
1300 goto ignored;
1301
1302 /* A type variant isn't good enough, since we don't want a cast
1303 to such a type to be removed as a no-op. */
1304 *node = type = build_duplicate_type (type);
1305 }
1306
1307 for (tree t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
1308 TYPE_TRANSPARENT_AGGR (t) = 1;
1309 return NULL_TREE;
1310 }
1311
1312 ignored:
1313 warning (OPT_Wattributes, "%qE attribute ignored", name);
1314 return NULL_TREE;
1315 }
1316
1317 /* Subroutine of handle_{con,de}structor_attribute. Evaluate ARGS to
1318 get the requested priority for a constructor or destructor,
1319 possibly issuing diagnostics for invalid or reserved
1320 priorities. */
1321
1322 static priority_type
1323 get_priority (tree args, bool is_destructor)
1324 {
1325 HOST_WIDE_INT pri;
1326 tree arg;
1327
1328 if (!args)
1329 return DEFAULT_INIT_PRIORITY;
1330
1331 if (!SUPPORTS_INIT_PRIORITY)
1332 {
1333 if (is_destructor)
1334 error ("destructor priorities are not supported");
1335 else
1336 error ("constructor priorities are not supported");
1337 return DEFAULT_INIT_PRIORITY;
1338 }
1339
1340 arg = TREE_VALUE (args);
1341 if (TREE_CODE (arg) == IDENTIFIER_NODE)
1342 goto invalid;
1343 if (arg == error_mark_node)
1344 return DEFAULT_INIT_PRIORITY;
1345 arg = default_conversion (arg);
1346 if (!tree_fits_shwi_p (arg)
1347 || !INTEGRAL_TYPE_P (TREE_TYPE (arg)))
1348 goto invalid;
1349
1350 pri = tree_to_shwi (arg);
1351 if (pri < 0 || pri > MAX_INIT_PRIORITY)
1352 goto invalid;
1353
1354 if (pri <= MAX_RESERVED_INIT_PRIORITY)
1355 {
1356 if (is_destructor)
1357 warning (0,
1358 "destructor priorities from 0 to %d are reserved "
1359 "for the implementation",
1360 MAX_RESERVED_INIT_PRIORITY);
1361 else
1362 warning (0,
1363 "constructor priorities from 0 to %d are reserved "
1364 "for the implementation",
1365 MAX_RESERVED_INIT_PRIORITY);
1366 }
1367 return pri;
1368
1369 invalid:
1370 if (is_destructor)
1371 error ("destructor priorities must be integers from 0 to %d inclusive",
1372 MAX_INIT_PRIORITY);
1373 else
1374 error ("constructor priorities must be integers from 0 to %d inclusive",
1375 MAX_INIT_PRIORITY);
1376 return DEFAULT_INIT_PRIORITY;
1377 }
1378
1379 /* Handle a "constructor" attribute; arguments as in
1380 struct attribute_spec.handler. */
1381
1382 static tree
1383 handle_constructor_attribute (tree *node, tree name, tree args,
1384 int ARG_UNUSED (flags),
1385 bool *no_add_attrs)
1386 {
1387 tree decl = *node;
1388 tree type = TREE_TYPE (decl);
1389
1390 if (TREE_CODE (decl) == FUNCTION_DECL
1391 && TREE_CODE (type) == FUNCTION_TYPE
1392 && decl_function_context (decl) == 0)
1393 {
1394 priority_type priority;
1395 DECL_STATIC_CONSTRUCTOR (decl) = 1;
1396 priority = get_priority (args, /*is_destructor=*/false);
1397 SET_DECL_INIT_PRIORITY (decl, priority);
1398 TREE_USED (decl) = 1;
1399 }
1400 else
1401 {
1402 warning (OPT_Wattributes, "%qE attribute ignored", name);
1403 *no_add_attrs = true;
1404 }
1405
1406 return NULL_TREE;
1407 }
1408
1409 /* Handle a "destructor" attribute; arguments as in
1410 struct attribute_spec.handler. */
1411
1412 static tree
1413 handle_destructor_attribute (tree *node, tree name, tree args,
1414 int ARG_UNUSED (flags),
1415 bool *no_add_attrs)
1416 {
1417 tree decl = *node;
1418 tree type = TREE_TYPE (decl);
1419
1420 if (TREE_CODE (decl) == FUNCTION_DECL
1421 && TREE_CODE (type) == FUNCTION_TYPE
1422 && decl_function_context (decl) == 0)
1423 {
1424 priority_type priority;
1425 DECL_STATIC_DESTRUCTOR (decl) = 1;
1426 priority = get_priority (args, /*is_destructor=*/true);
1427 SET_DECL_FINI_PRIORITY (decl, priority);
1428 TREE_USED (decl) = 1;
1429 }
1430 else
1431 {
1432 warning (OPT_Wattributes, "%qE attribute ignored", name);
1433 *no_add_attrs = true;
1434 }
1435
1436 return NULL_TREE;
1437 }
1438
1439 /* Nonzero if the mode is a valid vector mode for this architecture.
1440 This returns nonzero even if there is no hardware support for the
1441 vector mode, but we can emulate with narrower modes. */
1442
1443 static bool
1444 vector_mode_valid_p (machine_mode mode)
1445 {
1446 enum mode_class mclass = GET_MODE_CLASS (mode);
1447
1448 /* Doh! What's going on? */
1449 if (mclass != MODE_VECTOR_INT
1450 && mclass != MODE_VECTOR_FLOAT
1451 && mclass != MODE_VECTOR_FRACT
1452 && mclass != MODE_VECTOR_UFRACT
1453 && mclass != MODE_VECTOR_ACCUM
1454 && mclass != MODE_VECTOR_UACCUM)
1455 return false;
1456
1457 /* Hardware support. Woo hoo! */
1458 if (targetm.vector_mode_supported_p (mode))
1459 return true;
1460
1461 /* We should probably return 1 if requesting V4DI and we have no DI,
1462 but we have V2DI, but this is probably very unlikely. */
1463
1464 /* If we have support for the inner mode, we can safely emulate it.
1465 We may not have V2DI, but me can emulate with a pair of DIs. */
1466 return targetm.scalar_mode_supported_p (GET_MODE_INNER (mode));
1467 }
1468
1469
1470 /* Handle a "mode" attribute; arguments as in
1471 struct attribute_spec.handler. */
1472
1473 static tree
1474 handle_mode_attribute (tree *node, tree name, tree args,
1475 int ARG_UNUSED (flags), bool *no_add_attrs)
1476 {
1477 tree type = *node;
1478 tree ident = TREE_VALUE (args);
1479
1480 *no_add_attrs = true;
1481
1482 if (TREE_CODE (ident) != IDENTIFIER_NODE)
1483 warning (OPT_Wattributes, "%qE attribute ignored", name);
1484 else
1485 {
1486 int j;
1487 const char *p = IDENTIFIER_POINTER (ident);
1488 int len = strlen (p);
1489 machine_mode mode = VOIDmode;
1490 tree typefm;
1491 bool valid_mode;
1492
1493 if (len > 4 && p[0] == '_' && p[1] == '_'
1494 && p[len - 1] == '_' && p[len - 2] == '_')
1495 {
1496 char *newp = (char *) alloca (len - 1);
1497
1498 strcpy (newp, &p[2]);
1499 newp[len - 4] = '\0';
1500 p = newp;
1501 }
1502
1503 /* Change this type to have a type with the specified mode.
1504 First check for the special modes. */
1505 if (!strcmp (p, "byte"))
1506 mode = byte_mode;
1507 else if (!strcmp (p, "word"))
1508 mode = word_mode;
1509 else if (!strcmp (p, "pointer"))
1510 mode = ptr_mode;
1511 else if (!strcmp (p, "libgcc_cmp_return"))
1512 mode = targetm.libgcc_cmp_return_mode ();
1513 else if (!strcmp (p, "libgcc_shift_count"))
1514 mode = targetm.libgcc_shift_count_mode ();
1515 else if (!strcmp (p, "unwind_word"))
1516 mode = targetm.unwind_word_mode ();
1517 else
1518 for (j = 0; j < NUM_MACHINE_MODES; j++)
1519 if (!strcmp (p, GET_MODE_NAME (j)))
1520 {
1521 mode = (machine_mode) j;
1522 break;
1523 }
1524
1525 if (mode == VOIDmode)
1526 {
1527 error ("unknown machine mode %qE", ident);
1528 return NULL_TREE;
1529 }
1530
1531 valid_mode = false;
1532 switch (GET_MODE_CLASS (mode))
1533 {
1534 case MODE_INT:
1535 case MODE_PARTIAL_INT:
1536 case MODE_FLOAT:
1537 case MODE_DECIMAL_FLOAT:
1538 case MODE_FRACT:
1539 case MODE_UFRACT:
1540 case MODE_ACCUM:
1541 case MODE_UACCUM:
1542 valid_mode
1543 = targetm.scalar_mode_supported_p (as_a <scalar_mode> (mode));
1544 break;
1545
1546 case MODE_COMPLEX_INT:
1547 case MODE_COMPLEX_FLOAT:
1548 valid_mode = targetm.scalar_mode_supported_p (GET_MODE_INNER (mode));
1549 break;
1550
1551 case MODE_VECTOR_INT:
1552 case MODE_VECTOR_FLOAT:
1553 case MODE_VECTOR_FRACT:
1554 case MODE_VECTOR_UFRACT:
1555 case MODE_VECTOR_ACCUM:
1556 case MODE_VECTOR_UACCUM:
1557 warning (OPT_Wattributes, "specifying vector types with "
1558 "__attribute__ ((mode)) is deprecated");
1559 warning (OPT_Wattributes,
1560 "use __attribute__ ((vector_size)) instead");
1561 valid_mode = vector_mode_valid_p (mode);
1562 break;
1563
1564 default:
1565 break;
1566 }
1567 if (!valid_mode)
1568 {
1569 error ("unable to emulate %qs", p);
1570 return NULL_TREE;
1571 }
1572
1573 if (POINTER_TYPE_P (type))
1574 {
1575 scalar_int_mode addr_mode;
1576 addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (type));
1577 tree (*fn)(tree, machine_mode, bool);
1578
1579 if (!is_a <scalar_int_mode> (mode, &addr_mode)
1580 || !targetm.addr_space.valid_pointer_mode (addr_mode, as))
1581 {
1582 error ("invalid pointer mode %qs", p);
1583 return NULL_TREE;
1584 }
1585
1586 if (TREE_CODE (type) == POINTER_TYPE)
1587 fn = build_pointer_type_for_mode;
1588 else
1589 fn = build_reference_type_for_mode;
1590 typefm = fn (TREE_TYPE (type), addr_mode, false);
1591 }
1592 else
1593 {
1594 /* For fixed-point modes, we need to test if the signness of type
1595 and the machine mode are consistent. */
1596 if (ALL_FIXED_POINT_MODE_P (mode)
1597 && TYPE_UNSIGNED (type) != UNSIGNED_FIXED_POINT_MODE_P (mode))
1598 {
1599 error ("signedness of type and machine mode %qs don%'t match", p);
1600 return NULL_TREE;
1601 }
1602 /* For fixed-point modes, we need to pass saturating info. */
1603 typefm = lang_hooks.types.type_for_mode (mode,
1604 ALL_FIXED_POINT_MODE_P (mode) ? TYPE_SATURATING (type)
1605 : TYPE_UNSIGNED (type));
1606 }
1607
1608 if (typefm == NULL_TREE)
1609 {
1610 error ("no data type for mode %qs", p);
1611 return NULL_TREE;
1612 }
1613 else if (TREE_CODE (type) == ENUMERAL_TYPE)
1614 {
1615 /* For enumeral types, copy the precision from the integer
1616 type returned above. If not an INTEGER_TYPE, we can't use
1617 this mode for this type. */
1618 if (TREE_CODE (typefm) != INTEGER_TYPE)
1619 {
1620 error ("cannot use mode %qs for enumeral types", p);
1621 return NULL_TREE;
1622 }
1623
1624 if (flags & ATTR_FLAG_TYPE_IN_PLACE)
1625 {
1626 TYPE_PRECISION (type) = TYPE_PRECISION (typefm);
1627 typefm = type;
1628 }
1629 else
1630 {
1631 /* We cannot build a type variant, as there's code that assumes
1632 that TYPE_MAIN_VARIANT has the same mode. This includes the
1633 debug generators. Instead, create a subrange type. This
1634 results in all of the enumeral values being emitted only once
1635 in the original, and the subtype gets them by reference. */
1636 if (TYPE_UNSIGNED (type))
1637 typefm = make_unsigned_type (TYPE_PRECISION (typefm));
1638 else
1639 typefm = make_signed_type (TYPE_PRECISION (typefm));
1640 TREE_TYPE (typefm) = type;
1641 }
1642 }
1643 else if (VECTOR_MODE_P (mode)
1644 ? TREE_CODE (type) != TREE_CODE (TREE_TYPE (typefm))
1645 : TREE_CODE (type) != TREE_CODE (typefm))
1646 {
1647 error ("mode %qs applied to inappropriate type", p);
1648 return NULL_TREE;
1649 }
1650
1651 *node = build_qualified_type (typefm, TYPE_QUALS (type));
1652 }
1653
1654 return NULL_TREE;
1655 }
1656
1657 /* Handle a "section" attribute; arguments as in
1658 struct attribute_spec.handler. */
1659
1660 static tree
1661 handle_section_attribute (tree *node, tree ARG_UNUSED (name), tree args,
1662 int ARG_UNUSED (flags), bool *no_add_attrs)
1663 {
1664 tree decl = *node;
1665
1666 if (!targetm_common.have_named_sections)
1667 {
1668 error_at (DECL_SOURCE_LOCATION (*node),
1669 "section attributes are not supported for this target");
1670 goto fail;
1671 }
1672
1673 if (!VAR_OR_FUNCTION_DECL_P (decl))
1674 {
1675 error ("section attribute not allowed for %q+D", *node);
1676 goto fail;
1677 }
1678
1679 if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
1680 {
1681 error ("section attribute argument not a string constant");
1682 goto fail;
1683 }
1684
1685 if (VAR_P (decl)
1686 && current_function_decl != NULL_TREE
1687 && !TREE_STATIC (decl))
1688 {
1689 error_at (DECL_SOURCE_LOCATION (decl),
1690 "section attribute cannot be specified for local variables");
1691 goto fail;
1692 }
1693
1694 /* The decl may have already been given a section attribute
1695 from a previous declaration. Ensure they match. */
1696 if (DECL_SECTION_NAME (decl) != NULL
1697 && strcmp (DECL_SECTION_NAME (decl),
1698 TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
1699 {
1700 error ("section of %q+D conflicts with previous declaration", *node);
1701 goto fail;
1702 }
1703
1704 if (VAR_P (decl)
1705 && !targetm.have_tls && targetm.emutls.tmpl_section
1706 && DECL_THREAD_LOCAL_P (decl))
1707 {
1708 error ("section of %q+D cannot be overridden", *node);
1709 goto fail;
1710 }
1711
1712 set_decl_section_name (decl, TREE_STRING_POINTER (TREE_VALUE (args)));
1713 return NULL_TREE;
1714
1715 fail:
1716 *no_add_attrs = true;
1717 return NULL_TREE;
1718 }
1719
1720 /* If in c++-11, check if the c++-11 alignment constraint with respect
1721 to fundamental alignment (in [dcl.align]) are satisfied. If not in
1722 c++-11 mode, does nothing.
1723
1724 [dcl.align]2/ says:
1725
1726 [* if the constant expression evaluates to a fundamental alignment,
1727 the alignment requirement of the declared entity shall be the
1728 specified fundamental alignment.
1729
1730 * if the constant expression evaluates to an extended alignment
1731 and the implementation supports that alignment in the context
1732 of the declaration, the alignment of the declared entity shall
1733 be that alignment
1734
1735 * if the constant expression evaluates to an extended alignment
1736 and the implementation does not support that alignment in the
1737 context of the declaration, the program is ill-formed]. */
1738
1739 static bool
1740 check_cxx_fundamental_alignment_constraints (tree node,
1741 unsigned align_log,
1742 int flags)
1743 {
1744 bool alignment_too_large_p = false;
1745 unsigned requested_alignment = (1U << align_log) * BITS_PER_UNIT;
1746 unsigned max_align = 0;
1747
1748 if ((!(flags & ATTR_FLAG_CXX11) && !warn_cxx_compat)
1749 || (node == NULL_TREE || node == error_mark_node))
1750 return true;
1751
1752 if (cxx_fundamental_alignment_p (requested_alignment))
1753 return true;
1754
1755 if (VAR_P (node))
1756 {
1757 if (TREE_STATIC (node) || DECL_EXTERNAL (node))
1758 /* For file scope variables and static members, the target supports
1759 alignments that are at most MAX_OFILE_ALIGNMENT. */
1760 max_align = MAX_OFILE_ALIGNMENT;
1761 else
1762 /* For stack variables, the target supports at most
1763 MAX_STACK_ALIGNMENT. */
1764 max_align = MAX_STACK_ALIGNMENT;
1765 if (requested_alignment > max_align)
1766 alignment_too_large_p = true;
1767 }
1768 /* Let's be liberal for types and fields; don't limit their alignment any
1769 more than check_user_alignment already did. */
1770
1771 if (alignment_too_large_p)
1772 pedwarn (input_location, OPT_Wattributes,
1773 "requested alignment %d is larger than %d",
1774 requested_alignment / BITS_PER_UNIT, max_align / BITS_PER_UNIT);
1775
1776 return !alignment_too_large_p;
1777 }
1778
1779 /* Common codes shared by handle_warn_if_not_aligned_attribute and
1780 handle_aligned_attribute. */
1781
1782 static tree
1783 common_handle_aligned_attribute (tree *node, tree name, tree args, int flags,
1784 bool *no_add_attrs,
1785 bool warn_if_not_aligned_p)
1786 {
1787 tree decl = NULL_TREE;
1788 tree *type = NULL;
1789 bool is_type = false;
1790 tree align_expr;
1791
1792 /* The last (already pushed) declaration with all validated attributes
1793 merged in or the current about-to-be-pushed one if one hasn't been
1794 yet. */
1795 tree last_decl = node[1] ? node[1] : *node;
1796
1797 if (args)
1798 {
1799 align_expr = TREE_VALUE (args);
1800 if (align_expr && TREE_CODE (align_expr) != IDENTIFIER_NODE
1801 && TREE_CODE (align_expr) != FUNCTION_DECL)
1802 align_expr = default_conversion (align_expr);
1803 }
1804 else
1805 align_expr = size_int (ATTRIBUTE_ALIGNED_VALUE / BITS_PER_UNIT);
1806
1807 if (DECL_P (*node))
1808 {
1809 decl = *node;
1810 type = &TREE_TYPE (decl);
1811 is_type = TREE_CODE (*node) == TYPE_DECL;
1812 }
1813 else if (TYPE_P (*node))
1814 type = node, is_type = true;
1815
1816 /* Log2 of specified alignment. */
1817 int pow2align = check_user_alignment (align_expr, true);
1818 if (pow2align == -1
1819 || !check_cxx_fundamental_alignment_constraints (*node, pow2align, flags))
1820 {
1821 *no_add_attrs = true;
1822 return NULL_TREE;
1823 }
1824
1825 /* The alignment in bits corresponding to the specified alignment. */
1826 unsigned bitalign = (1U << pow2align) * BITS_PER_UNIT;
1827
1828 /* The alignment of the current declaration and that of the last
1829 pushed declaration, determined on demand below. */
1830 unsigned curalign = 0;
1831 unsigned lastalign = 0;
1832
1833 if (is_type)
1834 {
1835 if ((flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
1836 /* OK, modify the type in place. */;
1837 /* If we have a TYPE_DECL, then copy the type, so that we
1838 don't accidentally modify a builtin type. See pushdecl. */
1839 else if (decl && TREE_TYPE (decl) != error_mark_node
1840 && DECL_ORIGINAL_TYPE (decl) == NULL_TREE)
1841 {
1842 tree tt = TREE_TYPE (decl);
1843 *type = build_variant_type_copy (*type);
1844 DECL_ORIGINAL_TYPE (decl) = tt;
1845 TYPE_NAME (*type) = decl;
1846 TREE_USED (*type) = TREE_USED (decl);
1847 TREE_TYPE (decl) = *type;
1848 }
1849 else
1850 *type = build_variant_type_copy (*type);
1851
1852 if (warn_if_not_aligned_p)
1853 {
1854 SET_TYPE_WARN_IF_NOT_ALIGN (*type, bitalign);
1855 warn_if_not_aligned_p = false;
1856 }
1857 else
1858 {
1859 SET_TYPE_ALIGN (*type, bitalign);
1860 TYPE_USER_ALIGN (*type) = 1;
1861 }
1862 }
1863 else if (! VAR_OR_FUNCTION_DECL_P (decl)
1864 && TREE_CODE (decl) != FIELD_DECL)
1865 {
1866 error ("alignment may not be specified for %q+D", decl);
1867 *no_add_attrs = true;
1868 }
1869 else if (TREE_CODE (decl) == FUNCTION_DECL
1870 && ((curalign = DECL_ALIGN (decl)) > bitalign
1871 || ((lastalign = DECL_ALIGN (last_decl)) > bitalign)))
1872 {
1873 /* Either a prior attribute on the same declaration or one
1874 on a prior declaration of the same function specifies
1875 stricter alignment than this attribute. */
1876 bool note = lastalign != 0;
1877 if (lastalign)
1878 curalign = lastalign;
1879
1880 curalign /= BITS_PER_UNIT;
1881 bitalign /= BITS_PER_UNIT;
1882
1883 bool diagd = true;
1884 if (DECL_USER_ALIGN (decl) || DECL_USER_ALIGN (last_decl))
1885 diagd = warning (OPT_Wattributes,
1886 "ignoring attribute %<%E (%u)%> because it conflicts "
1887 "with attribute %<%E (%u)%>",
1888 name, bitalign, name, curalign);
1889 else if (!warn_if_not_aligned_p)
1890 /* Do not error out for attribute warn_if_not_aligned. */
1891 error ("alignment for %q+D must be at least %d", decl, curalign);
1892
1893 if (diagd && note)
1894 inform (DECL_SOURCE_LOCATION (last_decl), "previous declaration here");
1895
1896 *no_add_attrs = true;
1897 }
1898 else if (DECL_USER_ALIGN (decl)
1899 && DECL_ALIGN (decl) > bitalign)
1900 /* C++-11 [dcl.align/4]:
1901
1902 When multiple alignment-specifiers are specified for an
1903 entity, the alignment requirement shall be set to the
1904 strictest specified alignment.
1905
1906 This formally comes from the c++11 specification but we are
1907 doing it for the GNU attribute syntax as well. */
1908 *no_add_attrs = true;
1909 else if (!warn_if_not_aligned_p
1910 && TREE_CODE (decl) == FUNCTION_DECL
1911 && DECL_ALIGN (decl) > bitalign)
1912 {
1913 /* Don't warn function alignment here if warn_if_not_aligned_p is
1914 true. It will be warned later. */
1915 if (DECL_USER_ALIGN (decl))
1916 error ("alignment for %q+D was previously specified as %d "
1917 "and may not be decreased", decl,
1918 DECL_ALIGN (decl) / BITS_PER_UNIT);
1919 else
1920 error ("alignment for %q+D must be at least %d", decl,
1921 DECL_ALIGN (decl) / BITS_PER_UNIT);
1922 *no_add_attrs = true;
1923 }
1924 else
1925 {
1926 if (warn_if_not_aligned_p)
1927 {
1928 if (TREE_CODE (decl) == FIELD_DECL && !DECL_C_BIT_FIELD (decl))
1929 {
1930 SET_DECL_WARN_IF_NOT_ALIGN (decl, bitalign);
1931 warn_if_not_aligned_p = false;
1932 }
1933 }
1934 else
1935 {
1936 SET_DECL_ALIGN (decl, bitalign);
1937 DECL_USER_ALIGN (decl) = 1;
1938 }
1939 }
1940
1941 if (warn_if_not_aligned_p)
1942 {
1943 error ("%<warn_if_not_aligned%> may not be specified for %q+D",
1944 decl);
1945 *no_add_attrs = true;
1946 }
1947
1948 return NULL_TREE;
1949 }
1950
1951 /* Handle a "aligned" attribute; arguments as in
1952 struct attribute_spec.handler. */
1953
1954 static tree
1955 handle_aligned_attribute (tree *node, tree name, tree args,
1956 int flags, bool *no_add_attrs)
1957 {
1958 return common_handle_aligned_attribute (node, name, args, flags,
1959 no_add_attrs, false);
1960 }
1961
1962 /* Handle a "warn_if_not_aligned" attribute; arguments as in
1963 struct attribute_spec.handler. */
1964
1965 static tree
1966 handle_warn_if_not_aligned_attribute (tree *node, tree name,
1967 tree args, int flags,
1968 bool *no_add_attrs)
1969 {
1970 return common_handle_aligned_attribute (node, name, args, flags,
1971 no_add_attrs, true);
1972 }
1973
1974 /* Handle a "weak" attribute; arguments as in
1975 struct attribute_spec.handler. */
1976
1977 static tree
1978 handle_weak_attribute (tree *node, tree name,
1979 tree ARG_UNUSED (args),
1980 int ARG_UNUSED (flags),
1981 bool * ARG_UNUSED (no_add_attrs))
1982 {
1983 if (TREE_CODE (*node) == FUNCTION_DECL
1984 && DECL_DECLARED_INLINE_P (*node))
1985 {
1986 warning (OPT_Wattributes, "inline function %q+D declared weak", *node);
1987 *no_add_attrs = true;
1988 }
1989 else if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (*node)))
1990 {
1991 error ("indirect function %q+D cannot be declared weak", *node);
1992 *no_add_attrs = true;
1993 return NULL_TREE;
1994 }
1995 else if (VAR_OR_FUNCTION_DECL_P (*node))
1996 declare_weak (*node);
1997 else
1998 warning (OPT_Wattributes, "%qE attribute ignored", name);
1999
2000 return NULL_TREE;
2001 }
2002
2003 /* Handle a "noplt" attribute; arguments as in
2004 struct attribute_spec.handler. */
2005
2006 static tree
2007 handle_noplt_attribute (tree *node, tree name,
2008 tree ARG_UNUSED (args),
2009 int ARG_UNUSED (flags),
2010 bool * ARG_UNUSED (no_add_attrs))
2011 {
2012 if (TREE_CODE (*node) != FUNCTION_DECL)
2013 {
2014 warning (OPT_Wattributes,
2015 "%qE attribute is only applicable on functions", name);
2016 *no_add_attrs = true;
2017 return NULL_TREE;
2018 }
2019 return NULL_TREE;
2020 }
2021
2022 /* Handle an "alias" or "ifunc" attribute; arguments as in
2023 struct attribute_spec.handler, except that IS_ALIAS tells us
2024 whether this is an alias as opposed to ifunc attribute. */
2025
2026 static tree
2027 handle_alias_ifunc_attribute (bool is_alias, tree *node, tree name, tree args,
2028 bool *no_add_attrs)
2029 {
2030 tree decl = *node;
2031
2032 if (TREE_CODE (decl) != FUNCTION_DECL
2033 && (!is_alias || !VAR_P (decl)))
2034 {
2035 warning (OPT_Wattributes, "%qE attribute ignored", name);
2036 *no_add_attrs = true;
2037 }
2038 else if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl))
2039 || (TREE_CODE (decl) != FUNCTION_DECL
2040 && TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl))
2041 /* A static variable declaration is always a tentative definition,
2042 but the alias is a non-tentative definition which overrides. */
2043 || (TREE_CODE (decl) != FUNCTION_DECL
2044 && ! TREE_PUBLIC (decl) && DECL_INITIAL (decl)))
2045 {
2046 error ("%q+D defined both normally and as %qE attribute", decl, name);
2047 *no_add_attrs = true;
2048 return NULL_TREE;
2049 }
2050 else if (!is_alias
2051 && (lookup_attribute ("weak", DECL_ATTRIBUTES (decl))
2052 || lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))))
2053 {
2054 error ("weak %q+D cannot be defined %qE", decl, name);
2055 *no_add_attrs = true;
2056 return NULL_TREE;
2057 }
2058
2059 /* Note that the very first time we process a nested declaration,
2060 decl_function_context will not be set. Indeed, *would* never
2061 be set except for the DECL_INITIAL/DECL_EXTERNAL frobbery that
2062 we do below. After such frobbery, pushdecl would set the context.
2063 In any case, this is never what we want. */
2064 else if (decl_function_context (decl) == 0 && current_function_decl == NULL)
2065 {
2066 tree id;
2067
2068 id = TREE_VALUE (args);
2069 if (TREE_CODE (id) != STRING_CST)
2070 {
2071 error ("attribute %qE argument not a string", name);
2072 *no_add_attrs = true;
2073 return NULL_TREE;
2074 }
2075 id = get_identifier (TREE_STRING_POINTER (id));
2076 /* This counts as a use of the object pointed to. */
2077 TREE_USED (id) = 1;
2078
2079 if (TREE_CODE (decl) == FUNCTION_DECL)
2080 DECL_INITIAL (decl) = error_mark_node;
2081 else
2082 TREE_STATIC (decl) = 1;
2083
2084 if (!is_alias)
2085 {
2086 /* ifuncs are also aliases, so set that attribute too. */
2087 DECL_ATTRIBUTES (decl)
2088 = tree_cons (get_identifier ("alias"), args,
2089 DECL_ATTRIBUTES (decl));
2090 DECL_ATTRIBUTES (decl) = tree_cons (get_identifier ("ifunc"),
2091 NULL, DECL_ATTRIBUTES (decl));
2092 }
2093 }
2094 else
2095 {
2096 warning (OPT_Wattributes, "%qE attribute ignored", name);
2097 *no_add_attrs = true;
2098 }
2099
2100 if (decl_in_symtab_p (*node))
2101 {
2102 struct symtab_node *n = symtab_node::get (decl);
2103 if (n && n->refuse_visibility_changes)
2104 {
2105 if (is_alias)
2106 error ("%+qD declared alias after being used", decl);
2107 else
2108 error ("%+qD declared ifunc after being used", decl);
2109 }
2110 }
2111
2112
2113 return NULL_TREE;
2114 }
2115
2116 /* Handle an "alias" or "ifunc" attribute; arguments as in
2117 struct attribute_spec.handler. */
2118
2119 static tree
2120 handle_ifunc_attribute (tree *node, tree name, tree args,
2121 int ARG_UNUSED (flags), bool *no_add_attrs)
2122 {
2123 return handle_alias_ifunc_attribute (false, node, name, args, no_add_attrs);
2124 }
2125
2126 /* Handle an "alias" or "ifunc" attribute; arguments as in
2127 struct attribute_spec.handler. */
2128
2129 static tree
2130 handle_alias_attribute (tree *node, tree name, tree args,
2131 int ARG_UNUSED (flags), bool *no_add_attrs)
2132 {
2133 return handle_alias_ifunc_attribute (true, node, name, args, no_add_attrs);
2134 }
2135
2136 /* Handle a "weakref" attribute; arguments as in struct
2137 attribute_spec.handler. */
2138
2139 static tree
2140 handle_weakref_attribute (tree *node, tree ARG_UNUSED (name), tree args,
2141 int flags, bool *no_add_attrs)
2142 {
2143 tree attr = NULL_TREE;
2144
2145 /* We must ignore the attribute when it is associated with
2146 local-scoped decls, since attribute alias is ignored and many
2147 such symbols do not even have a DECL_WEAK field. */
2148 if (decl_function_context (*node)
2149 || current_function_decl
2150 || !VAR_OR_FUNCTION_DECL_P (*node))
2151 {
2152 warning (OPT_Wattributes, "%qE attribute ignored", name);
2153 *no_add_attrs = true;
2154 return NULL_TREE;
2155 }
2156
2157 if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (*node)))
2158 {
2159 error ("indirect function %q+D cannot be declared weakref", *node);
2160 *no_add_attrs = true;
2161 return NULL_TREE;
2162 }
2163
2164 /* The idea here is that `weakref("name")' mutates into `weakref,
2165 alias("name")', and weakref without arguments, in turn,
2166 implicitly adds weak. */
2167
2168 if (args)
2169 {
2170 attr = tree_cons (get_identifier ("alias"), args, attr);
2171 attr = tree_cons (get_identifier ("weakref"), NULL_TREE, attr);
2172
2173 *no_add_attrs = true;
2174
2175 decl_attributes (node, attr, flags);
2176 }
2177 else
2178 {
2179 if (lookup_attribute ("alias", DECL_ATTRIBUTES (*node)))
2180 error_at (DECL_SOURCE_LOCATION (*node),
2181 "weakref attribute must appear before alias attribute");
2182
2183 /* Can't call declare_weak because it wants this to be TREE_PUBLIC,
2184 and that isn't supported; and because it wants to add it to
2185 the list of weak decls, which isn't helpful. */
2186 DECL_WEAK (*node) = 1;
2187 }
2188
2189 if (decl_in_symtab_p (*node))
2190 {
2191 struct symtab_node *n = symtab_node::get (*node);
2192 if (n && n->refuse_visibility_changes)
2193 error ("%+qD declared weakref after being used", *node);
2194 }
2195
2196 return NULL_TREE;
2197 }
2198
2199 /* Handle an "visibility" attribute; arguments as in
2200 struct attribute_spec.handler. */
2201
2202 static tree
2203 handle_visibility_attribute (tree *node, tree name, tree args,
2204 int ARG_UNUSED (flags),
2205 bool *ARG_UNUSED (no_add_attrs))
2206 {
2207 tree decl = *node;
2208 tree id = TREE_VALUE (args);
2209 enum symbol_visibility vis;
2210
2211 if (TYPE_P (*node))
2212 {
2213 if (TREE_CODE (*node) == ENUMERAL_TYPE)
2214 /* OK */;
2215 else if (!RECORD_OR_UNION_TYPE_P (*node))
2216 {
2217 warning (OPT_Wattributes, "%qE attribute ignored on non-class types",
2218 name);
2219 return NULL_TREE;
2220 }
2221 else if (TYPE_FIELDS (*node))
2222 {
2223 error ("%qE attribute ignored because %qT is already defined",
2224 name, *node);
2225 return NULL_TREE;
2226 }
2227 }
2228 else if (decl_function_context (decl) != 0 || !TREE_PUBLIC (decl))
2229 {
2230 warning (OPT_Wattributes, "%qE attribute ignored", name);
2231 return NULL_TREE;
2232 }
2233
2234 if (TREE_CODE (id) != STRING_CST)
2235 {
2236 error ("visibility argument not a string");
2237 return NULL_TREE;
2238 }
2239
2240 /* If this is a type, set the visibility on the type decl. */
2241 if (TYPE_P (decl))
2242 {
2243 decl = TYPE_NAME (decl);
2244 if (!decl)
2245 return NULL_TREE;
2246 if (TREE_CODE (decl) == IDENTIFIER_NODE)
2247 {
2248 warning (OPT_Wattributes, "%qE attribute ignored on types",
2249 name);
2250 return NULL_TREE;
2251 }
2252 }
2253
2254 if (strcmp (TREE_STRING_POINTER (id), "default") == 0)
2255 vis = VISIBILITY_DEFAULT;
2256 else if (strcmp (TREE_STRING_POINTER (id), "internal") == 0)
2257 vis = VISIBILITY_INTERNAL;
2258 else if (strcmp (TREE_STRING_POINTER (id), "hidden") == 0)
2259 vis = VISIBILITY_HIDDEN;
2260 else if (strcmp (TREE_STRING_POINTER (id), "protected") == 0)
2261 vis = VISIBILITY_PROTECTED;
2262 else
2263 {
2264 error ("visibility argument must be one of \"default\", \"hidden\", \"protected\" or \"internal\"");
2265 vis = VISIBILITY_DEFAULT;
2266 }
2267
2268 if (DECL_VISIBILITY_SPECIFIED (decl)
2269 && vis != DECL_VISIBILITY (decl))
2270 {
2271 tree attributes = (TYPE_P (*node)
2272 ? TYPE_ATTRIBUTES (*node)
2273 : DECL_ATTRIBUTES (decl));
2274 if (lookup_attribute ("visibility", attributes))
2275 error ("%qD redeclared with different visibility", decl);
2276 else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
2277 && lookup_attribute ("dllimport", attributes))
2278 error ("%qD was declared %qs which implies default visibility",
2279 decl, "dllimport");
2280 else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
2281 && lookup_attribute ("dllexport", attributes))
2282 error ("%qD was declared %qs which implies default visibility",
2283 decl, "dllexport");
2284 }
2285
2286 DECL_VISIBILITY (decl) = vis;
2287 DECL_VISIBILITY_SPECIFIED (decl) = 1;
2288
2289 /* Go ahead and attach the attribute to the node as well. This is needed
2290 so we can determine whether we have VISIBILITY_DEFAULT because the
2291 visibility was not specified, or because it was explicitly overridden
2292 from the containing scope. */
2293
2294 return NULL_TREE;
2295 }
2296
2297 /* Handle an "tls_model" attribute; arguments as in
2298 struct attribute_spec.handler. */
2299
2300 static tree
2301 handle_tls_model_attribute (tree *node, tree name, tree args,
2302 int ARG_UNUSED (flags), bool *no_add_attrs)
2303 {
2304 tree id;
2305 tree decl = *node;
2306 enum tls_model kind;
2307
2308 *no_add_attrs = true;
2309
2310 if (!VAR_P (decl) || !DECL_THREAD_LOCAL_P (decl))
2311 {
2312 warning (OPT_Wattributes, "%qE attribute ignored", name);
2313 return NULL_TREE;
2314 }
2315
2316 kind = DECL_TLS_MODEL (decl);
2317 id = TREE_VALUE (args);
2318 if (TREE_CODE (id) != STRING_CST)
2319 {
2320 error ("tls_model argument not a string");
2321 return NULL_TREE;
2322 }
2323
2324 if (!strcmp (TREE_STRING_POINTER (id), "local-exec"))
2325 kind = TLS_MODEL_LOCAL_EXEC;
2326 else if (!strcmp (TREE_STRING_POINTER (id), "initial-exec"))
2327 kind = TLS_MODEL_INITIAL_EXEC;
2328 else if (!strcmp (TREE_STRING_POINTER (id), "local-dynamic"))
2329 kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
2330 else if (!strcmp (TREE_STRING_POINTER (id), "global-dynamic"))
2331 kind = TLS_MODEL_GLOBAL_DYNAMIC;
2332 else
2333 error ("tls_model argument must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\"");
2334
2335 set_decl_tls_model (decl, kind);
2336 return NULL_TREE;
2337 }
2338
2339 /* Handle a "no_instrument_function" attribute; arguments as in
2340 struct attribute_spec.handler. */
2341
2342 static tree
2343 handle_no_instrument_function_attribute (tree *node, tree name,
2344 tree ARG_UNUSED (args),
2345 int ARG_UNUSED (flags),
2346 bool *no_add_attrs)
2347 {
2348 tree decl = *node;
2349
2350 if (TREE_CODE (decl) != FUNCTION_DECL)
2351 {
2352 error_at (DECL_SOURCE_LOCATION (decl),
2353 "%qE attribute applies only to functions", name);
2354 *no_add_attrs = true;
2355 }
2356 else
2357 DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
2358
2359 return NULL_TREE;
2360 }
2361
2362 /* Handle a "no_profile_instrument_function" attribute; arguments as in
2363 struct attribute_spec.handler. */
2364
2365 static tree
2366 handle_no_profile_instrument_function_attribute (tree *node, tree name, tree,
2367 int, bool *no_add_attrs)
2368 {
2369 if (TREE_CODE (*node) != FUNCTION_DECL)
2370 {
2371 warning (OPT_Wattributes, "%qE attribute ignored", name);
2372 *no_add_attrs = true;
2373 }
2374
2375 return NULL_TREE;
2376 }
2377
2378 /* Handle a "malloc" attribute; arguments as in
2379 struct attribute_spec.handler. */
2380
2381 static tree
2382 handle_malloc_attribute (tree *node, tree name, tree ARG_UNUSED (args),
2383 int ARG_UNUSED (flags), bool *no_add_attrs)
2384 {
2385 if (TREE_CODE (*node) == FUNCTION_DECL
2386 && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (*node))))
2387 DECL_IS_MALLOC (*node) = 1;
2388 else
2389 {
2390 warning (OPT_Wattributes, "%qE attribute ignored", name);
2391 *no_add_attrs = true;
2392 }
2393
2394 return NULL_TREE;
2395 }
2396
2397 /* Handle a "alloc_size" attribute; arguments as in
2398 struct attribute_spec.handler. */
2399
2400 static tree
2401 handle_alloc_size_attribute (tree *node, tree ARG_UNUSED (name), tree args,
2402 int ARG_UNUSED (flags), bool *no_add_attrs)
2403 {
2404 unsigned arg_count = type_num_arguments (*node);
2405 for (; args; args = TREE_CHAIN (args))
2406 {
2407 tree position = TREE_VALUE (args);
2408 if (position && TREE_CODE (position) != IDENTIFIER_NODE
2409 && TREE_CODE (position) != FUNCTION_DECL)
2410 position = default_conversion (position);
2411
2412 if (!tree_fits_uhwi_p (position)
2413 || !arg_count
2414 || !IN_RANGE (tree_to_uhwi (position), 1, arg_count))
2415 {
2416 warning (OPT_Wattributes,
2417 "alloc_size parameter outside range");
2418 *no_add_attrs = true;
2419 return NULL_TREE;
2420 }
2421 }
2422 return NULL_TREE;
2423 }
2424
2425 /* Handle a "alloc_align" attribute; arguments as in
2426 struct attribute_spec.handler. */
2427
2428 static tree
2429 handle_alloc_align_attribute (tree *node, tree, tree args, int,
2430 bool *no_add_attrs)
2431 {
2432 unsigned arg_count = type_num_arguments (*node);
2433 tree position = TREE_VALUE (args);
2434 if (position && TREE_CODE (position) != IDENTIFIER_NODE
2435 && TREE_CODE (position) != FUNCTION_DECL)
2436 position = default_conversion (position);
2437
2438 if (!tree_fits_uhwi_p (position)
2439 || !arg_count
2440 || !IN_RANGE (tree_to_uhwi (position), 1, arg_count))
2441 {
2442 warning (OPT_Wattributes,
2443 "alloc_align parameter outside range");
2444 *no_add_attrs = true;
2445 return NULL_TREE;
2446 }
2447 return NULL_TREE;
2448 }
2449
2450 /* Handle a "assume_aligned" attribute; arguments as in
2451 struct attribute_spec.handler. */
2452
2453 static tree
2454 handle_assume_aligned_attribute (tree *, tree, tree args, int,
2455 bool *no_add_attrs)
2456 {
2457 for (; args; args = TREE_CHAIN (args))
2458 {
2459 tree position = TREE_VALUE (args);
2460 if (position && TREE_CODE (position) != IDENTIFIER_NODE
2461 && TREE_CODE (position) != FUNCTION_DECL)
2462 position = default_conversion (position);
2463
2464 if (TREE_CODE (position) != INTEGER_CST)
2465 {
2466 warning (OPT_Wattributes,
2467 "assume_aligned parameter not integer constant");
2468 *no_add_attrs = true;
2469 return NULL_TREE;
2470 }
2471 }
2472 return NULL_TREE;
2473 }
2474
2475 /* Handle a "fn spec" attribute; arguments as in
2476 struct attribute_spec.handler. */
2477
2478 static tree
2479 handle_fnspec_attribute (tree *node ATTRIBUTE_UNUSED, tree ARG_UNUSED (name),
2480 tree args, int ARG_UNUSED (flags),
2481 bool *no_add_attrs ATTRIBUTE_UNUSED)
2482 {
2483 gcc_assert (args
2484 && TREE_CODE (TREE_VALUE (args)) == STRING_CST
2485 && !TREE_CHAIN (args));
2486 return NULL_TREE;
2487 }
2488
2489 /* Handle a "bnd_variable_size" attribute; arguments as in
2490 struct attribute_spec.handler. */
2491
2492 static tree
2493 handle_bnd_variable_size_attribute (tree *node, tree name, tree ARG_UNUSED (args),
2494 int ARG_UNUSED (flags), bool *no_add_attrs)
2495 {
2496 if (TREE_CODE (*node) != FIELD_DECL)
2497 {
2498 warning (OPT_Wattributes, "%qE attribute ignored", name);
2499 *no_add_attrs = true;
2500 }
2501
2502 return NULL_TREE;
2503 }
2504
2505 /* Handle a "bnd_legacy" attribute; arguments as in
2506 struct attribute_spec.handler. */
2507
2508 static tree
2509 handle_bnd_legacy (tree *node, tree name, tree ARG_UNUSED (args),
2510 int ARG_UNUSED (flags), bool *no_add_attrs)
2511 {
2512 if (TREE_CODE (*node) != FUNCTION_DECL)
2513 {
2514 warning (OPT_Wattributes, "%qE attribute ignored", name);
2515 *no_add_attrs = true;
2516 }
2517
2518 return NULL_TREE;
2519 }
2520
2521 /* Handle a "bnd_instrument" attribute; arguments as in
2522 struct attribute_spec.handler. */
2523
2524 static tree
2525 handle_bnd_instrument (tree *node, tree name, tree ARG_UNUSED (args),
2526 int ARG_UNUSED (flags), bool *no_add_attrs)
2527 {
2528 if (TREE_CODE (*node) != FUNCTION_DECL)
2529 {
2530 warning (OPT_Wattributes, "%qE attribute ignored", name);
2531 *no_add_attrs = true;
2532 }
2533
2534 return NULL_TREE;
2535 }
2536
2537 /* Handle a "warn_unused" attribute; arguments as in
2538 struct attribute_spec.handler. */
2539
2540 static tree
2541 handle_warn_unused_attribute (tree *node, tree name,
2542 tree args ATTRIBUTE_UNUSED,
2543 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
2544 {
2545 if (TYPE_P (*node))
2546 /* Do nothing else, just set the attribute. We'll get at
2547 it later with lookup_attribute. */
2548 ;
2549 else
2550 {
2551 warning (OPT_Wattributes, "%qE attribute ignored", name);
2552 *no_add_attrs = true;
2553 }
2554
2555 return NULL_TREE;
2556 }
2557
2558 /* Handle an "omp declare simd" attribute; arguments as in
2559 struct attribute_spec.handler. */
2560
2561 static tree
2562 handle_omp_declare_simd_attribute (tree *, tree, tree, int, bool *)
2563 {
2564 return NULL_TREE;
2565 }
2566
2567 /* Handle a "simd" attribute. */
2568
2569 static tree
2570 handle_simd_attribute (tree *node, tree name, tree args, int, bool *no_add_attrs)
2571 {
2572 if (TREE_CODE (*node) == FUNCTION_DECL)
2573 {
2574 tree t = get_identifier ("omp declare simd");
2575 tree attr = NULL_TREE;
2576 if (args)
2577 {
2578 tree id = TREE_VALUE (args);
2579
2580 if (TREE_CODE (id) != STRING_CST)
2581 {
2582 error ("attribute %qE argument not a string", name);
2583 *no_add_attrs = true;
2584 return NULL_TREE;
2585 }
2586
2587 if (strcmp (TREE_STRING_POINTER (id), "notinbranch") == 0)
2588 attr = build_omp_clause (DECL_SOURCE_LOCATION (*node),
2589 OMP_CLAUSE_NOTINBRANCH);
2590 else if (strcmp (TREE_STRING_POINTER (id), "inbranch") == 0)
2591 attr = build_omp_clause (DECL_SOURCE_LOCATION (*node),
2592 OMP_CLAUSE_INBRANCH);
2593 else
2594 {
2595 error ("only %<inbranch%> and %<notinbranch%> flags are "
2596 "allowed for %<__simd__%> attribute");
2597 *no_add_attrs = true;
2598 return NULL_TREE;
2599 }
2600 }
2601
2602 DECL_ATTRIBUTES (*node)
2603 = tree_cons (t, build_tree_list (NULL_TREE, attr),
2604 DECL_ATTRIBUTES (*node));
2605 }
2606 else
2607 {
2608 warning (OPT_Wattributes, "%qE attribute ignored", name);
2609 *no_add_attrs = true;
2610 }
2611
2612 return NULL_TREE;
2613 }
2614
2615 /* Handle an "omp declare target" attribute; arguments as in
2616 struct attribute_spec.handler. */
2617
2618 static tree
2619 handle_omp_declare_target_attribute (tree *, tree, tree, int, bool *)
2620 {
2621 return NULL_TREE;
2622 }
2623
2624 /* Handle a "returns_twice" attribute; arguments as in
2625 struct attribute_spec.handler. */
2626
2627 static tree
2628 handle_returns_twice_attribute (tree *node, tree name, tree ARG_UNUSED (args),
2629 int ARG_UNUSED (flags), bool *no_add_attrs)
2630 {
2631 if (TREE_CODE (*node) == FUNCTION_DECL)
2632 DECL_IS_RETURNS_TWICE (*node) = 1;
2633 else
2634 {
2635 warning (OPT_Wattributes, "%qE attribute ignored", name);
2636 *no_add_attrs = true;
2637 }
2638
2639 return NULL_TREE;
2640 }
2641
2642 /* Handle a "no_limit_stack" attribute; arguments as in
2643 struct attribute_spec.handler. */
2644
2645 static tree
2646 handle_no_limit_stack_attribute (tree *node, tree name,
2647 tree ARG_UNUSED (args),
2648 int ARG_UNUSED (flags),
2649 bool *no_add_attrs)
2650 {
2651 tree decl = *node;
2652
2653 if (TREE_CODE (decl) != FUNCTION_DECL)
2654 {
2655 error_at (DECL_SOURCE_LOCATION (decl),
2656 "%qE attribute applies only to functions", name);
2657 *no_add_attrs = true;
2658 }
2659 else if (DECL_INITIAL (decl))
2660 {
2661 error_at (DECL_SOURCE_LOCATION (decl),
2662 "can%'t set %qE attribute after definition", name);
2663 *no_add_attrs = true;
2664 }
2665 else
2666 DECL_NO_LIMIT_STACK (decl) = 1;
2667
2668 return NULL_TREE;
2669 }
2670
2671 /* Handle a "pure" attribute; arguments as in
2672 struct attribute_spec.handler. */
2673
2674 static tree
2675 handle_pure_attribute (tree *node, tree name, tree ARG_UNUSED (args),
2676 int ARG_UNUSED (flags), bool *no_add_attrs)
2677 {
2678 if (TREE_CODE (*node) == FUNCTION_DECL)
2679 {
2680 tree type = TREE_TYPE (*node);
2681 if (VOID_TYPE_P (TREE_TYPE (type)))
2682 warning (OPT_Wattributes, "%qE attribute on function "
2683 "returning %<void%>", name);
2684
2685 DECL_PURE_P (*node) = 1;
2686 /* ??? TODO: Support types. */
2687 }
2688 else
2689 {
2690 warning (OPT_Wattributes, "%qE attribute ignored", name);
2691 *no_add_attrs = true;
2692 }
2693
2694 return NULL_TREE;
2695 }
2696
2697 /* Digest an attribute list destined for a transactional memory statement.
2698 ALLOWED is the set of attributes that are allowed for this statement;
2699 return the attribute we parsed. Multiple attributes are never allowed. */
2700
2701 int
2702 parse_tm_stmt_attr (tree attrs, int allowed)
2703 {
2704 tree a_seen = NULL;
2705 int m_seen = 0;
2706
2707 for ( ; attrs ; attrs = TREE_CHAIN (attrs))
2708 {
2709 tree a = TREE_PURPOSE (attrs);
2710 int m = 0;
2711
2712 if (is_attribute_p ("outer", a))
2713 m = TM_STMT_ATTR_OUTER;
2714
2715 if ((m & allowed) == 0)
2716 {
2717 warning (OPT_Wattributes, "%qE attribute directive ignored", a);
2718 continue;
2719 }
2720
2721 if (m_seen == 0)
2722 {
2723 a_seen = a;
2724 m_seen = m;
2725 }
2726 else if (m_seen == m)
2727 warning (OPT_Wattributes, "%qE attribute duplicated", a);
2728 else
2729 warning (OPT_Wattributes, "%qE attribute follows %qE", a, a_seen);
2730 }
2731
2732 return m_seen;
2733 }
2734
2735 /* Transform a TM attribute name into a maskable integer and back.
2736 Note that NULL (i.e. no attribute) is mapped to UNKNOWN, corresponding
2737 to how the lack of an attribute is treated. */
2738
2739 int
2740 tm_attr_to_mask (tree attr)
2741 {
2742 if (attr == NULL)
2743 return 0;
2744 if (is_attribute_p ("transaction_safe", attr))
2745 return TM_ATTR_SAFE;
2746 if (is_attribute_p ("transaction_callable", attr))
2747 return TM_ATTR_CALLABLE;
2748 if (is_attribute_p ("transaction_pure", attr))
2749 return TM_ATTR_PURE;
2750 if (is_attribute_p ("transaction_unsafe", attr))
2751 return TM_ATTR_IRREVOCABLE;
2752 if (is_attribute_p ("transaction_may_cancel_outer", attr))
2753 return TM_ATTR_MAY_CANCEL_OUTER;
2754 return 0;
2755 }
2756
2757 tree
2758 tm_mask_to_attr (int mask)
2759 {
2760 const char *str;
2761 switch (mask)
2762 {
2763 case TM_ATTR_SAFE:
2764 str = "transaction_safe";
2765 break;
2766 case TM_ATTR_CALLABLE:
2767 str = "transaction_callable";
2768 break;
2769 case TM_ATTR_PURE:
2770 str = "transaction_pure";
2771 break;
2772 case TM_ATTR_IRREVOCABLE:
2773 str = "transaction_unsafe";
2774 break;
2775 case TM_ATTR_MAY_CANCEL_OUTER:
2776 str = "transaction_may_cancel_outer";
2777 break;
2778 default:
2779 gcc_unreachable ();
2780 }
2781 return get_identifier (str);
2782 }
2783
2784 /* Return the first TM attribute seen in LIST. */
2785
2786 tree
2787 find_tm_attribute (tree list)
2788 {
2789 for (; list ; list = TREE_CHAIN (list))
2790 {
2791 tree name = TREE_PURPOSE (list);
2792 if (tm_attr_to_mask (name) != 0)
2793 return name;
2794 }
2795 return NULL_TREE;
2796 }
2797
2798 /* Handle the TM attributes; arguments as in struct attribute_spec.handler.
2799 Here we accept only function types, and verify that none of the other
2800 function TM attributes are also applied. */
2801 /* ??? We need to accept class types for C++, but not C. This greatly
2802 complicates this function, since we can no longer rely on the extra
2803 processing given by function_type_required. */
2804
2805 static tree
2806 handle_tm_attribute (tree *node, tree name, tree args,
2807 int flags, bool *no_add_attrs)
2808 {
2809 /* Only one path adds the attribute; others don't. */
2810 *no_add_attrs = true;
2811
2812 switch (TREE_CODE (*node))
2813 {
2814 case RECORD_TYPE:
2815 case UNION_TYPE:
2816 /* Only tm_callable and tm_safe apply to classes. */
2817 if (tm_attr_to_mask (name) & ~(TM_ATTR_SAFE | TM_ATTR_CALLABLE))
2818 goto ignored;
2819 /* FALLTHRU */
2820
2821 case FUNCTION_TYPE:
2822 case METHOD_TYPE:
2823 {
2824 tree old_name = find_tm_attribute (TYPE_ATTRIBUTES (*node));
2825 if (old_name == name)
2826 ;
2827 else if (old_name != NULL_TREE)
2828 error ("type was previously declared %qE", old_name);
2829 else
2830 *no_add_attrs = false;
2831 }
2832 break;
2833
2834 case FUNCTION_DECL:
2835 {
2836 /* transaction_safe_dynamic goes on the FUNCTION_DECL, but we also
2837 want to set transaction_safe on the type. */
2838 gcc_assert (is_attribute_p ("transaction_safe_dynamic", name));
2839 if (!TYPE_P (DECL_CONTEXT (*node)))
2840 error_at (DECL_SOURCE_LOCATION (*node),
2841 "%<transaction_safe_dynamic%> may only be specified for "
2842 "a virtual function");
2843 *no_add_attrs = false;
2844 decl_attributes (&TREE_TYPE (*node),
2845 build_tree_list (get_identifier ("transaction_safe"),
2846 NULL_TREE),
2847 0);
2848 break;
2849 }
2850
2851 case POINTER_TYPE:
2852 {
2853 enum tree_code subcode = TREE_CODE (TREE_TYPE (*node));
2854 if (subcode == FUNCTION_TYPE || subcode == METHOD_TYPE)
2855 {
2856 tree fn_tmp = TREE_TYPE (*node);
2857 decl_attributes (&fn_tmp, tree_cons (name, args, NULL), 0);
2858 *node = build_pointer_type (fn_tmp);
2859 break;
2860 }
2861 }
2862 /* FALLTHRU */
2863
2864 default:
2865 /* If a function is next, pass it on to be tried next. */
2866 if (flags & (int) ATTR_FLAG_FUNCTION_NEXT)
2867 return tree_cons (name, args, NULL);
2868
2869 ignored:
2870 warning (OPT_Wattributes, "%qE attribute ignored", name);
2871 break;
2872 }
2873
2874 return NULL_TREE;
2875 }
2876
2877 /* Handle the TM_WRAP attribute; arguments as in
2878 struct attribute_spec.handler. */
2879
2880 static tree
2881 handle_tm_wrap_attribute (tree *node, tree name, tree args,
2882 int ARG_UNUSED (flags), bool *no_add_attrs)
2883 {
2884 tree decl = *node;
2885
2886 /* We don't need the attribute even on success, since we
2887 record the entry in an external table. */
2888 *no_add_attrs = true;
2889
2890 if (TREE_CODE (decl) != FUNCTION_DECL)
2891 warning (OPT_Wattributes, "%qE attribute ignored", name);
2892 else
2893 {
2894 tree wrap_decl = TREE_VALUE (args);
2895 if (error_operand_p (wrap_decl))
2896 ;
2897 else if (TREE_CODE (wrap_decl) != IDENTIFIER_NODE
2898 && !VAR_OR_FUNCTION_DECL_P (wrap_decl))
2899 error ("%qE argument not an identifier", name);
2900 else
2901 {
2902 if (TREE_CODE (wrap_decl) == IDENTIFIER_NODE)
2903 wrap_decl = lookup_name (wrap_decl);
2904 if (wrap_decl && TREE_CODE (wrap_decl) == FUNCTION_DECL)
2905 {
2906 if (lang_hooks.types_compatible_p (TREE_TYPE (decl),
2907 TREE_TYPE (wrap_decl)))
2908 record_tm_replacement (wrap_decl, decl);
2909 else
2910 error ("%qD is not compatible with %qD", wrap_decl, decl);
2911 }
2912 else
2913 error ("%qE argument is not a function", name);
2914 }
2915 }
2916
2917 return NULL_TREE;
2918 }
2919
2920 /* Ignore the given attribute. Used when this attribute may be usefully
2921 overridden by the target, but is not used generically. */
2922
2923 static tree
2924 ignore_attribute (tree * ARG_UNUSED (node), tree ARG_UNUSED (name),
2925 tree ARG_UNUSED (args), int ARG_UNUSED (flags),
2926 bool *no_add_attrs)
2927 {
2928 *no_add_attrs = true;
2929 return NULL_TREE;
2930 }
2931
2932 /* Handle a "no vops" attribute; arguments as in
2933 struct attribute_spec.handler. */
2934
2935 static tree
2936 handle_novops_attribute (tree *node, tree ARG_UNUSED (name),
2937 tree ARG_UNUSED (args), int ARG_UNUSED (flags),
2938 bool *ARG_UNUSED (no_add_attrs))
2939 {
2940 gcc_assert (TREE_CODE (*node) == FUNCTION_DECL);
2941 DECL_IS_NOVOPS (*node) = 1;
2942 return NULL_TREE;
2943 }
2944
2945 /* Handle a "deprecated" attribute; arguments as in
2946 struct attribute_spec.handler. */
2947
2948 static tree
2949 handle_deprecated_attribute (tree *node, tree name,
2950 tree args, int flags,
2951 bool *no_add_attrs)
2952 {
2953 tree type = NULL_TREE;
2954 int warn = 0;
2955 tree what = NULL_TREE;
2956
2957 if (!args)
2958 *no_add_attrs = true;
2959 else if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
2960 {
2961 error ("deprecated message is not a string");
2962 *no_add_attrs = true;
2963 }
2964
2965 if (DECL_P (*node))
2966 {
2967 tree decl = *node;
2968 type = TREE_TYPE (decl);
2969
2970 if (TREE_CODE (decl) == TYPE_DECL
2971 || TREE_CODE (decl) == PARM_DECL
2972 || VAR_OR_FUNCTION_DECL_P (decl)
2973 || TREE_CODE (decl) == FIELD_DECL
2974 || TREE_CODE (decl) == CONST_DECL
2975 || objc_method_decl (TREE_CODE (decl)))
2976 TREE_DEPRECATED (decl) = 1;
2977 else
2978 warn = 1;
2979 }
2980 else if (TYPE_P (*node))
2981 {
2982 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE))
2983 *node = build_variant_type_copy (*node);
2984 TREE_DEPRECATED (*node) = 1;
2985 type = *node;
2986 }
2987 else
2988 warn = 1;
2989
2990 if (warn)
2991 {
2992 *no_add_attrs = true;
2993 if (type && TYPE_NAME (type))
2994 {
2995 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
2996 what = TYPE_NAME (*node);
2997 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
2998 && DECL_NAME (TYPE_NAME (type)))
2999 what = DECL_NAME (TYPE_NAME (type));
3000 }
3001 if (what)
3002 warning (OPT_Wattributes, "%qE attribute ignored for %qE", name, what);
3003 else
3004 warning (OPT_Wattributes, "%qE attribute ignored", name);
3005 }
3006
3007 return NULL_TREE;
3008 }
3009
3010 /* Handle a "vector_size" attribute; arguments as in
3011 struct attribute_spec.handler. */
3012
3013 static tree
3014 handle_vector_size_attribute (tree *node, tree name, tree args,
3015 int ARG_UNUSED (flags),
3016 bool *no_add_attrs)
3017 {
3018 unsigned HOST_WIDE_INT vecsize, nunits;
3019 machine_mode orig_mode;
3020 tree type = *node, new_type, size;
3021
3022 *no_add_attrs = true;
3023
3024 size = TREE_VALUE (args);
3025 if (size && TREE_CODE (size) != IDENTIFIER_NODE
3026 && TREE_CODE (size) != FUNCTION_DECL)
3027 size = default_conversion (size);
3028
3029 if (!tree_fits_uhwi_p (size))
3030 {
3031 warning (OPT_Wattributes, "%qE attribute ignored", name);
3032 return NULL_TREE;
3033 }
3034
3035 /* Get the vector size (in bytes). */
3036 vecsize = tree_to_uhwi (size);
3037
3038 /* We need to provide for vector pointers, vector arrays, and
3039 functions returning vectors. For example:
3040
3041 __attribute__((vector_size(16))) short *foo;
3042
3043 In this case, the mode is SI, but the type being modified is
3044 HI, so we need to look further. */
3045
3046 while (POINTER_TYPE_P (type)
3047 || TREE_CODE (type) == FUNCTION_TYPE
3048 || TREE_CODE (type) == METHOD_TYPE
3049 || TREE_CODE (type) == ARRAY_TYPE
3050 || TREE_CODE (type) == OFFSET_TYPE)
3051 type = TREE_TYPE (type);
3052
3053 /* Get the mode of the type being modified. */
3054 orig_mode = TYPE_MODE (type);
3055
3056 if ((!INTEGRAL_TYPE_P (type)
3057 && !SCALAR_FLOAT_TYPE_P (type)
3058 && !FIXED_POINT_TYPE_P (type))
3059 || (!SCALAR_FLOAT_MODE_P (orig_mode)
3060 && GET_MODE_CLASS (orig_mode) != MODE_INT
3061 && !ALL_SCALAR_FIXED_POINT_MODE_P (orig_mode))
3062 || !tree_fits_uhwi_p (TYPE_SIZE_UNIT (type))
3063 || TREE_CODE (type) == BOOLEAN_TYPE)
3064 {
3065 error ("invalid vector type for attribute %qE", name);
3066 return NULL_TREE;
3067 }
3068
3069 if (vecsize % tree_to_uhwi (TYPE_SIZE_UNIT (type)))
3070 {
3071 error ("vector size not an integral multiple of component size");
3072 return NULL;
3073 }
3074
3075 if (vecsize == 0)
3076 {
3077 error ("zero vector size");
3078 return NULL;
3079 }
3080
3081 /* Calculate how many units fit in the vector. */
3082 nunits = vecsize / tree_to_uhwi (TYPE_SIZE_UNIT (type));
3083 if (nunits & (nunits - 1))
3084 {
3085 error ("number of components of the vector not a power of two");
3086 return NULL_TREE;
3087 }
3088
3089 new_type = build_vector_type (type, nunits);
3090
3091 /* Build back pointers if needed. */
3092 *node = lang_hooks.types.reconstruct_complex_type (*node, new_type);
3093
3094 return NULL_TREE;
3095 }
3096
3097 /* Handle the "nonnull" attribute. */
3098
3099 static tree
3100 handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name),
3101 tree args, int ARG_UNUSED (flags),
3102 bool *no_add_attrs)
3103 {
3104 tree type = *node;
3105 unsigned HOST_WIDE_INT attr_arg_num;
3106
3107 /* If no arguments are specified, all pointer arguments should be
3108 non-null. Verify a full prototype is given so that the arguments
3109 will have the correct types when we actually check them later.
3110 Avoid diagnosing type-generic built-ins since those have no
3111 prototype. */
3112 if (!args)
3113 {
3114 if (!prototype_p (type)
3115 && (!TYPE_ATTRIBUTES (type)
3116 || !lookup_attribute ("type generic", TYPE_ATTRIBUTES (type))))
3117 {
3118 error ("nonnull attribute without arguments on a non-prototype");
3119 *no_add_attrs = true;
3120 }
3121 return NULL_TREE;
3122 }
3123
3124 /* Argument list specified. Verify that each argument number references
3125 a pointer argument. */
3126 for (attr_arg_num = 1; args; attr_arg_num++, args = TREE_CHAIN (args))
3127 {
3128 unsigned HOST_WIDE_INT arg_num = 0, ck_num;
3129
3130 tree arg = TREE_VALUE (args);
3131 if (arg && TREE_CODE (arg) != IDENTIFIER_NODE
3132 && TREE_CODE (arg) != FUNCTION_DECL)
3133 TREE_VALUE (args) = arg = default_conversion (arg);
3134
3135 if (!get_nonnull_operand (arg, &arg_num))
3136 {
3137 error ("nonnull argument has invalid operand number (argument %lu)",
3138 (unsigned long) attr_arg_num);
3139 *no_add_attrs = true;
3140 return NULL_TREE;
3141 }
3142
3143 if (prototype_p (type))
3144 {
3145 function_args_iterator iter;
3146 tree argument;
3147
3148 function_args_iter_init (&iter, type);
3149 for (ck_num = 1; ; ck_num++, function_args_iter_next (&iter))
3150 {
3151 argument = function_args_iter_cond (&iter);
3152 if (argument == NULL_TREE || ck_num == arg_num)
3153 break;
3154 }
3155
3156 if (!argument
3157 || TREE_CODE (argument) == VOID_TYPE)
3158 {
3159 error ("nonnull argument with out-of-range operand number "
3160 "(argument %lu, operand %lu)",
3161 (unsigned long) attr_arg_num, (unsigned long) arg_num);
3162 *no_add_attrs = true;
3163 return NULL_TREE;
3164 }
3165
3166 if (TREE_CODE (argument) != POINTER_TYPE)
3167 {
3168 error ("nonnull argument references non-pointer operand "
3169 "(argument %lu, operand %lu)",
3170 (unsigned long) attr_arg_num, (unsigned long) arg_num);
3171 *no_add_attrs = true;
3172 return NULL_TREE;
3173 }
3174 }
3175 }
3176
3177 return NULL_TREE;
3178 }
3179
3180 /* Handle the "nonstring" variable attribute. */
3181
3182 static tree
3183 handle_nonstring_attribute (tree *node, tree name, tree ARG_UNUSED (args),
3184 int ARG_UNUSED (flags), bool *no_add_attrs)
3185 {
3186 gcc_assert (!args);
3187 tree_code code = TREE_CODE (*node);
3188
3189 if (VAR_P (*node)
3190 || code == FIELD_DECL
3191 || code == PARM_DECL)
3192 {
3193 tree type = TREE_TYPE (*node);
3194
3195 if (POINTER_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
3196 {
3197 /* Accept the attribute on arrays and pointers to all three
3198 narrow character types. */
3199 tree eltype = TREE_TYPE (type);
3200 eltype = TYPE_MAIN_VARIANT (eltype);
3201 if (eltype == char_type_node
3202 || eltype == signed_char_type_node
3203 || eltype == unsigned_char_type_node)
3204 return NULL_TREE;
3205 }
3206
3207 warning (OPT_Wattributes,
3208 "%qE attribute ignored on objects of type %qT",
3209 name, type);
3210 *no_add_attrs = true;
3211 return NULL_TREE;
3212 }
3213
3214 if (code == FUNCTION_DECL)
3215 warning (OPT_Wattributes,
3216 "%qE attribute does not apply to functions", name);
3217 else if (code == TYPE_DECL)
3218 warning (OPT_Wattributes,
3219 "%qE attribute does not apply to types", name);
3220 else
3221 warning (OPT_Wattributes, "%qE attribute ignored", name);
3222
3223 *no_add_attrs = true;
3224 return NULL_TREE;
3225 }
3226
3227 /* Handle a "nothrow" attribute; arguments as in
3228 struct attribute_spec.handler. */
3229
3230 static tree
3231 handle_nothrow_attribute (tree *node, tree name, tree ARG_UNUSED (args),
3232 int ARG_UNUSED (flags), bool *no_add_attrs)
3233 {
3234 if (TREE_CODE (*node) == FUNCTION_DECL)
3235 TREE_NOTHROW (*node) = 1;
3236 /* ??? TODO: Support types. */
3237 else
3238 {
3239 warning (OPT_Wattributes, "%qE attribute ignored", name);
3240 *no_add_attrs = true;
3241 }
3242
3243 return NULL_TREE;
3244 }
3245
3246 /* Handle a "cleanup" attribute; arguments as in
3247 struct attribute_spec.handler. */
3248
3249 static tree
3250 handle_cleanup_attribute (tree *node, tree name, tree args,
3251 int ARG_UNUSED (flags), bool *no_add_attrs)
3252 {
3253 tree decl = *node;
3254 tree cleanup_id, cleanup_decl;
3255
3256 /* ??? Could perhaps support cleanups on TREE_STATIC, much like we do
3257 for global destructors in C++. This requires infrastructure that
3258 we don't have generically at the moment. It's also not a feature
3259 we'd be missing too much, since we do have attribute constructor. */
3260 if (!VAR_P (decl) || TREE_STATIC (decl))
3261 {
3262 warning (OPT_Wattributes, "%qE attribute ignored", name);
3263 *no_add_attrs = true;
3264 return NULL_TREE;
3265 }
3266
3267 /* Verify that the argument is a function in scope. */
3268 /* ??? We could support pointers to functions here as well, if
3269 that was considered desirable. */
3270 cleanup_id = TREE_VALUE (args);
3271 if (TREE_CODE (cleanup_id) != IDENTIFIER_NODE)
3272 {
3273 error ("cleanup argument not an identifier");
3274 *no_add_attrs = true;
3275 return NULL_TREE;
3276 }
3277 cleanup_decl = lookup_name (cleanup_id);
3278 if (!cleanup_decl || TREE_CODE (cleanup_decl) != FUNCTION_DECL)
3279 {
3280 error ("cleanup argument not a function");
3281 *no_add_attrs = true;
3282 return NULL_TREE;
3283 }
3284
3285 /* That the function has proper type is checked with the
3286 eventual call to build_function_call. */
3287
3288 return NULL_TREE;
3289 }
3290
3291 /* Handle a "warn_unused_result" attribute. No special handling. */
3292
3293 static tree
3294 handle_warn_unused_result_attribute (tree *node, tree name,
3295 tree ARG_UNUSED (args),
3296 int ARG_UNUSED (flags), bool *no_add_attrs)
3297 {
3298 /* Ignore the attribute for functions not returning any value. */
3299 if (VOID_TYPE_P (TREE_TYPE (*node)))
3300 {
3301 warning (OPT_Wattributes, "%qE attribute ignored", name);
3302 *no_add_attrs = true;
3303 }
3304
3305 return NULL_TREE;
3306 }
3307
3308 /* Handle a "sentinel" attribute. */
3309
3310 static tree
3311 handle_sentinel_attribute (tree *node, tree name, tree args,
3312 int ARG_UNUSED (flags), bool *no_add_attrs)
3313 {
3314 if (!prototype_p (*node))
3315 {
3316 warning (OPT_Wattributes,
3317 "%qE attribute requires prototypes with named arguments", name);
3318 *no_add_attrs = true;
3319 }
3320 else
3321 {
3322 if (!stdarg_p (*node))
3323 {
3324 warning (OPT_Wattributes,
3325 "%qE attribute only applies to variadic functions", name);
3326 *no_add_attrs = true;
3327 }
3328 }
3329
3330 if (args)
3331 {
3332 tree position = TREE_VALUE (args);
3333 if (position && TREE_CODE (position) != IDENTIFIER_NODE
3334 && TREE_CODE (position) != FUNCTION_DECL)
3335 position = default_conversion (position);
3336
3337 if (TREE_CODE (position) != INTEGER_CST
3338 || !INTEGRAL_TYPE_P (TREE_TYPE (position)))
3339 {
3340 warning (OPT_Wattributes,
3341 "requested position is not an integer constant");
3342 *no_add_attrs = true;
3343 }
3344 else
3345 {
3346 if (tree_int_cst_lt (position, integer_zero_node))
3347 {
3348 warning (OPT_Wattributes,
3349 "requested position is less than zero");
3350 *no_add_attrs = true;
3351 }
3352 }
3353 }
3354
3355 return NULL_TREE;
3356 }
3357
3358 /* Handle a "type_generic" attribute. */
3359
3360 static tree
3361 handle_type_generic_attribute (tree *node, tree ARG_UNUSED (name),
3362 tree ARG_UNUSED (args), int ARG_UNUSED (flags),
3363 bool * ARG_UNUSED (no_add_attrs))
3364 {
3365 /* Ensure we have a function type. */
3366 gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE);
3367
3368 /* Ensure we have a variadic function. */
3369 gcc_assert (!prototype_p (*node) || stdarg_p (*node));
3370
3371 return NULL_TREE;
3372 }
3373
3374 /* Handle a "target" attribute. */
3375
3376 static tree
3377 handle_target_attribute (tree *node, tree name, tree args, int flags,
3378 bool *no_add_attrs)
3379 {
3380 /* Ensure we have a function type. */
3381 if (TREE_CODE (*node) != FUNCTION_DECL)
3382 {
3383 warning (OPT_Wattributes, "%qE attribute ignored", name);
3384 *no_add_attrs = true;
3385 }
3386 else if (lookup_attribute ("target_clones", DECL_ATTRIBUTES (*node)))
3387 {
3388 warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
3389 "with %qs attribute", name, "target_clones");
3390 *no_add_attrs = true;
3391 }
3392 else if (! targetm.target_option.valid_attribute_p (*node, name, args,
3393 flags))
3394 *no_add_attrs = true;
3395
3396 /* Check that there's no empty string in values of the attribute. */
3397 for (tree t = args; t != NULL_TREE; t = TREE_CHAIN (t))
3398 {
3399 tree value = TREE_VALUE (t);
3400 if (TREE_CODE (value) == STRING_CST
3401 && TREE_STRING_LENGTH (value) == 1
3402 && TREE_STRING_POINTER (value)[0] == '\0')
3403 {
3404 warning (OPT_Wattributes, "empty string in attribute %<target%>");
3405 *no_add_attrs = true;
3406 }
3407 }
3408
3409 return NULL_TREE;
3410 }
3411
3412 /* Handle a "target_clones" attribute. */
3413
3414 static tree
3415 handle_target_clones_attribute (tree *node, tree name, tree ARG_UNUSED (args),
3416 int ARG_UNUSED (flags), bool *no_add_attrs)
3417 {
3418 /* Ensure we have a function type. */
3419 if (TREE_CODE (*node) == FUNCTION_DECL)
3420 {
3421 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (*node)))
3422 {
3423 warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
3424 "with %qs attribute", name, "always_inline");
3425 *no_add_attrs = true;
3426 }
3427 else if (lookup_attribute ("target", DECL_ATTRIBUTES (*node)))
3428 {
3429 warning (OPT_Wattributes, "%qE attribute ignored due to conflict "
3430 "with %qs attribute", name, "target");
3431 *no_add_attrs = true;
3432 }
3433 else
3434 /* Do not inline functions with multiple clone targets. */
3435 DECL_UNINLINABLE (*node) = 1;
3436 }
3437 else
3438 {
3439 warning (OPT_Wattributes, "%qE attribute ignored", name);
3440 *no_add_attrs = true;
3441 }
3442 return NULL_TREE;
3443 }
3444
3445 /* For handling "optimize" attribute. arguments as in
3446 struct attribute_spec.handler. */
3447
3448 static tree
3449 handle_optimize_attribute (tree *node, tree name, tree args,
3450 int ARG_UNUSED (flags), bool *no_add_attrs)
3451 {
3452 /* Ensure we have a function type. */
3453 if (TREE_CODE (*node) != FUNCTION_DECL)
3454 {
3455 warning (OPT_Wattributes, "%qE attribute ignored", name);
3456 *no_add_attrs = true;
3457 }
3458 else
3459 {
3460 struct cl_optimization cur_opts;
3461 tree old_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node);
3462
3463 /* Save current options. */
3464 cl_optimization_save (&cur_opts, &global_options);
3465
3466 /* If we previously had some optimization options, use them as the
3467 default. */
3468 if (old_opts)
3469 cl_optimization_restore (&global_options,
3470 TREE_OPTIMIZATION (old_opts));
3471
3472 /* Parse options, and update the vector. */
3473 parse_optimize_options (args, true);
3474 DECL_FUNCTION_SPECIFIC_OPTIMIZATION (*node)
3475 = build_optimization_node (&global_options);
3476
3477 /* Restore current options. */
3478 cl_optimization_restore (&global_options, &cur_opts);
3479 }
3480
3481 return NULL_TREE;
3482 }
3483
3484 /* Handle a "no_split_stack" attribute. */
3485
3486 static tree
3487 handle_no_split_stack_attribute (tree *node, tree name,
3488 tree ARG_UNUSED (args),
3489 int ARG_UNUSED (flags),
3490 bool *no_add_attrs)
3491 {
3492 tree decl = *node;
3493
3494 if (TREE_CODE (decl) != FUNCTION_DECL)
3495 {
3496 error_at (DECL_SOURCE_LOCATION (decl),
3497 "%qE attribute applies only to functions", name);
3498 *no_add_attrs = true;
3499 }
3500 else if (DECL_INITIAL (decl))
3501 {
3502 error_at (DECL_SOURCE_LOCATION (decl),
3503 "can%'t set %qE attribute after definition", name);
3504 *no_add_attrs = true;
3505 }
3506
3507 return NULL_TREE;
3508 }
3509
3510 /* Handle a "returns_nonnull" attribute; arguments as in
3511 struct attribute_spec.handler. */
3512
3513 static tree
3514 handle_returns_nonnull_attribute (tree *node, tree, tree, int,
3515 bool *no_add_attrs)
3516 {
3517 // Even without a prototype we still have a return type we can check.
3518 if (TREE_CODE (TREE_TYPE (*node)) != POINTER_TYPE)
3519 {
3520 error ("returns_nonnull attribute on a function not returning a pointer");
3521 *no_add_attrs = true;
3522 }
3523 return NULL_TREE;
3524 }
3525
3526 /* Handle a "designated_init" attribute; arguments as in
3527 struct attribute_spec.handler. */
3528
3529 static tree
3530 handle_designated_init_attribute (tree *node, tree name, tree, int,
3531 bool *no_add_attrs)
3532 {
3533 if (TREE_CODE (*node) != RECORD_TYPE)
3534 {
3535 error ("%qE attribute is only valid on %<struct%> type", name);
3536 *no_add_attrs = true;
3537 }
3538 return NULL_TREE;
3539 }
3540
3541
3542 /* Handle a "fallthrough" attribute; arguments as in struct
3543 attribute_spec.handler. */
3544
3545 static tree
3546 handle_fallthrough_attribute (tree *, tree name, tree, int,
3547 bool *no_add_attrs)
3548 {
3549 warning (OPT_Wattributes, "%qE attribute ignored", name);
3550 *no_add_attrs = true;
3551 return NULL_TREE;
3552 }
3553
3554 static tree
3555 handle_patchable_function_entry_attribute (tree *, tree, tree, int, bool *)
3556 {
3557 /* Nothing to be done here. */
3558 return NULL_TREE;
3559 }