Update gcc-50 to SVN version 221261
[dragonfly.git] / contrib / gcc-5.0 / gcc / c-family / c-pragma.c
1 /* Handle #pragma, system V.4 style.  Supports #pragma weak and #pragma pack.
2    Copyright (C) 1992-2015 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 "tm.h"
24 #include "hash-set.h"
25 #include "machmode.h"
26 #include "vec.h"
27 #include "double-int.h"
28 #include "input.h"
29 #include "alias.h"
30 #include "symtab.h"
31 #include "options.h"
32 #include "wide-int.h"
33 #include "inchash.h"
34 #include "tree.h"
35 #include "stringpool.h"
36 #include "attribs.h"
37 #include "varasm.h"
38 #include "hashtab.h"
39 #include "hash-set.h"
40 #include "vec.h"
41 #include "machmode.h"
42 #include "hard-reg-set.h"
43 #include "input.h"
44 #include "function.h"           /* For cfun.  FIXME: Does the parser know
45                                    when it is inside a function, so that
46                                    we don't have to look at cfun?  */
47 #include "cpplib.h"
48 #include "c-pragma.h"
49 #include "flags.h"
50 #include "c-common.h"
51 #include "tm_p.h"               /* For REGISTER_TARGET_PRAGMAS (why is
52                                    this not a target hook?).  */
53 #include "target.h"
54 #include "diagnostic.h"
55 #include "opts.h"
56 #include "plugin.h"
57 #include "hash-map.h"
58 #include "is-a.h"
59 #include "plugin-api.h"
60 #include "ipa-ref.h"
61 #include "cgraph.h"
62
63 #define GCC_BAD(gmsgid) \
64   do { warning (OPT_Wpragmas, gmsgid); return; } while (0)
65 #define GCC_BAD2(gmsgid, arg) \
66   do { warning (OPT_Wpragmas, gmsgid, arg); return; } while (0)
67
68 typedef struct GTY(()) align_stack {
69   int                  alignment;
70   tree                 id;
71   struct align_stack * prev;
72 } align_stack;
73
74 static GTY(()) struct align_stack * alignment_stack;
75
76 static void handle_pragma_pack (cpp_reader *);
77
78 /* If we have a "global" #pragma pack(<n>) in effect when the first
79    #pragma pack(push,<n>) is encountered, this stores the value of
80    maximum_field_alignment in effect.  When the final pop_alignment()
81    happens, we restore the value to this, not to a value of 0 for
82    maximum_field_alignment.  Value is in bits.  */
83 static int default_alignment;
84 #define SET_GLOBAL_ALIGNMENT(ALIGN) (maximum_field_alignment = *(alignment_stack == NULL \
85         ? &default_alignment \
86         : &alignment_stack->alignment) = (ALIGN))
87
88 static void push_alignment (int, tree);
89 static void pop_alignment (tree);
90
91 /* Push an alignment value onto the stack.  */
92 static void
93 push_alignment (int alignment, tree id)
94 {
95   align_stack * entry = ggc_alloc<align_stack> ();
96
97   entry->alignment  = alignment;
98   entry->id         = id;
99   entry->prev       = alignment_stack;
100
101   /* The current value of maximum_field_alignment is not necessarily
102      0 since there may be a #pragma pack(<n>) in effect; remember it
103      so that we can restore it after the final #pragma pop().  */
104   if (alignment_stack == NULL)
105     default_alignment = maximum_field_alignment;
106
107   alignment_stack = entry;
108
109   maximum_field_alignment = alignment;
110 }
111
112 /* Undo a push of an alignment onto the stack.  */
113 static void
114 pop_alignment (tree id)
115 {
116   align_stack * entry;
117
118   if (alignment_stack == NULL)
119     GCC_BAD ("#pragma pack (pop) encountered without matching #pragma pack (push)");
120
121   /* If we got an identifier, strip away everything above the target
122      entry so that the next step will restore the state just below it.  */
123   if (id)
124     {
125       for (entry = alignment_stack; entry; entry = entry->prev)
126         if (entry->id == id)
127           {
128             alignment_stack = entry;
129             break;
130           }
131       if (entry == NULL)
132         warning (OPT_Wpragmas, "\
133 #pragma pack(pop, %E) encountered without matching #pragma pack(push, %E)"
134                  , id, id);
135     }
136
137   entry = alignment_stack->prev;
138
139   maximum_field_alignment = entry ? entry->alignment : default_alignment;
140
141   alignment_stack = entry;
142 }
143
144 /* #pragma pack ()
145    #pragma pack (N)
146
147    #pragma pack (push)
148    #pragma pack (push, N)
149    #pragma pack (push, ID)
150    #pragma pack (push, ID, N)
151    #pragma pack (pop)
152    #pragma pack (pop, ID) */
153 static void
154 handle_pragma_pack (cpp_reader * ARG_UNUSED (dummy))
155 {
156   tree x, id = 0;
157   int align = -1;
158   enum cpp_ttype token;
159   enum { set, push, pop } action;
160
161   if (pragma_lex (&x) != CPP_OPEN_PAREN)
162     GCC_BAD ("missing %<(%> after %<#pragma pack%> - ignored");
163
164   token = pragma_lex (&x);
165   if (token == CPP_CLOSE_PAREN)
166     {
167       action = set;
168       align = initial_max_fld_align;
169     }
170   else if (token == CPP_NUMBER)
171     {
172       if (TREE_CODE (x) != INTEGER_CST)
173         GCC_BAD ("invalid constant in %<#pragma pack%> - ignored");
174       align = TREE_INT_CST_LOW (x);
175       action = set;
176       if (pragma_lex (&x) != CPP_CLOSE_PAREN)
177         GCC_BAD ("malformed %<#pragma pack%> - ignored");
178     }
179   else if (token == CPP_NAME)
180     {
181 #define GCC_BAD_ACTION do { if (action != pop) \
182           GCC_BAD ("malformed %<#pragma pack(push[, id][, <n>])%> - ignored"); \
183         else \
184           GCC_BAD ("malformed %<#pragma pack(pop[, id])%> - ignored"); \
185         } while (0)
186
187       const char *op = IDENTIFIER_POINTER (x);
188       if (!strcmp (op, "push"))
189         action = push;
190       else if (!strcmp (op, "pop"))
191         action = pop;
192       else
193         GCC_BAD2 ("unknown action %qE for %<#pragma pack%> - ignored", x);
194
195       while ((token = pragma_lex (&x)) == CPP_COMMA)
196         {
197           token = pragma_lex (&x);
198           if (token == CPP_NAME && id == 0)
199             {
200               id = x;
201             }
202           else if (token == CPP_NUMBER && action == push && align == -1)
203             {
204               if (TREE_CODE (x) != INTEGER_CST)
205                 GCC_BAD ("invalid constant in %<#pragma pack%> - ignored");
206               align = TREE_INT_CST_LOW (x);
207               if (align == -1)
208                 action = set;
209             }
210           else
211             GCC_BAD_ACTION;
212         }
213
214       if (token != CPP_CLOSE_PAREN)
215         GCC_BAD_ACTION;
216 #undef GCC_BAD_ACTION
217     }
218   else
219     GCC_BAD ("malformed %<#pragma pack%> - ignored");
220
221   if (pragma_lex (&x) != CPP_EOF)
222     warning (OPT_Wpragmas, "junk at end of %<#pragma pack%>");
223
224   if (flag_pack_struct)
225     GCC_BAD ("#pragma pack has no effect with -fpack-struct - ignored");
226
227   if (action != pop)
228     switch (align)
229       {
230       case 0:
231       case 1:
232       case 2:
233       case 4:
234       case 8:
235       case 16:
236         align *= BITS_PER_UNIT;
237         break;
238       case -1:
239         if (action == push)
240           {
241             align = maximum_field_alignment;
242             break;
243           }
244       default:
245         GCC_BAD2 ("alignment must be a small power of two, not %d", align);
246       }
247
248   switch (action)
249     {
250     case set:   SET_GLOBAL_ALIGNMENT (align);  break;
251     case push:  push_alignment (align, id);    break;
252     case pop:   pop_alignment (id);            break;
253     }
254 }
255
256 typedef struct GTY(()) pending_weak_d
257 {
258   tree name;
259   tree value;
260 } pending_weak;
261
262
263 static GTY(()) vec<pending_weak, va_gc> *pending_weaks;
264
265 static void apply_pragma_weak (tree, tree);
266 static void handle_pragma_weak (cpp_reader *);
267
268 static void
269 apply_pragma_weak (tree decl, tree value)
270 {
271   if (value)
272     {
273       value = build_string (IDENTIFIER_LENGTH (value),
274                             IDENTIFIER_POINTER (value));
275       decl_attributes (&decl, build_tree_list (get_identifier ("alias"),
276                                                build_tree_list (NULL, value)),
277                        0);
278     }
279
280   if (SUPPORTS_WEAK && DECL_EXTERNAL (decl) && TREE_USED (decl)
281       && !DECL_WEAK (decl) /* Don't complain about a redundant #pragma.  */
282       && DECL_ASSEMBLER_NAME_SET_P (decl)
283       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
284     warning (OPT_Wpragmas, "applying #pragma weak %q+D after first use "
285              "results in unspecified behavior", decl);
286
287   declare_weak (decl);
288 }
289
290 void
291 maybe_apply_pragma_weak (tree decl)
292 {
293   tree id;
294   int i;
295   pending_weak *pe;
296
297   /* Avoid asking for DECL_ASSEMBLER_NAME when it's not needed.  */
298
299   /* No weak symbols pending, take the short-cut.  */
300   if (vec_safe_is_empty (pending_weaks))
301     return;
302   /* If it's not visible outside this file, it doesn't matter whether
303      it's weak.  */
304   if (!DECL_EXTERNAL (decl) && !TREE_PUBLIC (decl))
305     return;
306   /* If it's not a function or a variable, it can't be weak.
307      FIXME: what kinds of things are visible outside this file but
308      aren't functions or variables?   Should this be an assert instead?  */
309   if (TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL)
310     return;
311
312   if (DECL_ASSEMBLER_NAME_SET_P (decl))
313     id = DECL_ASSEMBLER_NAME (decl);
314   else
315     {
316       id = DECL_ASSEMBLER_NAME (decl);
317       SET_DECL_ASSEMBLER_NAME (decl, NULL_TREE);
318     }
319
320   FOR_EACH_VEC_ELT (*pending_weaks, i, pe)
321     if (id == pe->name)
322       {
323         apply_pragma_weak (decl, pe->value);
324         pending_weaks->unordered_remove (i);
325         break;
326       }
327 }
328
329 /* Process all "#pragma weak A = B" directives where we have not seen
330    a decl for A.  */
331 void
332 maybe_apply_pending_pragma_weaks (void)
333 {
334   tree alias_id, id, decl;
335   int i;
336   pending_weak *pe;
337   symtab_node *target;
338
339   if (vec_safe_is_empty (pending_weaks))
340     return;
341
342   FOR_EACH_VEC_ELT (*pending_weaks, i, pe)
343     {
344       alias_id = pe->name;
345       id = pe->value;
346
347       if (id == NULL)
348         continue;
349
350       target = symtab_node::get_for_asmname (id);
351       decl = build_decl (UNKNOWN_LOCATION,
352                          target ? TREE_CODE (target->decl) : FUNCTION_DECL,
353                          alias_id, default_function_type);
354
355       DECL_ARTIFICIAL (decl) = 1;
356       TREE_PUBLIC (decl) = 1;
357       DECL_WEAK (decl) = 1;
358       if (TREE_CODE (decl) == VAR_DECL)
359         TREE_STATIC (decl) = 1;
360       if (!target)
361         {
362           error ("%q+D aliased to undefined symbol %qE",
363                  decl, id);
364           continue;
365         }
366
367       assemble_alias (decl, id);
368     }
369 }
370
371 /* #pragma weak name [= value] */
372 static void
373 handle_pragma_weak (cpp_reader * ARG_UNUSED (dummy))
374 {
375   tree name, value, x, decl;
376   enum cpp_ttype t;
377
378   value = 0;
379
380   if (pragma_lex (&name) != CPP_NAME)
381     GCC_BAD ("malformed #pragma weak, ignored");
382   t = pragma_lex (&x);
383   if (t == CPP_EQ)
384     {
385       if (pragma_lex (&value) != CPP_NAME)
386         GCC_BAD ("malformed #pragma weak, ignored");
387       t = pragma_lex (&x);
388     }
389   if (t != CPP_EOF)
390     warning (OPT_Wpragmas, "junk at end of %<#pragma weak%>");
391
392   decl = identifier_global_value (name);
393   if (decl && DECL_P (decl))
394     {
395       if (!VAR_OR_FUNCTION_DECL_P (decl))
396         GCC_BAD2 ("%<#pragma weak%> declaration of %q+D not allowed,"
397                   " ignored", decl);
398       apply_pragma_weak (decl, value);
399       if (value)
400         {
401           DECL_EXTERNAL (decl) = 0;
402           if (TREE_CODE (decl) == VAR_DECL)
403             TREE_STATIC (decl) = 1;
404           assemble_alias (decl, value);
405         }
406     }
407   else
408     {
409       pending_weak pe = {name, value};
410       vec_safe_push (pending_weaks, pe);
411     }
412 }
413
414 /* GCC supports two #pragma directives for renaming the external
415    symbol associated with a declaration (DECL_ASSEMBLER_NAME), for
416    compatibility with the Solaris and VMS system headers.  GCC also
417    has its own notation for this, __asm__("name") annotations.
418
419    Corner cases of these features and their interaction:
420
421    1) Both pragmas silently apply only to declarations with external
422       linkage (that is, TREE_PUBLIC || DECL_EXTERNAL).  Asm labels
423       do not have this restriction.
424
425    2) In C++, both #pragmas silently apply only to extern "C" declarations.
426       Asm labels do not have this restriction.
427
428    3) If any of the three ways of changing DECL_ASSEMBLER_NAME is
429       applied to a decl whose DECL_ASSEMBLER_NAME is already set, and the
430       new name is different, a warning issues and the name does not change.
431
432    4) The "source name" for #pragma redefine_extname is the DECL_NAME,
433       *not* the DECL_ASSEMBLER_NAME.
434
435    5) If #pragma extern_prefix is in effect and a declaration occurs
436       with an __asm__ name, the #pragma extern_prefix is silently
437       ignored for that declaration.
438
439    6) If #pragma extern_prefix and #pragma redefine_extname apply to
440       the same declaration, whichever triggered first wins, and a warning
441       is issued.  (We would like to have #pragma redefine_extname always
442       win, but it can appear either before or after the declaration, and
443       if it appears afterward, we have no way of knowing whether a modified
444       DECL_ASSEMBLER_NAME is due to #pragma extern_prefix.)  */
445
446 typedef struct GTY(()) pending_redefinition_d {
447   tree oldname;
448   tree newname;
449 } pending_redefinition;
450
451
452 static GTY(()) vec<pending_redefinition, va_gc> *pending_redefine_extname;
453
454 static void handle_pragma_redefine_extname (cpp_reader *);
455
456 /* #pragma redefine_extname oldname newname */
457 static void
458 handle_pragma_redefine_extname (cpp_reader * ARG_UNUSED (dummy))
459 {
460   tree oldname, newname, decls, x;
461   enum cpp_ttype t;
462   bool found;
463
464   if (pragma_lex (&oldname) != CPP_NAME)
465     GCC_BAD ("malformed #pragma redefine_extname, ignored");
466   if (pragma_lex (&newname) != CPP_NAME)
467     GCC_BAD ("malformed #pragma redefine_extname, ignored");
468   t = pragma_lex (&x);
469   if (t != CPP_EOF)
470     warning (OPT_Wpragmas, "junk at end of %<#pragma redefine_extname%>");
471
472   found = false;
473   for (decls = c_linkage_bindings (oldname);
474        decls; )
475     {
476       tree decl;
477       if (TREE_CODE (decls) == TREE_LIST)
478         {
479           decl = TREE_VALUE (decls);
480           decls = TREE_CHAIN (decls);
481         }
482       else
483         {
484           decl = decls;
485           decls = NULL_TREE;
486         }
487
488       if ((TREE_PUBLIC (decl) || DECL_EXTERNAL (decl))
489           && (TREE_CODE (decl) == FUNCTION_DECL
490               || TREE_CODE (decl) == VAR_DECL))
491         {
492           found = true;
493           if (DECL_ASSEMBLER_NAME_SET_P (decl))
494             {
495               const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
496               name = targetm.strip_name_encoding (name);
497
498               if (strcmp (name, IDENTIFIER_POINTER (newname)))
499                 warning (OPT_Wpragmas, "#pragma redefine_extname ignored due to "
500                          "conflict with previous rename");
501             }
502           else
503             symtab->change_decl_assembler_name (decl, newname);
504         }
505     }
506
507   if (!found)
508     /* We have to add this to the rename list even if there's already
509        a global value that doesn't meet the above criteria, because in
510        C++ "struct foo {...};" puts "foo" in the current namespace but
511        does *not* conflict with a subsequent declaration of a function
512        or variable foo.  See g++.dg/other/pragma-re-2.C.  */
513     add_to_renaming_pragma_list (oldname, newname);
514 }
515
516 /* This is called from here and from ia64-c.c.  */
517 void
518 add_to_renaming_pragma_list (tree oldname, tree newname)
519 {
520   unsigned ix;
521   pending_redefinition *p;
522
523   FOR_EACH_VEC_SAFE_ELT (pending_redefine_extname, ix, p)
524     if (oldname == p->oldname)
525       {
526         if (p->newname != newname)
527           warning (OPT_Wpragmas, "#pragma redefine_extname ignored due to "
528                    "conflict with previous #pragma redefine_extname");
529         return;
530       }
531
532   pending_redefinition e = {oldname, newname};
533   vec_safe_push (pending_redefine_extname, e);
534 }
535
536 /* The current prefix set by #pragma extern_prefix.  */
537 GTY(()) tree pragma_extern_prefix;
538
539 /* Hook from the front ends to apply the results of one of the preceding
540    pragmas that rename variables.  */
541
542 tree
543 maybe_apply_renaming_pragma (tree decl, tree asmname)
544 {
545   unsigned ix;
546   pending_redefinition *p;
547
548   /* The renaming pragmas are only applied to declarations with
549      external linkage.  */
550   if ((TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL)
551       || (!TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl))
552       || !has_c_linkage (decl))
553     return asmname;
554
555   /* If the DECL_ASSEMBLER_NAME is already set, it does not change,
556      but we may warn about a rename that conflicts.  */
557   if (DECL_ASSEMBLER_NAME_SET_P (decl))
558     {
559       const char *oldname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
560       oldname = targetm.strip_name_encoding (oldname);
561
562       if (asmname && strcmp (TREE_STRING_POINTER (asmname), oldname))
563           warning (OPT_Wpragmas, "asm declaration ignored due to "
564                    "conflict with previous rename");
565
566       /* Take any pending redefine_extname off the list.  */
567       FOR_EACH_VEC_SAFE_ELT (pending_redefine_extname, ix, p)
568         if (DECL_NAME (decl) == p->oldname)
569           {
570             /* Only warn if there is a conflict.  */
571             if (strcmp (IDENTIFIER_POINTER (p->newname), oldname))
572               warning (OPT_Wpragmas, "#pragma redefine_extname ignored due to "
573                        "conflict with previous rename");
574
575             pending_redefine_extname->unordered_remove (ix);
576             break;
577           }
578       return 0;
579     }
580
581   /* Find out if we have a pending #pragma redefine_extname.  */
582   FOR_EACH_VEC_SAFE_ELT (pending_redefine_extname, ix, p)
583     if (DECL_NAME (decl) == p->oldname)
584       {
585         tree newname = p->newname;
586         pending_redefine_extname->unordered_remove (ix);
587
588         /* If we already have an asmname, #pragma redefine_extname is
589            ignored (with a warning if it conflicts).  */
590         if (asmname)
591           {
592             if (strcmp (TREE_STRING_POINTER (asmname),
593                         IDENTIFIER_POINTER (newname)) != 0)
594               warning (OPT_Wpragmas, "#pragma redefine_extname ignored due to "
595                        "conflict with __asm__ declaration");
596             return asmname;
597           }
598
599         /* Otherwise we use what we've got; #pragma extern_prefix is
600            silently ignored.  */
601         return build_string (IDENTIFIER_LENGTH (newname),
602                              IDENTIFIER_POINTER (newname));
603       }
604
605   /* If we've got an asmname, #pragma extern_prefix is silently ignored.  */
606   if (asmname)
607     return asmname;
608
609   /* If #pragma extern_prefix is in effect, apply it.  */
610   if (pragma_extern_prefix)
611     {
612       const char *prefix = TREE_STRING_POINTER (pragma_extern_prefix);
613       size_t plen = TREE_STRING_LENGTH (pragma_extern_prefix) - 1;
614
615       const char *id = IDENTIFIER_POINTER (DECL_NAME (decl));
616       size_t ilen = IDENTIFIER_LENGTH (DECL_NAME (decl));
617
618       char *newname = (char *) alloca (plen + ilen + 1);
619
620       memcpy (newname,        prefix, plen);
621       memcpy (newname + plen, id, ilen + 1);
622
623       return build_string (plen + ilen, newname);
624     }
625
626   /* Nada.  */
627   return 0;
628 }
629
630
631 static void handle_pragma_visibility (cpp_reader *);
632
633 static vec<int> visstack;
634
635 /* Push the visibility indicated by STR onto the top of the #pragma
636    visibility stack.  KIND is 0 for #pragma GCC visibility, 1 for
637    C++ namespace with visibility attribute and 2 for C++ builtin
638    ABI namespace.  push_visibility/pop_visibility calls must have
639    matching KIND, it is not allowed to push visibility using one
640    KIND and pop using a different one.  */
641
642 void
643 push_visibility (const char *str, int kind)
644 {
645   visstack.safe_push (((int) default_visibility) | (kind << 8));
646   if (!strcmp (str, "default"))
647     default_visibility = VISIBILITY_DEFAULT;
648   else if (!strcmp (str, "internal"))
649     default_visibility = VISIBILITY_INTERNAL;
650   else if (!strcmp (str, "hidden"))
651     default_visibility = VISIBILITY_HIDDEN;
652   else if (!strcmp (str, "protected"))
653     default_visibility = VISIBILITY_PROTECTED;
654   else
655     GCC_BAD ("#pragma GCC visibility push() must specify default, internal, hidden or protected");
656   visibility_options.inpragma = 1;
657 }
658
659 /* Pop a level of the #pragma visibility stack.  Return true if
660    successful.  */
661
662 bool
663 pop_visibility (int kind)
664 {
665   if (!visstack.length ())
666     return false;
667   if ((visstack.last () >> 8) != kind)
668     return false;
669   default_visibility
670     = (enum symbol_visibility) (visstack.pop () & 0xff);
671   visibility_options.inpragma
672     = visstack.length () != 0;
673   return true;
674 }
675
676 /* Sets the default visibility for symbols to something other than that
677    specified on the command line.  */
678
679 static void
680 handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED)
681 {
682   /* Form is #pragma GCC visibility push(hidden)|pop */
683   tree x;
684   enum cpp_ttype token;
685   enum { bad, push, pop } action = bad;
686
687   token = pragma_lex (&x);
688   if (token == CPP_NAME)
689     {
690       const char *op = IDENTIFIER_POINTER (x);
691       if (!strcmp (op, "push"))
692         action = push;
693       else if (!strcmp (op, "pop"))
694         action = pop;
695     }
696   if (bad == action)
697     GCC_BAD ("#pragma GCC visibility must be followed by push or pop");
698   else
699     {
700       if (pop == action)
701         {
702           if (! pop_visibility (0))
703             GCC_BAD ("no matching push for %<#pragma GCC visibility pop%>");
704         }
705       else
706         {
707           if (pragma_lex (&x) != CPP_OPEN_PAREN)
708             GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
709           token = pragma_lex (&x);
710           if (token != CPP_NAME)
711             GCC_BAD ("malformed #pragma GCC visibility push");
712           else
713             push_visibility (IDENTIFIER_POINTER (x), 0);
714           if (pragma_lex (&x) != CPP_CLOSE_PAREN)
715             GCC_BAD ("missing %<(%> after %<#pragma GCC visibility push%> - ignored");
716         }
717     }
718   if (pragma_lex (&x) != CPP_EOF)
719     warning (OPT_Wpragmas, "junk at end of %<#pragma GCC visibility%>");
720 }
721
722 static void
723 handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy))
724 {
725   const char *kind_string, *option_string;
726   unsigned int option_index;
727   enum cpp_ttype token;
728   diagnostic_t kind;
729   tree x;
730   struct cl_option_handlers handlers;
731
732   token = pragma_lex (&x);
733   if (token != CPP_NAME)
734     GCC_BAD ("missing [error|warning|ignored] after %<#pragma GCC diagnostic%>");
735   kind_string = IDENTIFIER_POINTER (x);
736   if (strcmp (kind_string, "error") == 0)
737     kind = DK_ERROR;
738   else if (strcmp (kind_string, "warning") == 0)
739     kind = DK_WARNING;
740   else if (strcmp (kind_string, "ignored") == 0)
741     kind = DK_IGNORED;
742   else if (strcmp (kind_string, "push") == 0)
743     {
744       diagnostic_push_diagnostics (global_dc, input_location);
745       return;
746     }
747   else if (strcmp (kind_string, "pop") == 0)
748     {
749       diagnostic_pop_diagnostics (global_dc, input_location);
750       return;
751     }
752   else
753     GCC_BAD ("expected [error|warning|ignored|push|pop] after %<#pragma GCC diagnostic%>");
754
755   token = pragma_lex (&x);
756   if (token != CPP_STRING)
757     GCC_BAD ("missing option after %<#pragma GCC diagnostic%> kind");
758   option_string = TREE_STRING_POINTER (x);
759   set_default_handlers (&handlers);
760   for (option_index = 0; option_index < cl_options_count; option_index++)
761     if (strcmp (cl_options[option_index].opt_text, option_string) == 0)
762       {
763         control_warning_option (option_index, (int) kind, kind != DK_IGNORED,
764                                 input_location, c_family_lang_mask, &handlers,
765                                 &global_options, &global_options_set,
766                                 global_dc);
767         return;
768       }
769   GCC_BAD ("unknown option after %<#pragma GCC diagnostic%> kind");
770 }
771
772 /*  Parse #pragma GCC target (xxx) to set target specific options.  */
773 static void
774 handle_pragma_target(cpp_reader *ARG_UNUSED(dummy))
775 {
776   enum cpp_ttype token;
777   tree x;
778   bool close_paren_needed_p = false;
779
780   if (cfun)
781     {
782       error ("#pragma GCC option is not allowed inside functions");
783       return;
784     }
785
786   token = pragma_lex (&x);
787   if (token == CPP_OPEN_PAREN)
788     {
789       close_paren_needed_p = true;
790       token = pragma_lex (&x);
791     }
792
793   if (token != CPP_STRING)
794     {
795       GCC_BAD ("%<#pragma GCC option%> is not a string");
796       return;
797     }
798
799   /* Strings are user options.  */
800   else
801     {
802       tree args = NULL_TREE;
803
804       do
805         {
806           /* Build up the strings now as a tree linked list.  Skip empty
807              strings.  */
808           if (TREE_STRING_LENGTH (x) > 0)
809             args = tree_cons (NULL_TREE, x, args);
810
811           token = pragma_lex (&x);
812           while (token == CPP_COMMA)
813             token = pragma_lex (&x);
814         }
815       while (token == CPP_STRING);
816
817       if (close_paren_needed_p)
818         {
819           if (token == CPP_CLOSE_PAREN)
820             token = pragma_lex (&x);
821           else
822             GCC_BAD ("%<#pragma GCC target (string [,string]...)%> does "
823                      "not have a final %<)%>");
824         }
825
826       if (token != CPP_EOF)
827         {
828           error ("#pragma GCC target string... is badly formed");
829           return;
830         }
831
832       /* put arguments in the order the user typed them.  */
833       args = nreverse (args);
834
835       if (targetm.target_option.pragma_parse (args, NULL_TREE))
836         current_target_pragma = args;
837     }
838 }
839
840 /* Handle #pragma GCC optimize to set optimization options.  */
841 static void
842 handle_pragma_optimize (cpp_reader *ARG_UNUSED(dummy))
843 {
844   enum cpp_ttype token;
845   tree x;
846   bool close_paren_needed_p = false;
847   tree optimization_previous_node = optimization_current_node;
848
849   if (cfun)
850     {
851       error ("#pragma GCC optimize is not allowed inside functions");
852       return;
853     }
854
855   token = pragma_lex (&x);
856   if (token == CPP_OPEN_PAREN)
857     {
858       close_paren_needed_p = true;
859       token = pragma_lex (&x);
860     }
861
862   if (token != CPP_STRING && token != CPP_NUMBER)
863     {
864       GCC_BAD ("%<#pragma GCC optimize%> is not a string or number");
865       return;
866     }
867
868   /* Strings/numbers are user options.  */
869   else
870     {
871       tree args = NULL_TREE;
872
873       do
874         {
875           /* Build up the numbers/strings now as a list.  */
876           if (token != CPP_STRING || TREE_STRING_LENGTH (x) > 0)
877             args = tree_cons (NULL_TREE, x, args);
878
879           token = pragma_lex (&x);
880           while (token == CPP_COMMA)
881             token = pragma_lex (&x);
882         }
883       while (token == CPP_STRING || token == CPP_NUMBER);
884
885       if (close_paren_needed_p)
886         {
887           if (token == CPP_CLOSE_PAREN)
888             token = pragma_lex (&x);
889           else
890             GCC_BAD ("%<#pragma GCC optimize (string [,string]...)%> does "
891                      "not have a final %<)%>");
892         }
893
894       if (token != CPP_EOF)
895         {
896           error ("#pragma GCC optimize string... is badly formed");
897           return;
898         }
899
900       /* put arguments in the order the user typed them.  */
901       args = nreverse (args);
902
903       parse_optimize_options (args, false);
904       current_optimize_pragma = chainon (current_optimize_pragma, args);
905       optimization_current_node = build_optimization_node (&global_options);
906       c_cpp_builtins_optimize_pragma (parse_in,
907                                       optimization_previous_node,
908                                       optimization_current_node);
909     }
910 }
911
912 /* Stack of the #pragma GCC options created with #pragma GCC push_option.  Save
913    both the binary representation of the options and the TREE_LIST of
914    strings that will be added to the function's attribute list.  */
915 typedef struct GTY(()) opt_stack {
916   struct opt_stack *prev;
917   tree target_binary;
918   tree target_strings;
919   tree optimize_binary;
920   tree optimize_strings;
921 } opt_stack;
922
923 static GTY(()) struct opt_stack * options_stack;
924
925 /* Handle #pragma GCC push_options to save the current target and optimization
926    options.  */
927
928 static void
929 handle_pragma_push_options (cpp_reader *ARG_UNUSED(dummy))
930 {
931   enum cpp_ttype token;
932   tree x = 0;
933
934   token = pragma_lex (&x);
935   if (token != CPP_EOF)
936     {
937       warning (OPT_Wpragmas, "junk at end of %<#pragma push_options%>");
938       return;
939     }
940
941   opt_stack *p = ggc_alloc<opt_stack> ();
942   p->prev = options_stack;
943   options_stack = p;
944
945   /* Save optimization and target flags in binary format.  */
946   p->optimize_binary = build_optimization_node (&global_options);
947   p->target_binary = build_target_option_node (&global_options);
948
949   /* Save optimization and target flags in string list format.  */
950   p->optimize_strings = copy_list (current_optimize_pragma);
951   p->target_strings = copy_list (current_target_pragma);
952 }
953
954 /* Handle #pragma GCC pop_options to restore the current target and
955    optimization options from a previous push_options.  */
956
957 static void
958 handle_pragma_pop_options (cpp_reader *ARG_UNUSED(dummy))
959 {
960   enum cpp_ttype token;
961   tree x = 0;
962   opt_stack *p;
963
964   token = pragma_lex (&x);
965   if (token != CPP_EOF)
966     {
967       warning (OPT_Wpragmas, "junk at end of %<#pragma pop_options%>");
968       return;
969     }
970
971   if (! options_stack)
972     {
973       warning (OPT_Wpragmas,
974                "%<#pragma GCC pop_options%> without a corresponding "
975                "%<#pragma GCC push_options%>");
976       return;
977     }
978
979   p = options_stack;
980   options_stack = p->prev;
981
982   if (p->target_binary != target_option_current_node)
983     {
984       (void) targetm.target_option.pragma_parse (NULL_TREE, p->target_binary);
985       target_option_current_node = p->target_binary;
986     }
987
988   if (p->optimize_binary != optimization_current_node)
989     {
990       tree old_optimize = optimization_current_node;
991       cl_optimization_restore (&global_options,
992                                TREE_OPTIMIZATION (p->optimize_binary));
993       c_cpp_builtins_optimize_pragma (parse_in, old_optimize,
994                                       p->optimize_binary);
995       optimization_current_node = p->optimize_binary;
996     }
997
998   current_target_pragma = p->target_strings;
999   current_optimize_pragma = p->optimize_strings;
1000 }
1001
1002 /* Handle #pragma GCC reset_options to restore the current target and
1003    optimization options to the original options used on the command line.  */
1004
1005 static void
1006 handle_pragma_reset_options (cpp_reader *ARG_UNUSED(dummy))
1007 {
1008   enum cpp_ttype token;
1009   tree x = 0;
1010   tree new_optimize = optimization_default_node;
1011   tree new_target = target_option_default_node;
1012
1013   token = pragma_lex (&x);
1014   if (token != CPP_EOF)
1015     {
1016       warning (OPT_Wpragmas, "junk at end of %<#pragma reset_options%>");
1017       return;
1018     }
1019
1020   if (new_target != target_option_current_node)
1021     {
1022       (void) targetm.target_option.pragma_parse (NULL_TREE, new_target);
1023       target_option_current_node = new_target;
1024     }
1025
1026   if (new_optimize != optimization_current_node)
1027     {
1028       tree old_optimize = optimization_current_node;
1029       cl_optimization_restore (&global_options,
1030                                TREE_OPTIMIZATION (new_optimize));
1031       c_cpp_builtins_optimize_pragma (parse_in, old_optimize, new_optimize);
1032       optimization_current_node = new_optimize;
1033     }
1034
1035   current_target_pragma = NULL_TREE;
1036   current_optimize_pragma = NULL_TREE;
1037 }
1038
1039 /* Print a plain user-specified message.  */
1040
1041 static void
1042 handle_pragma_message (cpp_reader *ARG_UNUSED(dummy))
1043 {
1044   enum cpp_ttype token;
1045   tree x, message = 0;
1046
1047   token = pragma_lex (&x);
1048   if (token == CPP_OPEN_PAREN)
1049     {
1050       token = pragma_lex (&x);
1051       if (token == CPP_STRING)
1052         message = x;
1053       else
1054         GCC_BAD ("expected a string after %<#pragma message%>");
1055       if (pragma_lex (&x) != CPP_CLOSE_PAREN)
1056         GCC_BAD ("malformed %<#pragma message%>, ignored");
1057     }
1058   else if (token == CPP_STRING)
1059     message = x;
1060   else
1061     GCC_BAD ("expected a string after %<#pragma message%>");
1062
1063   gcc_assert (message);
1064
1065   if (pragma_lex (&x) != CPP_EOF)
1066     warning (OPT_Wpragmas, "junk at end of %<#pragma message%>");
1067
1068   if (TREE_STRING_LENGTH (message) > 1)
1069     inform (input_location, "#pragma message: %s", TREE_STRING_POINTER (message));
1070 }
1071
1072 /* Mark whether the current location is valid for a STDC pragma.  */
1073
1074 static bool valid_location_for_stdc_pragma;
1075
1076 void
1077 mark_valid_location_for_stdc_pragma (bool flag)
1078 {
1079   valid_location_for_stdc_pragma = flag;
1080 }
1081
1082 /* Return true if the current location is valid for a STDC pragma.  */
1083
1084 bool
1085 valid_location_for_stdc_pragma_p (void)
1086 {
1087   return valid_location_for_stdc_pragma;
1088 }
1089
1090 enum pragma_switch_t { PRAGMA_ON, PRAGMA_OFF, PRAGMA_DEFAULT, PRAGMA_BAD };
1091
1092 /* A STDC pragma must appear outside of external declarations or
1093    preceding all explicit declarations and statements inside a compound
1094    statement; its behavior is undefined if used in any other context.
1095    It takes a switch of ON, OFF, or DEFAULT.  */
1096
1097 static enum pragma_switch_t
1098 handle_stdc_pragma (const char *pname)
1099 {
1100   const char *arg;
1101   tree t;
1102   enum pragma_switch_t ret;
1103
1104   if (!valid_location_for_stdc_pragma_p ())
1105     {
1106       warning (OPT_Wpragmas, "invalid location for %<pragma %s%>, ignored",
1107                pname);
1108       return PRAGMA_BAD;
1109     }
1110
1111   if (pragma_lex (&t) != CPP_NAME)
1112     {
1113       warning (OPT_Wpragmas, "malformed %<#pragma %s%>, ignored", pname);
1114       return PRAGMA_BAD;
1115     }
1116
1117   arg = IDENTIFIER_POINTER (t);
1118
1119   if (!strcmp (arg, "ON"))
1120     ret = PRAGMA_ON;
1121   else if (!strcmp (arg, "OFF"))
1122     ret = PRAGMA_OFF;
1123   else if (!strcmp (arg, "DEFAULT"))
1124     ret = PRAGMA_DEFAULT;
1125   else
1126     {
1127       warning (OPT_Wpragmas, "malformed %<#pragma %s%>, ignored", pname);
1128       return PRAGMA_BAD;
1129     }
1130
1131   if (pragma_lex (&t) != CPP_EOF)
1132     {
1133       warning (OPT_Wpragmas, "junk at end of %<#pragma %s%>", pname);
1134       return PRAGMA_BAD;
1135     }
1136
1137   return ret;
1138 }
1139
1140 /* #pragma STDC FLOAT_CONST_DECIMAL64 ON
1141    #pragma STDC FLOAT_CONST_DECIMAL64 OFF
1142    #pragma STDC FLOAT_CONST_DECIMAL64 DEFAULT */
1143
1144 static void
1145 handle_pragma_float_const_decimal64 (cpp_reader *ARG_UNUSED (dummy))
1146 {
1147   if (c_dialect_cxx ())
1148     {
1149       if (warn_unknown_pragmas > in_system_header_at (input_location))
1150         warning (OPT_Wunknown_pragmas,
1151                  "%<#pragma STDC FLOAT_CONST_DECIMAL64%> is not supported"
1152                  " for C++");
1153       return;
1154     }
1155
1156   if (!targetm.decimal_float_supported_p ())
1157     {
1158       if (warn_unknown_pragmas > in_system_header_at (input_location))
1159         warning (OPT_Wunknown_pragmas,
1160                  "%<#pragma STDC FLOAT_CONST_DECIMAL64%> is not supported"
1161                  " on this target");
1162       return;
1163     }
1164
1165   pedwarn (input_location, OPT_Wpedantic,
1166            "ISO C does not support %<#pragma STDC FLOAT_CONST_DECIMAL64%>");
1167
1168   switch (handle_stdc_pragma ("STDC FLOAT_CONST_DECIMAL64"))
1169     {
1170     case PRAGMA_ON:
1171       set_float_const_decimal64 ();
1172       break;
1173     case PRAGMA_OFF:
1174     case PRAGMA_DEFAULT:
1175       clear_float_const_decimal64 ();
1176       break;
1177     case PRAGMA_BAD:
1178       break;
1179     }
1180 }
1181
1182 /* A vector of registered pragma callbacks, which is never freed.   */
1183
1184 static vec<internal_pragma_handler> registered_pragmas;
1185
1186 typedef struct
1187 {
1188   const char *space;
1189   const char *name;
1190 } pragma_ns_name;
1191
1192
1193 static vec<pragma_ns_name> registered_pp_pragmas;
1194
1195 struct omp_pragma_def { const char *name; unsigned int id; };
1196 static const struct omp_pragma_def oacc_pragmas[] = {
1197   { "cache", PRAGMA_OACC_CACHE },
1198   { "data", PRAGMA_OACC_DATA },
1199   { "enter", PRAGMA_OACC_ENTER_DATA },
1200   { "exit", PRAGMA_OACC_EXIT_DATA },
1201   { "kernels", PRAGMA_OACC_KERNELS },
1202   { "loop", PRAGMA_OACC_LOOP },
1203   { "parallel", PRAGMA_OACC_PARALLEL },
1204   { "update", PRAGMA_OACC_UPDATE },
1205   { "wait", PRAGMA_OACC_WAIT }
1206 };
1207 static const struct omp_pragma_def omp_pragmas[] = {
1208   { "atomic", PRAGMA_OMP_ATOMIC },
1209   { "barrier", PRAGMA_OMP_BARRIER },
1210   { "cancel", PRAGMA_OMP_CANCEL },
1211   { "cancellation", PRAGMA_OMP_CANCELLATION_POINT },
1212   { "critical", PRAGMA_OMP_CRITICAL },
1213   { "end", PRAGMA_OMP_END_DECLARE_TARGET },
1214   { "flush", PRAGMA_OMP_FLUSH },
1215   { "master", PRAGMA_OMP_MASTER },
1216   { "ordered", PRAGMA_OMP_ORDERED },
1217   { "section", PRAGMA_OMP_SECTION },
1218   { "sections", PRAGMA_OMP_SECTIONS },
1219   { "single", PRAGMA_OMP_SINGLE },
1220   { "task", PRAGMA_OMP_TASK },
1221   { "taskgroup", PRAGMA_OMP_TASKGROUP },
1222   { "taskwait", PRAGMA_OMP_TASKWAIT },
1223   { "taskyield", PRAGMA_OMP_TASKYIELD },
1224   { "threadprivate", PRAGMA_OMP_THREADPRIVATE }
1225 };
1226 static const struct omp_pragma_def omp_pragmas_simd[] = {
1227   { "declare", PRAGMA_OMP_DECLARE_REDUCTION },
1228   { "distribute", PRAGMA_OMP_DISTRIBUTE },
1229   { "for", PRAGMA_OMP_FOR },
1230   { "parallel", PRAGMA_OMP_PARALLEL },
1231   { "simd", PRAGMA_OMP_SIMD },
1232   { "target", PRAGMA_OMP_TARGET },
1233   { "teams", PRAGMA_OMP_TEAMS },
1234 };
1235
1236 void
1237 c_pp_lookup_pragma (unsigned int id, const char **space, const char **name)
1238 {
1239   const int n_oacc_pragmas = sizeof (oacc_pragmas) / sizeof (*oacc_pragmas);
1240   const int n_omp_pragmas = sizeof (omp_pragmas) / sizeof (*omp_pragmas);
1241   const int n_omp_pragmas_simd = sizeof (omp_pragmas_simd)
1242                                  / sizeof (*omp_pragmas);
1243   int i;
1244
1245   for (i = 0; i < n_oacc_pragmas; ++i)
1246     if (oacc_pragmas[i].id == id)
1247       {
1248         *space = "acc";
1249         *name = oacc_pragmas[i].name;
1250         return;
1251       }
1252
1253   for (i = 0; i < n_omp_pragmas; ++i)
1254     if (omp_pragmas[i].id == id)
1255       {
1256         *space = "omp";
1257         *name = omp_pragmas[i].name;
1258         return;
1259       }
1260
1261   for (i = 0; i < n_omp_pragmas_simd; ++i)
1262     if (omp_pragmas_simd[i].id == id)
1263       {
1264         *space = "omp";
1265         *name = omp_pragmas_simd[i].name;
1266         return;
1267       }
1268
1269   if (id == PRAGMA_CILK_SIMD)
1270     {
1271       *space = NULL;
1272       *name = "simd";
1273       return;
1274     }
1275
1276   if (id >= PRAGMA_FIRST_EXTERNAL
1277       && (id < PRAGMA_FIRST_EXTERNAL + registered_pp_pragmas.length ()))
1278     {
1279       *space = registered_pp_pragmas[id - PRAGMA_FIRST_EXTERNAL].space;
1280       *name = registered_pp_pragmas[id - PRAGMA_FIRST_EXTERNAL].name;
1281       return;
1282     }
1283
1284   gcc_unreachable ();
1285 }
1286
1287 /* Front-end wrappers for pragma registration to avoid dragging
1288    cpplib.h in almost everywhere.  */
1289
1290 static void
1291 c_register_pragma_1 (const char *space, const char *name,
1292                      internal_pragma_handler ihandler, bool allow_expansion)
1293 {
1294   unsigned id;
1295
1296   if (flag_preprocess_only)
1297     {
1298       pragma_ns_name ns_name;
1299
1300       if (!allow_expansion)
1301         return;
1302
1303       ns_name.space = space;
1304       ns_name.name = name;
1305       registered_pp_pragmas.safe_push (ns_name);
1306       id = registered_pp_pragmas.length ();
1307       id += PRAGMA_FIRST_EXTERNAL - 1;
1308     }
1309   else
1310     {
1311       registered_pragmas.safe_push (ihandler);
1312       id = registered_pragmas.length ();
1313       id += PRAGMA_FIRST_EXTERNAL - 1;
1314
1315       /* The C++ front end allocates 6 bits in cp_token; the C front end
1316          allocates 7 bits in c_token.  At present this is sufficient.  */
1317       gcc_assert (id < 64);
1318     }
1319
1320   cpp_register_deferred_pragma (parse_in, space, name, id,
1321                                 allow_expansion, false);
1322 }
1323
1324 /* Register a C pragma handler, using a space and a name.  It disallows pragma
1325    expansion (if you want it, use c_register_pragma_with_expansion instead).  */
1326 void
1327 c_register_pragma (const char *space, const char *name,
1328                    pragma_handler_1arg handler)
1329 {
1330   internal_pragma_handler ihandler;
1331
1332   ihandler.handler.handler_1arg = handler;
1333   ihandler.extra_data = false;
1334   ihandler.data = NULL;
1335   c_register_pragma_1 (space, name, ihandler, false);
1336 }
1337
1338 /* Register a C pragma handler, using a space and a name, it also carries an
1339    extra data field which can be used by the handler.  It disallows pragma
1340    expansion (if you want it, use c_register_pragma_with_expansion_and_data
1341    instead).  */
1342 void
1343 c_register_pragma_with_data (const char *space, const char *name,
1344                              pragma_handler_2arg handler, void * data)
1345 {
1346   internal_pragma_handler ihandler;
1347
1348   ihandler.handler.handler_2arg = handler;
1349   ihandler.extra_data = true;
1350   ihandler.data = data;
1351   c_register_pragma_1 (space, name, ihandler, false);
1352 }
1353
1354 /* Register a C pragma handler, using a space and a name.  It allows pragma
1355    expansion as in the following example:
1356
1357    #define NUMBER 10
1358    #pragma count (NUMBER)
1359
1360    Name expansion is still disallowed.  */
1361 void
1362 c_register_pragma_with_expansion (const char *space, const char *name,
1363                                   pragma_handler_1arg handler)
1364 {
1365   internal_pragma_handler ihandler;
1366
1367   ihandler.handler.handler_1arg = handler;
1368   ihandler.extra_data = false;
1369   ihandler.data = NULL;
1370   c_register_pragma_1 (space, name, ihandler, true);
1371 }
1372
1373 /* Register a C pragma handler, using a space and a name, it also carries an
1374    extra data field which can be used by the handler.  It allows pragma
1375    expansion as in the following example:
1376
1377    #define NUMBER 10
1378    #pragma count (NUMBER)
1379
1380    Name expansion is still disallowed.  */
1381 void
1382 c_register_pragma_with_expansion_and_data (const char *space, const char *name,
1383                                            pragma_handler_2arg handler,
1384                                            void *data)
1385 {
1386   internal_pragma_handler ihandler;
1387
1388   ihandler.handler.handler_2arg = handler;
1389   ihandler.extra_data = true;
1390   ihandler.data = data;
1391   c_register_pragma_1 (space, name, ihandler, true);
1392 }
1393
1394 void
1395 c_invoke_pragma_handler (unsigned int id)
1396 {
1397   internal_pragma_handler *ihandler;
1398   pragma_handler_1arg handler_1arg;
1399   pragma_handler_2arg handler_2arg;
1400
1401   id -= PRAGMA_FIRST_EXTERNAL;
1402   ihandler = &registered_pragmas[id];
1403   if (ihandler->extra_data)
1404     {
1405       handler_2arg = ihandler->handler.handler_2arg;
1406       handler_2arg (parse_in, ihandler->data);
1407     }
1408   else
1409     {
1410       handler_1arg = ihandler->handler.handler_1arg;
1411       handler_1arg (parse_in);
1412     }
1413 }
1414
1415 /* Set up front-end pragmas.  */
1416 void
1417 init_pragma (void)
1418 {
1419   if (flag_openacc)
1420     {
1421       const int n_oacc_pragmas
1422         = sizeof (oacc_pragmas) / sizeof (*oacc_pragmas);
1423       int i;
1424
1425       for (i = 0; i < n_oacc_pragmas; ++i)
1426         cpp_register_deferred_pragma (parse_in, "acc", oacc_pragmas[i].name,
1427                                       oacc_pragmas[i].id, true, true);
1428     }
1429
1430   if (flag_openmp)
1431     {
1432       const int n_omp_pragmas = sizeof (omp_pragmas) / sizeof (*omp_pragmas);
1433       int i;
1434
1435       for (i = 0; i < n_omp_pragmas; ++i)
1436         cpp_register_deferred_pragma (parse_in, "omp", omp_pragmas[i].name,
1437                                       omp_pragmas[i].id, true, true);
1438     }
1439   if (flag_openmp || flag_openmp_simd)
1440     {
1441       const int n_omp_pragmas_simd = sizeof (omp_pragmas_simd)
1442                                      / sizeof (*omp_pragmas);
1443       int i;
1444
1445       for (i = 0; i < n_omp_pragmas_simd; ++i)
1446         cpp_register_deferred_pragma (parse_in, "omp", omp_pragmas_simd[i].name,
1447                                       omp_pragmas_simd[i].id, true, true);
1448     }
1449
1450   if (flag_cilkplus)
1451     cpp_register_deferred_pragma (parse_in, NULL, "simd", PRAGMA_CILK_SIMD,
1452                                   true, false);
1453
1454   if (!flag_preprocess_only)
1455     cpp_register_deferred_pragma (parse_in, "GCC", "pch_preprocess",
1456                                   PRAGMA_GCC_PCH_PREPROCESS, false, false);
1457
1458   if (!flag_preprocess_only)
1459     cpp_register_deferred_pragma (parse_in, "GCC", "ivdep", PRAGMA_IVDEP, false,
1460                                   false);
1461
1462   if (flag_cilkplus && !flag_preprocess_only)
1463     cpp_register_deferred_pragma (parse_in, "cilk", "grainsize",
1464                                   PRAGMA_CILK_GRAINSIZE, true, false);
1465
1466 #ifdef HANDLE_PRAGMA_PACK_WITH_EXPANSION
1467   c_register_pragma_with_expansion (0, "pack", handle_pragma_pack);
1468 #else
1469   c_register_pragma (0, "pack", handle_pragma_pack);
1470 #endif
1471   c_register_pragma (0, "weak", handle_pragma_weak);
1472   c_register_pragma ("GCC", "visibility", handle_pragma_visibility);
1473
1474   c_register_pragma ("GCC", "diagnostic", handle_pragma_diagnostic);
1475   c_register_pragma ("GCC", "target", handle_pragma_target);
1476   c_register_pragma ("GCC", "optimize", handle_pragma_optimize);
1477   c_register_pragma ("GCC", "push_options", handle_pragma_push_options);
1478   c_register_pragma ("GCC", "pop_options", handle_pragma_pop_options);
1479   c_register_pragma ("GCC", "reset_options", handle_pragma_reset_options);
1480
1481   c_register_pragma ("STDC", "FLOAT_CONST_DECIMAL64",
1482                      handle_pragma_float_const_decimal64);
1483
1484   c_register_pragma_with_expansion (0, "redefine_extname",
1485                                     handle_pragma_redefine_extname);
1486
1487   c_register_pragma_with_expansion (0, "message", handle_pragma_message);
1488
1489 #ifdef REGISTER_TARGET_PRAGMAS
1490   REGISTER_TARGET_PRAGMAS ();
1491 #endif
1492
1493   /* Allow plugins to register their own pragmas. */
1494   invoke_plugin_callbacks (PLUGIN_PRAGMAS, NULL);
1495 }
1496
1497 #include "gt-c-family-c-pragma.h"