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