(root)/
gcc-13.2.0/
gcc/
c-family/
c-pragma.h
       1  /* Pragma related interfaces.
       2     Copyright (C) 1995-2023 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  #ifndef GCC_C_PRAGMA_H
      21  #define GCC_C_PRAGMA_H
      22  
      23  #include "cpplib.h" /* For enum cpp_ttype.  */
      24  
      25  /* Pragma identifiers built in to the front end parsers.  Identifiers
      26     for ancillary handlers will follow these.  */
      27  enum pragma_kind {
      28    PRAGMA_NONE = 0,
      29  
      30    PRAGMA_OACC_ATOMIC,
      31    PRAGMA_OACC_CACHE,
      32    PRAGMA_OACC_DATA,
      33    PRAGMA_OACC_DECLARE,
      34    PRAGMA_OACC_ENTER_DATA,
      35    PRAGMA_OACC_EXIT_DATA,
      36    PRAGMA_OACC_HOST_DATA,
      37    PRAGMA_OACC_KERNELS,
      38    PRAGMA_OACC_LOOP,
      39    PRAGMA_OACC_PARALLEL,
      40    PRAGMA_OACC_ROUTINE,
      41    PRAGMA_OACC_SERIAL,
      42    PRAGMA_OACC_UPDATE,
      43    PRAGMA_OACC_WAIT,
      44  
      45    /* PRAGMA_OMP__START_ should be equal to the first PRAGMA_OMP_* code.  */
      46    PRAGMA_OMP_ALLOCATE,
      47    PRAGMA_OMP__START_ = PRAGMA_OMP_ALLOCATE,
      48    PRAGMA_OMP_ASSUME,
      49    PRAGMA_OMP_ASSUMES,
      50    PRAGMA_OMP_ATOMIC,
      51    PRAGMA_OMP_BARRIER,
      52    PRAGMA_OMP_BEGIN,
      53    PRAGMA_OMP_CANCEL,
      54    PRAGMA_OMP_CANCELLATION_POINT,
      55    PRAGMA_OMP_CRITICAL,
      56    PRAGMA_OMP_DECLARE,
      57    PRAGMA_OMP_DEPOBJ,
      58    PRAGMA_OMP_DISTRIBUTE,
      59    PRAGMA_OMP_ERROR,
      60    PRAGMA_OMP_END,
      61    PRAGMA_OMP_FLUSH,
      62    PRAGMA_OMP_FOR,
      63    PRAGMA_OMP_LOOP,
      64    PRAGMA_OMP_NOTHING,
      65    PRAGMA_OMP_MASKED,
      66    PRAGMA_OMP_MASTER,
      67    PRAGMA_OMP_ORDERED,
      68    PRAGMA_OMP_PARALLEL,
      69    PRAGMA_OMP_REQUIRES,
      70    PRAGMA_OMP_SCAN,
      71    PRAGMA_OMP_SCOPE,
      72    PRAGMA_OMP_SECTION,
      73    PRAGMA_OMP_SECTIONS,
      74    PRAGMA_OMP_SIMD,
      75    PRAGMA_OMP_SINGLE,
      76    PRAGMA_OMP_TARGET,
      77    PRAGMA_OMP_TASK,
      78    PRAGMA_OMP_TASKGROUP,
      79    PRAGMA_OMP_TASKLOOP,
      80    PRAGMA_OMP_TASKWAIT,
      81    PRAGMA_OMP_TASKYIELD,
      82    PRAGMA_OMP_THREADPRIVATE,
      83    PRAGMA_OMP_TEAMS,
      84    /* PRAGMA_OMP__LAST_ should be equal to the last PRAGMA_OMP_* code.  */
      85    PRAGMA_OMP__LAST_ = PRAGMA_OMP_TEAMS,
      86  
      87    PRAGMA_GCC_PCH_PREPROCESS,
      88    PRAGMA_IVDEP,
      89    PRAGMA_UNROLL,
      90  
      91    PRAGMA_FIRST_EXTERNAL
      92  };
      93  
      94  
      95  /* All clauses defined by OpenACC 2.0, and OpenMP 2.5, 3.0, 3.1, 4.0, 4.5, 5.0,
      96     5.1 and 5.2.  Used internally by both C and C++ parsers.  */
      97  enum pragma_omp_clause {
      98    PRAGMA_OMP_CLAUSE_NONE = 0,
      99  
     100    PRAGMA_OMP_CLAUSE_AFFINITY,
     101    PRAGMA_OMP_CLAUSE_ALIGNED,
     102    PRAGMA_OMP_CLAUSE_ALLOCATE,
     103    PRAGMA_OMP_CLAUSE_BIND,
     104    PRAGMA_OMP_CLAUSE_COLLAPSE,
     105    PRAGMA_OMP_CLAUSE_COPYIN,
     106    PRAGMA_OMP_CLAUSE_COPYPRIVATE,
     107    PRAGMA_OMP_CLAUSE_DEFAULT,
     108    PRAGMA_OMP_CLAUSE_DEFAULTMAP,
     109    PRAGMA_OMP_CLAUSE_DEPEND,
     110    PRAGMA_OMP_CLAUSE_DETACH,
     111    PRAGMA_OMP_CLAUSE_DEVICE,
     112    PRAGMA_OMP_CLAUSE_DEVICE_TYPE,
     113    PRAGMA_OMP_CLAUSE_DIST_SCHEDULE,
     114    PRAGMA_OMP_CLAUSE_DOACROSS,
     115    PRAGMA_OMP_CLAUSE_ENTER,
     116    PRAGMA_OMP_CLAUSE_FILTER,
     117    PRAGMA_OMP_CLAUSE_FINAL,
     118    PRAGMA_OMP_CLAUSE_FIRSTPRIVATE,
     119    PRAGMA_OMP_CLAUSE_FOR,
     120    PRAGMA_OMP_CLAUSE_FROM,
     121    PRAGMA_OMP_CLAUSE_GRAINSIZE,
     122    PRAGMA_OMP_CLAUSE_HAS_DEVICE_ADDR,
     123    PRAGMA_OMP_CLAUSE_HINT,
     124    PRAGMA_OMP_CLAUSE_IF,
     125    PRAGMA_OMP_CLAUSE_IN_REDUCTION,
     126    PRAGMA_OMP_CLAUSE_INBRANCH,
     127    PRAGMA_OMP_CLAUSE_IS_DEVICE_PTR,
     128    PRAGMA_OMP_CLAUSE_LASTPRIVATE,
     129    PRAGMA_OMP_CLAUSE_LINEAR,
     130    PRAGMA_OMP_CLAUSE_LINK,
     131    PRAGMA_OMP_CLAUSE_MAP,
     132    PRAGMA_OMP_CLAUSE_MERGEABLE,
     133    PRAGMA_OMP_CLAUSE_NOGROUP,
     134    PRAGMA_OMP_CLAUSE_NONTEMPORAL,
     135    PRAGMA_OMP_CLAUSE_NOTINBRANCH,
     136    PRAGMA_OMP_CLAUSE_NOWAIT,
     137    PRAGMA_OMP_CLAUSE_NUM_TASKS,
     138    PRAGMA_OMP_CLAUSE_NUM_TEAMS,
     139    PRAGMA_OMP_CLAUSE_NUM_THREADS,
     140    PRAGMA_OMP_CLAUSE_ORDER,
     141    PRAGMA_OMP_CLAUSE_ORDERED,
     142    PRAGMA_OMP_CLAUSE_PARALLEL,
     143    PRAGMA_OMP_CLAUSE_PRIORITY,
     144    PRAGMA_OMP_CLAUSE_PRIVATE,
     145    PRAGMA_OMP_CLAUSE_PROC_BIND,
     146    PRAGMA_OMP_CLAUSE_REDUCTION,
     147    PRAGMA_OMP_CLAUSE_SAFELEN,
     148    PRAGMA_OMP_CLAUSE_SCHEDULE,
     149    PRAGMA_OMP_CLAUSE_SECTIONS,
     150    PRAGMA_OMP_CLAUSE_SHARED,
     151    PRAGMA_OMP_CLAUSE_SIMD,
     152    PRAGMA_OMP_CLAUSE_SIMDLEN,
     153    PRAGMA_OMP_CLAUSE_TASK_REDUCTION,
     154    PRAGMA_OMP_CLAUSE_TASKGROUP,
     155    PRAGMA_OMP_CLAUSE_THREAD_LIMIT,
     156    PRAGMA_OMP_CLAUSE_THREADS,
     157    PRAGMA_OMP_CLAUSE_TO,
     158    PRAGMA_OMP_CLAUSE_UNIFORM,
     159    PRAGMA_OMP_CLAUSE_UNTIED,
     160    PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR,
     161    PRAGMA_OMP_CLAUSE_USE_DEVICE_ADDR,
     162  
     163    /* Clauses for OpenACC.  */
     164    PRAGMA_OACC_CLAUSE_ASYNC,
     165    PRAGMA_OACC_CLAUSE_ATTACH,
     166    PRAGMA_OACC_CLAUSE_AUTO,
     167    PRAGMA_OACC_CLAUSE_COPY,
     168    PRAGMA_OACC_CLAUSE_COPYOUT,
     169    PRAGMA_OACC_CLAUSE_CREATE,
     170    PRAGMA_OACC_CLAUSE_DELETE,
     171    PRAGMA_OACC_CLAUSE_DEVICEPTR,
     172    PRAGMA_OACC_CLAUSE_DEVICE_RESIDENT,
     173    PRAGMA_OACC_CLAUSE_FINALIZE,
     174    PRAGMA_OACC_CLAUSE_GANG,
     175    PRAGMA_OACC_CLAUSE_HOST,
     176    PRAGMA_OACC_CLAUSE_INDEPENDENT,
     177    PRAGMA_OACC_CLAUSE_NO_CREATE,
     178    PRAGMA_OACC_CLAUSE_NOHOST,
     179    PRAGMA_OACC_CLAUSE_NUM_GANGS,
     180    PRAGMA_OACC_CLAUSE_NUM_WORKERS,
     181    PRAGMA_OACC_CLAUSE_PRESENT,
     182    PRAGMA_OACC_CLAUSE_SELF,
     183    PRAGMA_OACC_CLAUSE_SEQ,
     184    PRAGMA_OACC_CLAUSE_TILE,
     185    PRAGMA_OACC_CLAUSE_VECTOR,
     186    PRAGMA_OACC_CLAUSE_VECTOR_LENGTH,
     187    PRAGMA_OACC_CLAUSE_WAIT,
     188    PRAGMA_OACC_CLAUSE_WORKER,
     189    PRAGMA_OACC_CLAUSE_IF_PRESENT,
     190    PRAGMA_OACC_CLAUSE_COLLAPSE = PRAGMA_OMP_CLAUSE_COLLAPSE,
     191    PRAGMA_OACC_CLAUSE_COPYIN = PRAGMA_OMP_CLAUSE_COPYIN,
     192    PRAGMA_OACC_CLAUSE_DEVICE = PRAGMA_OMP_CLAUSE_DEVICE,
     193    PRAGMA_OACC_CLAUSE_DEFAULT = PRAGMA_OMP_CLAUSE_DEFAULT,
     194    PRAGMA_OACC_CLAUSE_DETACH = PRAGMA_OMP_CLAUSE_DETACH,
     195    PRAGMA_OACC_CLAUSE_FIRSTPRIVATE = PRAGMA_OMP_CLAUSE_FIRSTPRIVATE,
     196    PRAGMA_OACC_CLAUSE_IF = PRAGMA_OMP_CLAUSE_IF,
     197    PRAGMA_OACC_CLAUSE_PRIVATE = PRAGMA_OMP_CLAUSE_PRIVATE,
     198    PRAGMA_OACC_CLAUSE_REDUCTION = PRAGMA_OMP_CLAUSE_REDUCTION,
     199    PRAGMA_OACC_CLAUSE_LINK = PRAGMA_OMP_CLAUSE_LINK,
     200    PRAGMA_OACC_CLAUSE_USE_DEVICE = PRAGMA_OMP_CLAUSE_USE_DEVICE_PTR
     201  };
     202  
     203  extern struct cpp_reader* parse_in;
     204  
     205  /* It's safe to always leave visibility pragma enabled as if
     206     visibility is not supported on the host OS platform the
     207     statements are ignored.  */
     208  extern void push_visibility (const char *, int);
     209  extern bool pop_visibility (int);
     210  
     211  extern void init_pragma (void);
     212  
     213  /* Front-end wrappers for pragma registration.  */
     214  typedef void (*pragma_handler_1arg)(struct cpp_reader *);
     215  /* A second pragma handler, which adds a void * argument allowing to pass extra
     216     data to the handler.  */
     217  typedef void (*pragma_handler_2arg)(struct cpp_reader *, void *);
     218  
     219  /* This union allows to abstract the different handlers.  */
     220  union gen_pragma_handler {
     221    pragma_handler_1arg handler_1arg;
     222    pragma_handler_2arg handler_2arg;
     223  };
     224  /* Internally used to keep the data of the handler.  */
     225  struct internal_pragma_handler {
     226    union gen_pragma_handler handler, early_handler;
     227    /* Permits to know if handler is a pragma_handler_1arg (extra_data is false)
     228       or a pragma_handler_2arg (extra_data is true).  */
     229    bool extra_data;
     230    /* A data field which can be used when extra_data is true.  */
     231    void * data;
     232  };
     233  
     234  extern void c_register_pragma (const char *space, const char *name,
     235                                 pragma_handler_1arg handler);
     236  extern void c_register_pragma_with_data (const char *space, const char *name,
     237                                           pragma_handler_2arg handler,
     238                                           void *data);
     239  
     240  extern void c_register_pragma_with_expansion (const char *space,
     241                                                const char *name,
     242                                                pragma_handler_1arg handler);
     243  extern void c_register_pragma_with_expansion_and_data (const char *space,
     244                                                         const char *name,
     245                                                     pragma_handler_2arg handler,
     246                                                         void *data);
     247  extern void c_invoke_pragma_handler (unsigned int);
     248  
     249  /* Early pragma handlers run in addition to the normal ones.  They can be used
     250     by frontends such as C++ that may want to process some pragmas during lexing
     251     before they start processing them.  */
     252  extern void
     253  c_register_pragma_with_early_handler (const char *space, const char *name,
     254  				      pragma_handler_1arg handler,
     255  				      pragma_handler_1arg early_handler);
     256  extern void c_invoke_early_pragma_handler (unsigned int);
     257  extern void c_pp_invoke_early_pragma_handler (unsigned int);
     258  
     259  
     260  extern void maybe_apply_pragma_weak (tree);
     261  extern void maybe_apply_pending_pragma_weaks (void);
     262  extern tree maybe_apply_renaming_pragma (tree, tree);
     263  extern void maybe_apply_pragma_scalar_storage_order (tree);
     264  extern void add_to_renaming_pragma_list (tree, tree);
     265  
     266  extern enum cpp_ttype pragma_lex (tree *, location_t *loc = NULL);
     267  
     268  /* Flags for use with c_lex_with_flags.  The values here were picked
     269     so that 0 means to translate and join strings.  */
     270  #define C_LEX_STRING_NO_TRANSLATE 1 /* Do not lex strings into
     271  				       execution character set.  */
     272  #define C_LEX_STRING_NO_JOIN	  2 /* Do not concatenate strings
     273  				       nor translate them into execution
     274  				       character set.  */
     275  
     276  /* This is not actually available to pragma parsers.  It's merely a
     277     convenient location to declare this function for c-lex, after
     278     having enum cpp_ttype declared.  */
     279  extern enum cpp_ttype c_lex_with_flags (tree *, location_t *, unsigned char *,
     280  					int);
     281  
     282  extern void c_pp_lookup_pragma (unsigned int, const char **, const char **);
     283  
     284  extern GTY(()) tree pragma_extern_prefix;
     285  
     286  #endif /* GCC_C_PRAGMA_H */