OSDN Git Service

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