xref: /dflybsd-src/contrib/gcc-8.0/gcc/c-family/c-pragma.h (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* Pragma related interfaces.
2*38fd1498Szrj    Copyright (C) 1995-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj This file is part of GCC.
5*38fd1498Szrj 
6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
7*38fd1498Szrj the terms of the GNU General Public License as published by the Free
8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj version.
10*38fd1498Szrj 
11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*38fd1498Szrj for more details.
15*38fd1498Szrj 
16*38fd1498Szrj You should have received a copy of the GNU General Public License
17*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
18*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
19*38fd1498Szrj 
20*38fd1498Szrj #ifndef GCC_C_PRAGMA_H
21*38fd1498Szrj #define GCC_C_PRAGMA_H
22*38fd1498Szrj 
23*38fd1498Szrj #include "cpplib.h" /* For enum cpp_ttype.  */
24*38fd1498Szrj 
25*38fd1498Szrj /* Pragma identifiers built in to the front end parsers.  Identifiers
26*38fd1498Szrj    for ancillary handlers will follow these.  */
27*38fd1498Szrj enum pragma_kind {
28*38fd1498Szrj   PRAGMA_NONE = 0,
29*38fd1498Szrj 
30*38fd1498Szrj   PRAGMA_OACC_ATOMIC,
31*38fd1498Szrj   PRAGMA_OACC_CACHE,
32*38fd1498Szrj   PRAGMA_OACC_DATA,
33*38fd1498Szrj   PRAGMA_OACC_DECLARE,
34*38fd1498Szrj   PRAGMA_OACC_ENTER_DATA,
35*38fd1498Szrj   PRAGMA_OACC_EXIT_DATA,
36*38fd1498Szrj   PRAGMA_OACC_HOST_DATA,
37*38fd1498Szrj   PRAGMA_OACC_KERNELS,
38*38fd1498Szrj   PRAGMA_OACC_LOOP,
39*38fd1498Szrj   PRAGMA_OACC_PARALLEL,
40*38fd1498Szrj   PRAGMA_OACC_ROUTINE,
41*38fd1498Szrj   PRAGMA_OACC_UPDATE,
42*38fd1498Szrj   PRAGMA_OACC_WAIT,
43*38fd1498Szrj 
44*38fd1498Szrj   PRAGMA_OMP_ATOMIC,
45*38fd1498Szrj   PRAGMA_OMP_BARRIER,
46*38fd1498Szrj   PRAGMA_OMP_CANCEL,
47*38fd1498Szrj   PRAGMA_OMP_CANCELLATION_POINT,
48*38fd1498Szrj   PRAGMA_OMP_CRITICAL,
49*38fd1498Szrj   PRAGMA_OMP_DECLARE,
50*38fd1498Szrj   PRAGMA_OMP_DISTRIBUTE,
51*38fd1498Szrj   PRAGMA_OMP_END_DECLARE_TARGET,
52*38fd1498Szrj   PRAGMA_OMP_FLUSH,
53*38fd1498Szrj   PRAGMA_OMP_FOR,
54*38fd1498Szrj   PRAGMA_OMP_MASTER,
55*38fd1498Szrj   PRAGMA_OMP_ORDERED,
56*38fd1498Szrj   PRAGMA_OMP_PARALLEL,
57*38fd1498Szrj   PRAGMA_OMP_SECTION,
58*38fd1498Szrj   PRAGMA_OMP_SECTIONS,
59*38fd1498Szrj   PRAGMA_OMP_SIMD,
60*38fd1498Szrj   PRAGMA_OMP_SINGLE,
61*38fd1498Szrj   PRAGMA_OMP_TARGET,
62*38fd1498Szrj   PRAGMA_OMP_TASK,
63*38fd1498Szrj   PRAGMA_OMP_TASKGROUP,
64*38fd1498Szrj   PRAGMA_OMP_TASKLOOP,
65*38fd1498Szrj   PRAGMA_OMP_TASKWAIT,
66*38fd1498Szrj   PRAGMA_OMP_TASKYIELD,
67*38fd1498Szrj   PRAGMA_OMP_THREADPRIVATE,
68*38fd1498Szrj   PRAGMA_OMP_TEAMS,
69*38fd1498Szrj 
70*38fd1498Szrj   PRAGMA_GCC_PCH_PREPROCESS,
71*38fd1498Szrj   PRAGMA_IVDEP,
72*38fd1498Szrj   PRAGMA_UNROLL,
73*38fd1498Szrj 
74*38fd1498Szrj   PRAGMA_FIRST_EXTERNAL
75*38fd1498Szrj };
76*38fd1498Szrj 
77*38fd1498Szrj 
78*38fd1498Szrj /* All clauses defined by OpenACC 2.0, and OpenMP 2.5, 3.0, 3.1, 4.0 and 4.5.
79*38fd1498Szrj    Used internally by both C and C++ parsers.  */
80*38fd1498Szrj enum pragma_omp_clause {
81*38fd1498Szrj   PRAGMA_OMP_CLAUSE_NONE = 0,
82*38fd1498Szrj 
83*38fd1498Szrj   PRAGMA_OMP_CLAUSE_ALIGNED,
84*38fd1498Szrj   PRAGMA_OMP_CLAUSE_COLLAPSE,
85*38fd1498Szrj   PRAGMA_OMP_CLAUSE_COPYIN,
86*38fd1498Szrj   PRAGMA_OMP_CLAUSE_COPYPRIVATE,
87*38fd1498Szrj   PRAGMA_OMP_CLAUSE_DEFAULT,
88*38fd1498Szrj   PRAGMA_OMP_CLAUSE_DEFAULTMAP,
89*38fd1498Szrj   PRAGMA_OMP_CLAUSE_DEPEND,
90*38fd1498Szrj   PRAGMA_OMP_CLAUSE_DEVICE,
91*38fd1498Szrj   PRAGMA_OMP_CLAUSE_DIST_SCHEDULE,
92*38fd1498Szrj   PRAGMA_OMP_CLAUSE_FINAL,
93*38fd1498Szrj   PRAGMA_OMP_CLAUSE_FIRSTPRIVATE,
94*38fd1498Szrj   PRAGMA_OMP_CLAUSE_FOR,
95*38fd1498Szrj   PRAGMA_OMP_CLAUSE_FROM,
96*38fd1498Szrj   PRAGMA_OMP_CLAUSE_GRAINSIZE,
97*38fd1498Szrj   PRAGMA_OMP_CLAUSE_HINT,
98*38fd1498Szrj   PRAGMA_OMP_CLAUSE_IF,
99*38fd1498Szrj   PRAGMA_OMP_CLAUSE_INBRANCH,
100*38fd1498Szrj   PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR,
101*38fd1498Szrj   PRAGMA_OMP_CLAUSE_LASTPRIVATE,
102*38fd1498Szrj   PRAGMA_OMP_CLAUSE_LINEAR,
103*38fd1498Szrj   PRAGMA_OMP_CLAUSE_LINK,
104*38fd1498Szrj   PRAGMA_OMP_CLAUSE_MAP,
105*38fd1498Szrj   PRAGMA_OMP_CLAUSE_MERGEABLE,
106*38fd1498Szrj   PRAGMA_OMP_CLAUSE_NOGROUP,
107*38fd1498Szrj   PRAGMA_OMP_CLAUSE_NOTINBRANCH,
108*38fd1498Szrj   PRAGMA_OMP_CLAUSE_NOWAIT,
109*38fd1498Szrj   PRAGMA_OMP_CLAUSE_NUM_TASKS,
110*38fd1498Szrj   PRAGMA_OMP_CLAUSE_NUM_TEAMS,
111*38fd1498Szrj   PRAGMA_OMP_CLAUSE_NUM_THREADS,
112*38fd1498Szrj   PRAGMA_OMP_CLAUSE_ORDERED,
113*38fd1498Szrj   PRAGMA_OMP_CLAUSE_PARALLEL,
114*38fd1498Szrj   PRAGMA_OMP_CLAUSE_PRIORITY,
115*38fd1498Szrj   PRAGMA_OMP_CLAUSE_PRIVATE,
116*38fd1498Szrj   PRAGMA_OMP_CLAUSE_PROC_BIND,
117*38fd1498Szrj   PRAGMA_OMP_CLAUSE_REDUCTION,
118*38fd1498Szrj   PRAGMA_OMP_CLAUSE_SAFELEN,
119*38fd1498Szrj   PRAGMA_OMP_CLAUSE_SCHEDULE,
120*38fd1498Szrj   PRAGMA_OMP_CLAUSE_SECTIONS,
121*38fd1498Szrj   PRAGMA_OMP_CLAUSE_SHARED,
122*38fd1498Szrj   PRAGMA_OMP_CLAUSE_SIMD,
123*38fd1498Szrj   PRAGMA_OMP_CLAUSE_SIMDLEN,
124*38fd1498Szrj   PRAGMA_OMP_CLAUSE_TASKGROUP,
125*38fd1498Szrj   PRAGMA_OMP_CLAUSE_THREAD_LIMIT,
126*38fd1498Szrj   PRAGMA_OMP_CLAUSE_THREADS,
127*38fd1498Szrj   PRAGMA_OMP_CLAUSE_TO,
128*38fd1498Szrj   PRAGMA_OMP_CLAUSE_UNIFORM,
129*38fd1498Szrj   PRAGMA_OMP_CLAUSE_UNTIED,
130*38fd1498Szrj   PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR,
131*38fd1498Szrj 
132*38fd1498Szrj   /* Clauses for OpenACC.  */
133*38fd1498Szrj   PRAGMA_OACC_CLAUSE_ASYNC,
134*38fd1498Szrj   PRAGMA_OACC_CLAUSE_AUTO,
135*38fd1498Szrj   PRAGMA_OACC_CLAUSE_COPY,
136*38fd1498Szrj   PRAGMA_OACC_CLAUSE_COPYOUT,
137*38fd1498Szrj   PRAGMA_OACC_CLAUSE_CREATE,
138*38fd1498Szrj   PRAGMA_OACC_CLAUSE_DELETE,
139*38fd1498Szrj   PRAGMA_OACC_CLAUSE_DEVICEPTR,
140*38fd1498Szrj   PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT,
141*38fd1498Szrj   PRAGMA_OACC_CLAUSE_GANG,
142*38fd1498Szrj   PRAGMA_OACC_CLAUSE_HOST,
143*38fd1498Szrj   PRAGMA_OACC_CLAUSE_INDEPENDENT,
144*38fd1498Szrj   PRAGMA_OACC_CLAUSE_NUM_GANGS,
145*38fd1498Szrj   PRAGMA_OACC_CLAUSE_NUM_WORKERS,
146*38fd1498Szrj   PRAGMA_OACC_CLAUSE_PRESENT,
147*38fd1498Szrj   PRAGMA_OACC_CLAUSE_PRESENT_OR_COPY,
148*38fd1498Szrj   PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYIN,
149*38fd1498Szrj   PRAGMA_OACC_CLAUSE_PRESENT_OR_COPYOUT,
150*38fd1498Szrj   PRAGMA_OACC_CLAUSE_PRESENT_OR_CREATE,
151*38fd1498Szrj   PRAGMA_OACC_CLAUSE_SELF,
152*38fd1498Szrj   PRAGMA_OACC_CLAUSE_SEQ,
153*38fd1498Szrj   PRAGMA_OACC_CLAUSE_TILE,
154*38fd1498Szrj   PRAGMA_OACC_CLAUSE_USE_DEVICE,
155*38fd1498Szrj   PRAGMA_OACC_CLAUSE_VECTOR,
156*38fd1498Szrj   PRAGMA_OACC_CLAUSE_VECTOR_LENGTH,
157*38fd1498Szrj   PRAGMA_OACC_CLAUSE_WAIT,
158*38fd1498Szrj   PRAGMA_OACC_CLAUSE_WORKER,
159*38fd1498Szrj   PRAGMA_OACC_CLAUSE_COLLAPSE = PRAGMA_OMP_CLAUSE_COLLAPSE,
160*38fd1498Szrj   PRAGMA_OACC_CLAUSE_COPYIN = PRAGMA_OMP_CLAUSE_COPYIN,
161*38fd1498Szrj   PRAGMA_OACC_CLAUSE_DEVICE = PRAGMA_OMP_CLAUSE_DEVICE,
162*38fd1498Szrj   PRAGMA_OACC_CLAUSE_DEFAULT = PRAGMA_OMP_CLAUSE_DEFAULT,
163*38fd1498Szrj   PRAGMA_OACC_CLAUSE_FIRSTPRIVATE = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE,
164*38fd1498Szrj   PRAGMA_OACC_CLAUSE_IF = PRAGMA_OMP_CLAUSE_IF,
165*38fd1498Szrj   PRAGMA_OACC_CLAUSE_PRIVATE = PRAGMA_OMP_CLAUSE_PRIVATE,
166*38fd1498Szrj   PRAGMA_OACC_CLAUSE_REDUCTION = PRAGMA_OMP_CLAUSE_REDUCTION,
167*38fd1498Szrj   PRAGMA_OACC_CLAUSE_LINK = PRAGMA_OMP_CLAUSE_LINK
168*38fd1498Szrj };
169*38fd1498Szrj 
170*38fd1498Szrj extern struct cpp_reader* parse_in;
171*38fd1498Szrj 
172*38fd1498Szrj /* It's safe to always leave visibility pragma enabled as if
173*38fd1498Szrj    visibility is not supported on the host OS platform the
174*38fd1498Szrj    statements are ignored.  */
175*38fd1498Szrj extern void push_visibility (const char *, int);
176*38fd1498Szrj extern bool pop_visibility (int);
177*38fd1498Szrj 
178*38fd1498Szrj extern void init_pragma (void);
179*38fd1498Szrj 
180*38fd1498Szrj /* Front-end wrappers for pragma registration.  */
181*38fd1498Szrj typedef void (*pragma_handler_1arg)(struct cpp_reader *);
182*38fd1498Szrj /* A second pragma handler, which adds a void * argument allowing to pass extra
183*38fd1498Szrj    data to the handler.  */
184*38fd1498Szrj typedef void (*pragma_handler_2arg)(struct cpp_reader *, void *);
185*38fd1498Szrj 
186*38fd1498Szrj /* This union allows to abstract the different handlers.  */
187*38fd1498Szrj union gen_pragma_handler {
188*38fd1498Szrj   pragma_handler_1arg handler_1arg;
189*38fd1498Szrj   pragma_handler_2arg handler_2arg;
190*38fd1498Szrj };
191*38fd1498Szrj /* Internally used to keep the data of the handler.  */
192*38fd1498Szrj struct internal_pragma_handler {
193*38fd1498Szrj   union gen_pragma_handler handler;
194*38fd1498Szrj   /* Permits to know if handler is a pragma_handler_1arg (extra_data is false)
195*38fd1498Szrj      or a pragma_handler_2arg (extra_data is true).  */
196*38fd1498Szrj   bool extra_data;
197*38fd1498Szrj   /* A data field which can be used when extra_data is true.  */
198*38fd1498Szrj   void * data;
199*38fd1498Szrj };
200*38fd1498Szrj 
201*38fd1498Szrj extern void c_register_pragma (const char *space, const char *name,
202*38fd1498Szrj                                pragma_handler_1arg handler);
203*38fd1498Szrj extern void c_register_pragma_with_data (const char *space, const char *name,
204*38fd1498Szrj                                          pragma_handler_2arg handler,
205*38fd1498Szrj                                          void *data);
206*38fd1498Szrj 
207*38fd1498Szrj extern void c_register_pragma_with_expansion (const char *space,
208*38fd1498Szrj                                               const char *name,
209*38fd1498Szrj                                               pragma_handler_1arg handler);
210*38fd1498Szrj extern void c_register_pragma_with_expansion_and_data (const char *space,
211*38fd1498Szrj                                                        const char *name,
212*38fd1498Szrj                                                    pragma_handler_2arg handler,
213*38fd1498Szrj                                                        void *data);
214*38fd1498Szrj extern void c_invoke_pragma_handler (unsigned int);
215*38fd1498Szrj 
216*38fd1498Szrj extern void maybe_apply_pragma_weak (tree);
217*38fd1498Szrj extern void maybe_apply_pending_pragma_weaks (void);
218*38fd1498Szrj extern tree maybe_apply_renaming_pragma (tree, tree);
219*38fd1498Szrj extern void maybe_apply_pragma_scalar_storage_order (tree);
220*38fd1498Szrj extern void add_to_renaming_pragma_list (tree, tree);
221*38fd1498Szrj 
222*38fd1498Szrj extern enum cpp_ttype pragma_lex (tree *, location_t *loc = NULL);
223*38fd1498Szrj 
224*38fd1498Szrj /* Flags for use with c_lex_with_flags.  The values here were picked
225*38fd1498Szrj    so that 0 means to translate and join strings.  */
226*38fd1498Szrj #define C_LEX_STRING_NO_TRANSLATE 1 /* Do not lex strings into
227*38fd1498Szrj 				       execution character set.  */
228*38fd1498Szrj #define C_LEX_STRING_NO_JOIN	  2 /* Do not concatenate strings
229*38fd1498Szrj 				       nor translate them into execution
230*38fd1498Szrj 				       character set.  */
231*38fd1498Szrj 
232*38fd1498Szrj /* This is not actually available to pragma parsers.  It's merely a
233*38fd1498Szrj    convenient location to declare this function for c-lex, after
234*38fd1498Szrj    having enum cpp_ttype declared.  */
235*38fd1498Szrj extern enum cpp_ttype c_lex_with_flags (tree *, location_t *, unsigned char *,
236*38fd1498Szrj 					int);
237*38fd1498Szrj 
238*38fd1498Szrj extern void c_pp_lookup_pragma (unsigned int, const char **, const char **);
239*38fd1498Szrj 
240*38fd1498Szrj extern GTY(()) tree pragma_extern_prefix;
241*38fd1498Szrj 
242*38fd1498Szrj #endif /* GCC_C_PRAGMA_H */
243