(root)/
gcc-13.2.0/
gcc/
objc/
objc-act.h
       1  /* Declarations for objc-act.cc.
       2     Copyright (C) 1990-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
       7  it under the terms of the GNU General Public License as published by
       8  the Free Software Foundation; either version 3, or (at your option)
       9  any later version.
      10  
      11  GCC is distributed in the hope that it will be useful,
      12  but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14  GNU General Public License 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  
      21  #ifndef GCC_OBJC_ACT_H
      22  #define GCC_OBJC_ACT_H
      23  
      24  /*** Language hooks ***/
      25  
      26  bool objc_init (void);
      27  const char *objc_printable_name (tree, int);
      28  int objc_gimplify_expr (tree *, gimple_seq *, gimple_seq *);
      29  void objc_common_init_ts (void);
      30  const char *objc_get_sarif_source_language (const char *);
      31  
      32  /* NB: The remaining public functions are prototyped in c-common.h, for the
      33     benefit of stub-objc.cc and objc-act.cc.  */
      34  
      35  /* Objective-C structures */
      36  
      37  #define CLASS_LANG_SLOT_ELTS		7
      38  #define PROTOCOL_LANG_SLOT_ELTS		7
      39  #define OBJC_INFO_SLOT_ELTS		2
      40  
      41  /* KEYWORD_DECL */
      42  #define KEYWORD_KEY_NAME(DECL) (KEYWORD_DECL_CHECK (DECL)->decl_minimal.name)
      43  #define KEYWORD_ARG_NAME(DECL) (KEYWORD_DECL_CHECK (DECL)->decl_common.size)
      44  
      45  #define INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK(NODE) \
      46    TREE_CHECK2(NODE,INSTANCE_METHOD_DECL,CLASS_METHOD_DECL)
      47  
      48  /* INSTANCE_METHOD_DECL, CLASS_METHOD_DECL */
      49  #define METHOD_SEL_NAME(DECL) \
      50    (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_minimal.name)
      51  #define METHOD_SEL_ARGS(DECL) \
      52    (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.size)
      53  #define METHOD_ADD_ARGS(DECL) \
      54    (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_non_common.result)
      55  #define METHOD_ADD_ARGS_ELLIPSIS_P(DECL) \
      56    (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.lang_flag_0)
      57  #define METHOD_DEFINITION(DECL) \
      58    (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.initial)
      59  #define METHOD_ENCODING(DECL) \
      60    (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_minimal.context)
      61  #define METHOD_TYPE_ATTRIBUTES(DECL) \
      62    (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.abstract_origin)
      63  #define METHOD_PROPERTY_CONTEXT(DECL) \
      64    (INSTANCE_METHOD_OR_CLASS_METHOD_DECL_CHECK (DECL)->decl_common.size_unit)
      65  
      66  
      67  /* PROPERTY_DECL.  A PROPERTY_DECL repesents a @property declaration
      68     (when attached to the list of properties of an interface) or a
      69     @synthesize or @dynamic declaration (when attached to the list of
      70     properties of an implementation).  */
      71  
      72  /* TREE_TYPE is the type (int, float, etc) of the property.  */
      73  
      74  /* DECL_ARTIFICIAL is set to 1 if the PROPERTY_DECL is an artificial
      75     property declaration created when the dot-syntax object.component
      76     is used with no actual @property matching the component, but a
      77     valid getter/setter.  */
      78  
      79  /* PROPERTY_NAME is the name of the property.  */
      80  #define PROPERTY_NAME(DECL) \
      81     DECL_NAME(PROPERTY_DECL_CHECK (DECL))
      82  
      83  /* PROPERTY_GETTER_NAME is the identifier of the getter method.  */
      84  #define PROPERTY_GETTER_NAME(DECL)\
      85     (PROPERTY_DECL_CHECK (DECL)->decl_common.size)
      86  
      87  /* PROPERTY_SETTER_NAME is the identifier of the setter method.  */
      88  #define PROPERTY_SETTER_NAME(DECL) \
      89     (PROPERTY_DECL_CHECK (DECL)->decl_non_common.result)
      90  
      91  /* PROPERTY_READONLY can be 0 or 1.  */
      92  #define PROPERTY_READONLY(DECL) \
      93     DECL_LANG_FLAG_0 (PROPERTY_DECL_CHECK (DECL))
      94  
      95  /* PROPERTY_NONATOMIC can be 0 or 1.  */
      96  #define PROPERTY_NONATOMIC(DECL) \
      97     DECL_LANG_FLAG_1 (PROPERTY_DECL_CHECK (DECL))
      98  
      99  enum objc_property_assign_semantics {
     100    OBJC_PROPERTY_ASSIGN = 1,
     101    OBJC_PROPERTY_RETAIN = 2,
     102    OBJC_PROPERTY_COPY = 3
     103  };
     104  
     105  /* PROPERTY_ASSIGN_SEMANTICS can be OBJC_PROPERTY_ASSIGN,
     106     OBJC_PROPERTY_RETAIN or OBJC_PROPERTY_COPY.  We need an integer to
     107     store it, so we hijack the alignment, that properties don't
     108     have.  */
     109  #define PROPERTY_ASSIGN_SEMANTICS(DECL) \
     110     (PROPERTY_DECL_CHECK (DECL)->decl_common.align)
     111  
     112  /* PROPERTY_IVAR_NAME is the identifier of the instance variable.
     113     This is set only if the PROPERTY_DECL represents a @synthesize;
     114     otherwise, it is set to TREE_NULL.  */
     115  #define PROPERTY_IVAR_NAME(DECL) \
     116    (PROPERTY_DECL_CHECK (DECL)->decl_common.initial)
     117  
     118  /* PROPERTY_DYNAMIC can be 0 or 1.  This is 1 if the PROPERTY_DECL
     119     represents a @dynamic; otherwise, it is set to 0.  */
     120  #define PROPERTY_DYNAMIC(DECL) \
     121    DECL_LANG_FLAG_2 (PROPERTY_DECL_CHECK (DECL))
     122  
     123  /* PROPERTY_HAS_NO_GETTER can be 0 or 1.  Normally it is 0, but if
     124     this is an artificial PROPERTY_DECL that we generate even without a
     125     getter, it is set to 1.  */
     126  #define PROPERTY_HAS_NO_GETTER(DECL) \
     127    DECL_LANG_FLAG_3 (PROPERTY_DECL_CHECK (DECL))
     128  
     129  /* PROPERTY_HAS_NO_SETTER can be 0 or 1.  Normally it is 0, but if
     130     this is an artificial PROPERTY_DECL that we generate even without a
     131     setter, it is set to 1.  */
     132  #define PROPERTY_HAS_NO_SETTER(DECL) \
     133    DECL_LANG_FLAG_4 (PROPERTY_DECL_CHECK (DECL))
     134  
     135  /* PROPERTY_OPTIONAL can be 0 or 1.  Normally it is 0, but if this is
     136     a property declared as @optional in a @protocol, then it is set to
     137     1.  */
     138  #define PROPERTY_OPTIONAL(DECL) \
     139    DECL_LANG_FLAG_5 (PROPERTY_DECL_CHECK (DECL))
     140  
     141  /* PROPERTY_CLASS can be 0 or 1.  */
     142  #define PROPERTY_CLASS(DECL) \
     143     DECL_LANG_FLAG_6 (PROPERTY_DECL_CHECK (DECL))
     144  
     145  /* PROPERTY_NULLABILITY attributes added to the decl attributes.
     146     effectively, __attribute__((objc_nullability(kind))),   */
     147  enum objc_property_nullability {
     148    OBJC_PROPERTY_NULL_UNSPECIFIED = 0,
     149    OBJC_PROPERTY_NULLABLE,
     150    OBJC_PROPERTY_NONNULL,
     151    OBJC_PROPERTY_NULL_RESETTABLE,
     152    OBJC_PROPERTY_NULL_UNSET
     153  };
     154  
     155  /* PROPERTY_REF.  A PROPERTY_REF represents an 'object.property'
     156     expression.  It is normally used for property access, but when
     157     the Objective-C 2.0 "dot-syntax" (object.component) is used
     158     with no matching property, a PROPERTY_REF is still created to
     159     represent it, with an artificial PROPERTY_DECL.  */
     160  
     161  /* PROPERTY_REF_OBJECT is the object whose property we are
     162     accessing.  */
     163  #define PROPERTY_REF_OBJECT(NODE) TREE_OPERAND (PROPERTY_REF_CHECK (NODE), 0)
     164  
     165  /* PROPERTY_REF_PROPERTY_DECL is the PROPERTY_DECL for the property
     166     used in the expression.  From it, you can get the property type,
     167     and the getter/setter names.  This PROPERTY_DECL could be artificial
     168     if we are processing an 'object.component' syntax with no matching
     169     declared property.  */
     170  #define PROPERTY_REF_PROPERTY_DECL(NODE) TREE_OPERAND (PROPERTY_REF_CHECK (NODE), 1)
     171  
     172  /* PROPERTY_REF_GETTER_CALL is the getter call expression, ready to
     173     use at gimplify time if needed.  Generating the getter call
     174     requires modifying the selector table, and, in the case of
     175     self/super, requires the context to be generated correctly.  The
     176     gimplify stage is too late to do these things, so we generate the
     177     getter call earlier instead, and keep it here in case we need to
     178     use it.  */
     179  #define PROPERTY_REF_GETTER_CALL(NODE) TREE_OPERAND (PROPERTY_REF_CHECK (NODE), 2)
     180  
     181  /* PROPERTY_REF_DEPRECATED_GETTER is normally set to NULL_TREE.  If
     182     the property getter is deprecated, it is set to the method
     183     prototype for it, which is used to generate the deprecation warning
     184     when the getter is used.  */
     185  #define PROPERTY_REF_DEPRECATED_GETTER(NODE) TREE_OPERAND (PROPERTY_REF_CHECK (NODE), 3)
     186  
     187  /* CLASS_INTERFACE_TYPE, CLASS_IMPLEMENTATION_TYPE,
     188     CATEGORY_INTERFACE_TYPE, CATEGORY_IMPLEMENTATION_TYPE,
     189     PROTOCOL_INTERFACE_TYPE */
     190  /* CLASS_NAME is the name of the class.  */
     191  #define CLASS_NAME(CLASS) (TYPE_NAME (CLASS))
     192  /* CLASS_SUPER_NAME is the name of the superclass, or, in the case of
     193     categories, it is the name of the category itself.  */
     194  #define CLASS_SUPER_NAME(CLASS) (TYPE_CONTEXT (CLASS))
     195  #define CLASS_IVARS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 0)
     196  #define CLASS_RAW_IVARS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 1)
     197  #define CLASS_NST_METHODS(CLASS) (TYPE_MIN_VALUE_RAW (CLASS))
     198  #define CLASS_CLS_METHODS(CLASS) (TYPE_MAX_VALUE_RAW (CLASS))
     199  #define CLASS_STATIC_TEMPLATE(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 2)
     200  #define CLASS_CATEGORY_LIST(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 3)
     201  #define CLASS_PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 4)
     202  #define TOTAL_CLASS_RAW_IVARS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 5)
     203  #define CLASS_HAS_EXCEPTION_ATTR(CLASS) (TYPE_LANG_FLAG_0 (CLASS))
     204  
     205  #define PROTOCOL_NAME(CLASS) (TYPE_NAME (CLASS))
     206  #define PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 0)
     207  #define PROTOCOL_NST_METHODS(CLASS) (TYPE_MIN_VALUE_RAW (CLASS))
     208  #define PROTOCOL_CLS_METHODS(CLASS) (TYPE_MAX_VALUE_RAW (CLASS))
     209  #define PROTOCOL_FORWARD_DECL(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 1)
     210  #define PROTOCOL_DEFINED(CLASS) TREE_USED (CLASS)
     211  #define PROTOCOL_OPTIONAL_CLS_METHODS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 2)
     212  #define PROTOCOL_OPTIONAL_NST_METHODS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 3)
     213  
     214  /* For CATEGORY_INTERFACE_TYPE, CLASS_INTERFACE_TYPE or PROTOCOL_INTERFACE_TYPE */
     215  #define CLASS_PROPERTY_DECL(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 6)
     216  /* For CLASS_IMPLEMENTATION_TYPE or CATEGORY_IMPLEMENTATION_TYPE. */
     217  #define IMPL_PROPERTY_DECL(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 6)
     218  
     219  /* TREE_DEPRECATED is used for a CLASS_INTERFACE_TYPE or PROTOCOL_INTERFACE_TYPE.  */
     220  
     221  /* TYPE_ATTRIBUTES is used for a CLASS_INTERFACE_TYPE or PROTOCOL_INTERFACE_TYPE.  */
     222  
     223  /* ObjC-specific information pertaining to RECORD_TYPEs are stored in
     224     the LANG_SPECIFIC structures, which may itself need allocating first.  */
     225  
     226  /* The following three macros must be overridden (in objcp/objcp-decl.h)
     227     for Objective-C++.  */
     228  #define TYPE_OBJC_INFO(TYPE) TYPE_LANG_SPECIFIC (TYPE)->objc_info
     229  #define SIZEOF_OBJC_TYPE_LANG_SPECIFIC sizeof (struct lang_type)
     230  #define ALLOC_OBJC_TYPE_LANG_SPECIFIC(NODE)				\
     231    do {									\
     232        TYPE_LANG_SPECIFIC (NODE) = ggc_cleared_alloc<struct lang_type> (); \
     233    } while (0)
     234  
     235  #define TYPE_HAS_OBJC_INFO(TYPE)				\
     236  	(TYPE_LANG_SPECIFIC (TYPE) && TYPE_OBJC_INFO (TYPE))
     237  #define TYPE_OBJC_INTERFACE(TYPE) TREE_VEC_ELT (TYPE_OBJC_INFO (TYPE), 0)
     238  #define TYPE_OBJC_PROTOCOL_LIST(TYPE) TREE_VEC_ELT (TYPE_OBJC_INFO (TYPE), 1)
     239  
     240  
     241  #define INIT_TYPE_OBJC_INFO(TYPE)				\
     242  	do							\
     243  	  {							\
     244  	    if (!TYPE_LANG_SPECIFIC (TYPE))			\
     245  	      ALLOC_OBJC_TYPE_LANG_SPECIFIC(TYPE);		\
     246  	    if (!TYPE_OBJC_INFO (TYPE))				\
     247  	      TYPE_OBJC_INFO (TYPE)				\
     248  		= make_tree_vec (OBJC_INFO_SLOT_ELTS);		\
     249  	  }							\
     250  	while (0)
     251  
     252  #define DUP_TYPE_OBJC_INFO(DST, SRC)				\
     253  	do							\
     254  	  {							\
     255  	    ALLOC_OBJC_TYPE_LANG_SPECIFIC(DST);			\
     256  	    if (TYPE_LANG_SPECIFIC (SRC))			\
     257  	      memcpy (TYPE_LANG_SPECIFIC (DST),			\
     258  		      TYPE_LANG_SPECIFIC (SRC),			\
     259  		      SIZEOF_OBJC_TYPE_LANG_SPECIFIC);		\
     260  	    TYPE_OBJC_INFO (DST)				\
     261  	      = make_tree_vec (OBJC_INFO_SLOT_ELTS);		\
     262  	  }							\
     263  	while (0)
     264  
     265  #define TYPED_OBJECT(TYPE)					\
     266  	(TREE_CODE (TYPE) == RECORD_TYPE			\
     267  	 && TYPE_HAS_OBJC_INFO (TYPE)				\
     268  	 && TYPE_OBJC_INTERFACE (TYPE))
     269  #define OBJC_TYPE_NAME(TYPE) TYPE_NAME(TYPE)
     270  #define OBJC_SET_TYPE_NAME(TYPE, NAME) (TYPE_NAME (TYPE) = NAME)
     271  
     272  /* Hash tables to manage the global pool of method prototypes.  */
     273  
     274  typedef struct hashed_entry	*hash;
     275  typedef struct hashed_attribute	*attr;
     276  
     277  struct GTY(()) hashed_attribute {
     278    attr next;
     279    tree value;
     280  };
     281  
     282  struct GTY(()) hashed_entry {
     283    attr list;
     284    hash next;
     285    tree key;
     286  };
     287  
     288  #define SIZEHASHTABLE		257
     289  
     290  /* An array of all the local variables in the current function that
     291     need to be marked as volatile.  */
     292  extern GTY(()) vec<tree, va_gc> *local_variables_to_volatilize;
     293  
     294  /* Objective-C/Objective-C++ @implementation list.  */
     295  
     296  struct GTY(()) imp_entry {
     297    struct imp_entry *next;
     298    tree imp_context;
     299    tree imp_template;
     300    tree class_decl;		/* _OBJC[_v2]_CLASS/CATEGORY_<my_name>; */
     301    tree meta_decl;		/* _OBJC[_v2]_METACLASS_<my_name>; */
     302    BOOL_BITFIELD has_cxx_cdtors : 1;
     303  };
     304  
     305  extern GTY(()) struct imp_entry *imp_list;
     306  extern GTY(()) int imp_count;	/* `@implementation' */
     307  extern GTY(()) int cat_count;	/* `@category' */
     308  
     309  extern GTY(()) enum objc_ivar_visibility_kind objc_ivar_visibility;
     310  
     311  /* Objective-C/Objective-C++ global tree enumeration.  */
     312  
     313  enum objc_tree_index
     314  {
     315      OCTI_STATIC_NST,
     316      OCTI_STATIC_NST_DECL,
     317      OCTI_SELF_ID,
     318      OCTI_UCMD_ID,
     319  
     320      OCTI_SELF_DECL,
     321      OCTI_UMSG_DECL,
     322      OCTI_UMSG_FAST_DECL,
     323      OCTI_UMSG_SUPER_DECL,
     324      OCTI_UMSG_STRET_DECL,
     325      OCTI_UMSG_SUPER_STRET_DECL,
     326      OCTI_GET_CLASS_DECL,
     327      OCTI_GET_MCLASS_DECL,
     328      OCTI_SUPER_TYPE,
     329      OCTI_SEL_TYPE,
     330      OCTI_ID_TYPE,
     331      OCTI_INSTANCE_TYPE,
     332      OCTI_CLS_TYPE,
     333      OCTI_NST_TYPE,
     334      OCTI_PROTO_TYPE,
     335  
     336      OCTI_INTF_CHAIN,
     337      OCTI_PROTO_CHAIN,
     338      OCTI_IMPL_CHAIN,
     339      OCTI_CLS_REF_CHAIN,
     340      OCTI_SEL_REF_CHAIN,
     341      OCTI_IVAR_CHAIN,
     342      OCTI_CLS_NAMES_CHAIN,
     343      OCTI_METH_VAR_NAMES_CHAIN,
     344      OCTI_METH_VAR_TYPES_CHAIN,
     345  
     346      OCTI_SYMBOLS_DECL,
     347      OCTI_NST_VAR_DECL,
     348      OCTI_CLS_VAR_DECL,
     349      OCTI_NST_METH_DECL,
     350      OCTI_CLS_METH_DECL,
     351      OCTI_CLS_DECL,
     352      OCTI_MCLS_DECL,
     353      OCTI_SEL_TABLE_DECL,
     354      OCTI_MODULES_DECL,
     355      OCTI_GNU_INIT_DECL,
     356  
     357      OCTI_INTF_CTX,
     358      OCTI_IMPL_CTX,
     359      OCTI_METH_CTX,
     360      OCTI_IVAR_CTX,
     361  
     362      OCTI_IMPL_TEMPL,
     363      OCTI_CLS_TEMPL,
     364      OCTI_CAT_TEMPL,
     365      OCTI_UPRIV_REC,
     366      OCTI_PROTO_TEMPL,
     367      OCTI_SEL_TEMPL,
     368      OCTI_UCLS_SUPER_REF,
     369      OCTI_UUCLS_SUPER_REF,
     370      OCTI_METH_TEMPL,
     371      OCTI_IVAR_TEMPL,
     372      OCTI_METH_LIST_TEMPL,
     373      OCTI_METH_PROTO_LIST_TEMPL,
     374      OCTI_IVAR_LIST_TEMPL,
     375      OCTI_SYMTAB_TEMPL,
     376      OCTI_MODULE_TEMPL,
     377      OCTI_SUPER_TEMPL,
     378      OCTI_OBJ_REF,
     379      OCTI_CLS_REF,
     380      OCTI_METH_PROTO_TEMPL,
     381      OCTI_FUNCTION1_TEMPL,
     382      OCTI_FUNCTION2_TEMPL,
     383  
     384      OCTI_OBJ_ID,
     385      OCTI_CLS_ID,
     386      OCTI_ID_NAME,
     387      OCTI_INSTANCETYPE_NAME,
     388      OCTI_CLASS_NAME,
     389      OCTI_SEL_NAME,
     390      OCTI_CNST_STR_ID,
     391      OCTI_CNST_STR_TYPE,
     392      OCTI_CNST_STR_GLOB_ID,
     393      OCTI_STRING_CLASS_DECL,
     394      OCTI_INTERNAL_CNST_STR_TYPE,
     395      OCTI_SUPER_DECL,
     396      OCTI_SUPER_SUPERFIELD_ID,
     397      OCTI_UMSG_NONNIL_DECL,
     398      OCTI_UMSG_NONNIL_STRET_DECL,
     399      OCTI_STORAGE_CLS,
     400      OCTI_EXCEPTION_EXTRACT_DECL,
     401      OCTI_EXCEPTION_TRY_ENTER_DECL,
     402      OCTI_EXCEPTION_TRY_EXIT_DECL,
     403      OCTI_EXCEPTION_MATCH_DECL,
     404      OCTI_EXCEPTION_THROW_DECL,
     405      OCTI_SYNC_ENTER_DECL,
     406      OCTI_SYNC_EXIT_DECL,
     407      OCTI_SETJMP_DECL,
     408      OCTI_EXCDATA_TEMPL,
     409      OCTI_STACK_EXCEPTION_DATA_DECL,
     410      OCTI_LOCAL_EXCEPTION_DECL,
     411      OCTI_RETHROW_EXCEPTION_DECL,
     412      OCTI_EVAL_ONCE_DECL,
     413      OCTI_CATCH_TYPE,
     414      OCTI_EXECCLASS_DECL,
     415  
     416      OCTI_ASSIGN_IVAR_DECL,
     417      OCTI_ASSIGN_IVAR_FAST_DECL,
     418      OCTI_ASSIGN_GLOBAL_DECL,
     419      OCTI_ASSIGN_STRONGCAST_DECL,
     420  
     421      OCTI_FAST_ENUM_STATE_TEMP,
     422      OCTI_ENUM_MUTATION_DECL,
     423  
     424      OCTI_GET_PROPERTY_DECL,
     425      OCTI_SET_PROPERTY_DECL,
     426      OCTI_COPY_STRUCT_DECL,
     427      OCTI_GET_PROPERTY_STRUCT_DECL,
     428      OCTI_SET_PROPERTY_STRUCT_DECL,
     429  
     430      /* TODO: Add comment.  */
     431      /* "V1" stuff.  */
     432      OCTI_V1_PROP_LIST_TEMPL,
     433      OCTI_V1_PROP_NAME_ATTR_CHAIN,
     434  
     435      OCTI_MAX
     436  };
     437  
     438  extern GTY(()) tree objc_global_trees[OCTI_MAX];
     439  
     440  /* List of classes with list of their static instances.  */
     441  #define objc_static_instances	objc_global_trees[OCTI_STATIC_NST]
     442  
     443  /* The declaration of the array administrating the static instances.  */
     444  #define static_instances_decl	objc_global_trees[OCTI_STATIC_NST_DECL]
     445  
     446  /* Some commonly used instances of "identifier_node".  */
     447  
     448  #define self_id			objc_global_trees[OCTI_SELF_ID]
     449  #define ucmd_id			objc_global_trees[OCTI_UCMD_ID]
     450  
     451  #define self_decl		objc_global_trees[OCTI_SELF_DECL]
     452  #define umsg_decl		objc_global_trees[OCTI_UMSG_DECL]
     453  #define umsg_fast_decl		objc_global_trees[OCTI_UMSG_FAST_DECL]
     454  #define umsg_super_decl		objc_global_trees[OCTI_UMSG_SUPER_DECL]
     455  #define umsg_stret_decl		objc_global_trees[OCTI_UMSG_STRET_DECL]
     456  #define umsg_super_stret_decl	objc_global_trees[OCTI_UMSG_SUPER_STRET_DECL]
     457  #define objc_get_class_decl	objc_global_trees[OCTI_GET_CLASS_DECL]
     458  #define objc_get_meta_class_decl			\
     459  				objc_global_trees[OCTI_GET_MCLASS_DECL]
     460  
     461  #define objc_super_type		objc_global_trees[OCTI_SUPER_TYPE]
     462  #define objc_selector_type		objc_global_trees[OCTI_SEL_TYPE]
     463  #define objc_object_type	objc_global_trees[OCTI_ID_TYPE]
     464  #define objc_instancetype_type	objc_global_trees[OCTI_INSTANCE_TYPE]
     465  #define objc_class_type		objc_global_trees[OCTI_CLS_TYPE]
     466  #define objc_instance_type	objc_global_trees[OCTI_NST_TYPE]
     467  #define objc_protocol_type	objc_global_trees[OCTI_PROTO_TYPE]
     468  
     469  /* Type checking macros.  */
     470  
     471  #define IS_ID(TYPE)							\
     472  	(TREE_CODE (TYPE) == POINTER_TYPE				\
     473  	 && (TYPE_MAIN_VARIANT (TREE_TYPE (TYPE))			\
     474  	     == TREE_TYPE (objc_object_type)))
     475  
     476  #define IS_CLASS(TYPE)							\
     477  	(TREE_CODE (TYPE) == POINTER_TYPE				\
     478  	 && (TYPE_MAIN_VARIANT (TREE_TYPE (TYPE))			\
     479  	     == TREE_TYPE (objc_class_type)))
     480  
     481  #define IS_PROTOCOL_QUALIFIED_UNTYPED(TYPE)				\
     482  	((IS_ID (TYPE) || IS_CLASS (TYPE))				\
     483  	 && TYPE_HAS_OBJC_INFO (TREE_TYPE (TYPE))			\
     484  	 && TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (TYPE)))
     485  
     486  #define IS_SUPER(TYPE)							\
     487  	(TREE_CODE (TYPE) == POINTER_TYPE				\
     488  	 && TREE_TYPE (TYPE) == objc_super_template)
     489  
     490  #define interface_chain		objc_global_trees[OCTI_INTF_CHAIN]
     491  #define protocol_chain		objc_global_trees[OCTI_PROTO_CHAIN]
     492  #define implemented_classes	objc_global_trees[OCTI_IMPL_CHAIN]
     493  
     494  /* Chains to manage selectors that are referenced and defined in the
     495     module.  */
     496  
     497  #define cls_ref_chain		objc_global_trees[OCTI_CLS_REF_CHAIN]	/* Classes referenced.  */
     498  #define sel_ref_chain		objc_global_trees[OCTI_SEL_REF_CHAIN]	/* Selectors referenced.  */
     499  #define objc_ivar_chain		objc_global_trees[OCTI_IVAR_CHAIN]
     500  
     501  /* Chains to manage uniquing of strings.  */
     502  
     503  #define class_names_chain	objc_global_trees[OCTI_CLS_NAMES_CHAIN]
     504  #define meth_var_names_chain	objc_global_trees[OCTI_METH_VAR_NAMES_CHAIN]
     505  #define meth_var_types_chain	objc_global_trees[OCTI_METH_VAR_TYPES_CHAIN]
     506  
     507  
     508  /* Backend data declarations.  */
     509  
     510  #define UOBJC_SYMBOLS_decl		objc_global_trees[OCTI_SYMBOLS_DECL]
     511  #define UOBJC_INSTANCE_VARIABLES_decl	objc_global_trees[OCTI_NST_VAR_DECL]
     512  #define UOBJC_CLASS_VARIABLES_decl	objc_global_trees[OCTI_CLS_VAR_DECL]
     513  #define UOBJC_INSTANCE_METHODS_decl	objc_global_trees[OCTI_NST_METH_DECL]
     514  #define UOBJC_CLASS_METHODS_decl	objc_global_trees[OCTI_CLS_METH_DECL]
     515  #define UOBJC_CLASS_decl		objc_global_trees[OCTI_CLS_DECL]
     516  #define UOBJC_METACLASS_decl		objc_global_trees[OCTI_MCLS_DECL]
     517  #define UOBJC_SELECTOR_TABLE_decl	objc_global_trees[OCTI_SEL_TABLE_DECL]
     518  #define UOBJC_MODULES_decl		objc_global_trees[OCTI_MODULES_DECL]
     519  #define GNU_INIT_decl			objc_global_trees[OCTI_GNU_INIT_DECL]
     520  
     521  /* The following are used when compiling a class implementation.
     522     implementation_template will normally be an interface, however if
     523     none exists this will be equal to objc_implementation_context...it is
     524     set in start_class.  */
     525  
     526  #define objc_interface_context		objc_global_trees[OCTI_INTF_CTX]
     527  #define objc_implementation_context	objc_global_trees[OCTI_IMPL_CTX]
     528  #define objc_method_context		objc_global_trees[OCTI_METH_CTX]
     529  #define objc_ivar_context		objc_global_trees[OCTI_IVAR_CTX]
     530  
     531  #define implementation_template	objc_global_trees[OCTI_IMPL_TEMPL]
     532  #define objc_class_template	objc_global_trees[OCTI_CLS_TEMPL]
     533  #define objc_category_template	objc_global_trees[OCTI_CAT_TEMPL]
     534  #define uprivate_record		objc_global_trees[OCTI_UPRIV_REC]
     535  #define objc_protocol_template	objc_global_trees[OCTI_PROTO_TEMPL]
     536  #define objc_selector_template	objc_global_trees[OCTI_SEL_TEMPL]
     537  #define ucls_super_ref		objc_global_trees[OCTI_UCLS_SUPER_REF]
     538  #define uucls_super_ref		objc_global_trees[OCTI_UUCLS_SUPER_REF]
     539  
     540  #define umsg_nonnil_decl	objc_global_trees[OCTI_UMSG_NONNIL_DECL]
     541  #define umsg_nonnil_stret_decl	objc_global_trees[OCTI_UMSG_NONNIL_STRET_DECL]
     542  #define objc_storage_class	objc_global_trees[OCTI_STORAGE_CLS]
     543  #define objc_exception_extract_decl		\
     544  				objc_global_trees[OCTI_EXCEPTION_EXTRACT_DECL]
     545  #define objc_exception_try_enter_decl		\
     546  				objc_global_trees[OCTI_EXCEPTION_TRY_ENTER_DECL]
     547  #define objc_exception_try_exit_decl		\
     548  				objc_global_trees[OCTI_EXCEPTION_TRY_EXIT_DECL]
     549  #define objc_exception_match_decl		\
     550  				objc_global_trees[OCTI_EXCEPTION_MATCH_DECL]
     551  #define objc_exception_throw_decl		\
     552  				objc_global_trees[OCTI_EXCEPTION_THROW_DECL]
     553  #define objc_sync_enter_decl	objc_global_trees[OCTI_SYNC_ENTER_DECL]
     554  #define objc_sync_exit_decl	objc_global_trees[OCTI_SYNC_EXIT_DECL]
     555  #define objc_exception_data_template		\
     556  				objc_global_trees[OCTI_EXCDATA_TEMPL]
     557  #define objc_setjmp_decl	objc_global_trees[OCTI_SETJMP_DECL]
     558  #define objc_stack_exception_data		\
     559  				objc_global_trees[OCTI_STACK_EXCEPTION_DATA_DECL]
     560  #define objc_caught_exception	objc_global_trees[OCTI_LOCAL_EXCEPTION_DECL]
     561  #define objc_rethrow_exception	objc_global_trees[OCTI_RETHROW_EXCEPTION_DECL]
     562  #define objc_eval_once		objc_global_trees[OCTI_EVAL_ONCE_DECL]
     563  #define objc_catch_type		objc_global_trees[OCTI_CATCH_TYPE]
     564  
     565  #define execclass_decl		objc_global_trees[OCTI_EXECCLASS_DECL]
     566  
     567  #define objc_assign_ivar_decl	objc_global_trees[OCTI_ASSIGN_IVAR_DECL]
     568  #define objc_assign_ivar_fast_decl		\
     569  				objc_global_trees[OCTI_ASSIGN_IVAR_FAST_DECL]
     570  #define objc_assign_global_decl	objc_global_trees[OCTI_ASSIGN_GLOBAL_DECL]
     571  #define objc_assign_strong_cast_decl		\
     572  				objc_global_trees[OCTI_ASSIGN_STRONGCAST_DECL]
     573  
     574  #define objc_method_template	objc_global_trees[OCTI_METH_TEMPL]
     575  #define objc_ivar_template	objc_global_trees[OCTI_IVAR_TEMPL]
     576  #define objc_method_list_ptr	objc_global_trees[OCTI_METH_LIST_TEMPL]
     577  #define objc_method_proto_list_ptr		\
     578  				objc_global_trees[OCTI_METH_PROTO_LIST_TEMPL]
     579  #define objc_ivar_list_ptr	objc_global_trees[OCTI_IVAR_LIST_TEMPL]
     580  #define objc_symtab_template	objc_global_trees[OCTI_SYMTAB_TEMPL]
     581  #define objc_module_template	objc_global_trees[OCTI_MODULE_TEMPL]
     582  #define objc_super_template	objc_global_trees[OCTI_SUPER_TEMPL]
     583  #define objc_object_reference	objc_global_trees[OCTI_OBJ_REF]
     584  #define objc_class_reference	objc_global_trees[OCTI_CLS_REF]
     585  #define objc_method_prototype_template		\
     586  				objc_global_trees[OCTI_METH_PROTO_TEMPL]
     587  #define function1_template	objc_global_trees[OCTI_FUNCTION1_TEMPL]
     588  #define function2_template	objc_global_trees[OCTI_FUNCTION2_TEMPL]
     589  
     590  #define objc_object_id		objc_global_trees[OCTI_OBJ_ID]
     591  #define objc_class_id		objc_global_trees[OCTI_CLS_ID]
     592  #define objc_object_name        objc_global_trees[OCTI_ID_NAME]
     593  #define objc_instancetype_name	objc_global_trees[OCTI_INSTANCETYPE_NAME]
     594  #define objc_class_name		objc_global_trees[OCTI_CLASS_NAME]
     595  #define objc_selector_name	objc_global_trees[OCTI_SEL_NAME]
     596  
     597  /* Constant string classes.  */
     598  #define constant_string_id	objc_global_trees[OCTI_CNST_STR_ID]
     599  #define constant_string_type	objc_global_trees[OCTI_CNST_STR_TYPE]
     600  #define constant_string_global_id		\
     601  				objc_global_trees[OCTI_CNST_STR_GLOB_ID]
     602  #define string_class_decl	objc_global_trees[OCTI_STRING_CLASS_DECL]
     603  #define internal_const_str_type	objc_global_trees[OCTI_INTERNAL_CNST_STR_TYPE]
     604  
     605  #define UOBJC_SUPER_decl	objc_global_trees[OCTI_SUPER_DECL]
     606  #define super_superclassfield_id \
     607  				objc_global_trees[OCTI_SUPER_SUPERFIELD_ID]
     608  
     609  #define objc_fast_enumeration_state_template	\
     610                                  objc_global_trees[OCTI_FAST_ENUM_STATE_TEMP]
     611  #define objc_enumeration_mutation_decl		\
     612                                  objc_global_trees[OCTI_ENUM_MUTATION_DECL]
     613  
     614  /* Declarations of functions used when synthesizing property
     615     accessors.  */
     616  #define objc_getProperty_decl	objc_global_trees[OCTI_GET_PROPERTY_DECL]
     617  #define objc_setProperty_decl	objc_global_trees[OCTI_SET_PROPERTY_DECL]
     618  #define objc_copyStruct_decl	objc_global_trees[OCTI_COPY_STRUCT_DECL]
     619  #define objc_getPropertyStruct_decl \
     620  				objc_global_trees[OCTI_GET_PROPERTY_STRUCT_DECL]
     621  #define objc_setPropertyStruct_decl \
     622  				objc_global_trees[OCTI_SET_PROPERTY_STRUCT_DECL]
     623  
     624  /* TODO: Add comment.  */
     625  /* V1 stuff.  */
     626  #define objc_prop_list_ptr	objc_global_trees[OCTI_V1_PROP_LIST_TEMPL]
     627  #define prop_names_attr_chain	objc_global_trees[OCTI_V1_PROP_NAME_ATTR_CHAIN]
     628  
     629  /* Reserved tag definitions.  */
     630  
     631  #define OBJECT_TYPEDEF_NAME		"id"
     632  #define INSTANCE_TYPEDEF_NAME		"instancetype"
     633  #define CLASS_TYPEDEF_NAME		"Class"
     634  #define SEL_TYPEDEF_NAME		"SEL"
     635  
     636  #define TAG_OBJECT			"objc_object"
     637  #define TAG_CLASS			"objc_class"
     638  #define TAG_SUPER			"objc_super"
     639  #define TAG_SELECTOR			"objc_selector"
     640  
     641  #define UTAG_CLASS			"_objc_class"
     642  #define UTAG_IVAR			"_objc_ivar"
     643  #define UTAG_IVAR_LIST			"_objc_ivar_list"
     644  #define UTAG_METHOD			"_objc_method"
     645  #define UTAG_METHOD_LIST		"_objc_method_list"
     646  #define UTAG_CATEGORY			"_objc_category"
     647  #define UTAG_MODULE			"_objc_module"
     648  #define UTAG_SYMTAB			"_objc_symtab"
     649  #define UTAG_SUPER			"_objc_super"
     650  #define UTAG_SELECTOR			"_objc_selector"
     651  
     652  #define UTAG_PROTOCOL			"_objc_protocol"
     653  #define UTAG_METHOD_PROTOTYPE		"_objc_method_prototype"
     654  #define UTAG_METHOD_PROTOTYPE_LIST	"_objc__method_prototype_list"
     655  
     656  #define PROTOCOL_OBJECT_CLASS_NAME	"Protocol"
     657  
     658  #define TAG_EXCEPTIONTHROW		"objc_exception_throw"
     659  #define TAG_SYNCENTER			"objc_sync_enter"
     660  #define TAG_SYNCEXIT			"objc_sync_exit"
     661  
     662  /* Really should be NeXT private.  */
     663  #define UTAG_EXCDATA			"_objc_exception_data"
     664  
     665  #define TAG_CXX_CONSTRUCT		".cxx_construct"
     666  #define TAG_CXX_DESTRUCT		".cxx_destruct"
     667  
     668  #define TAG_ENUMERATION_MUTATION        "objc_enumerationMutation"
     669  #define TAG_FAST_ENUMERATION_STATE      "__objcFastEnumerationState"
     670  
     671  enum string_section
     672  {
     673    class_names,		/* class, category, protocol, module names */
     674    meth_var_names,	/* method and variable names */
     675    meth_var_types,	/* method and variable type descriptors */
     676    prop_names_attr	/* property names and their attributes. */
     677  };
     678  
     679  #define METHOD_DEF			0
     680  #define METHOD_REF			1
     681  
     682  #define BUFSIZE				1024
     683  
     684  #define CLS_FACTORY			0x0001L
     685  #define CLS_META			0x0002L
     686  
     687  /* Runtime metadata flags - ??? apparently unused.  */
     688  
     689  #define OBJC_MODIFIER_STATIC		0x00000001
     690  #define OBJC_MODIFIER_FINAL		0x00000002
     691  #define OBJC_MODIFIER_PUBLIC		0x00000004
     692  #define OBJC_MODIFIER_PRIVATE		0x00000008
     693  #define OBJC_MODIFIER_PROTECTED		0x00000010
     694  #define OBJC_MODIFIER_NATIVE		0x00000020
     695  #define OBJC_MODIFIER_SYNCHRONIZED	0x00000040
     696  #define OBJC_MODIFIER_ABSTRACT		0x00000080
     697  #define OBJC_MODIFIER_VOLATILE		0x00000100
     698  #define OBJC_MODIFIER_TRANSIENT		0x00000200
     699  #define OBJC_MODIFIER_NONE_SPECIFIED	0x80000000
     700  
     701  /* Exception handling constructs.  We begin by having the parser do most
     702     of the work and passing us blocks.
     703     This allows us to handle different exceptions implementations.  */
     704  
     705  /* Stack of open try blocks.  */
     706  
     707  struct objc_try_context
     708  {
     709    struct objc_try_context *outer;
     710  
     711    /* Statements (or statement lists) as processed by the parser.  */
     712    tree try_body;
     713    tree finally_body;
     714  
     715    /* Some file position locations.  */
     716    location_t try_locus;
     717    location_t end_try_locus;
     718    location_t end_catch_locus;
     719    location_t finally_locus;
     720    location_t end_finally_locus;
     721  
     722    /* A STATEMENT_LIST of CATCH_EXPRs, appropriate for sticking into op1
     723       of a TRY_CATCH_EXPR.  Even when doing Darwin setjmp.  */
     724    tree catch_list;
     725  
     726    /* The CATCH_EXPR of an open @catch clause.  */
     727    tree current_catch;
     728  
     729    /* The VAR_DECL holding  __builtin_eh_pointer (or equivalent).  */
     730    tree caught_decl;
     731    tree stack_decl;
     732    tree rethrow_decl;
     733  };
     734  
     735  /*  A small number of routines used by the FE parser and the runtime code
     736     generators.  Put here as inlines for efficiency in non-lto builds rather
     737     than making them externs.  */
     738  
     739  extern tree objc_create_temporary_var (tree, const char *);
     740  
     741  size_t objc_common_tree_size (enum tree_code code);
     742  
     743  
     744  #define objc_is_object_id(TYPE) (OBJC_TYPE_NAME (TYPE) == objc_object_id)
     745  #define objc_is_class_id(TYPE) (OBJC_TYPE_NAME (TYPE) == objc_class_id)
     746  
     747  /* Retrieve category interface CAT_NAME (if any) associated with CLASS.  */
     748  inline tree
     749  lookup_category (tree klass, tree cat_name)
     750  {
     751    tree category = CLASS_CATEGORY_LIST (klass);
     752  
     753    while (category && CLASS_SUPER_NAME (category) != cat_name)
     754      category = CLASS_CATEGORY_LIST (category);
     755    return category;
     756  }
     757  
     758  /* Count only the fields occurring in T.  */
     759  inline int
     760  ivar_list_length (tree t)
     761  {
     762    int count = 0;
     763  
     764    for (; t; t = DECL_CHAIN (t))
     765      if (TREE_CODE (t) == FIELD_DECL)
     766        ++count;
     767  
     768    return count;
     769  }
     770  
     771  inline tree
     772  is_ivar (tree decl_chain, tree ident)
     773  {
     774    for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain))
     775      if (DECL_NAME (decl_chain) == ident)
     776        return decl_chain;
     777    return NULL_TREE;
     778  }
     779  
     780  #endif /* GCC_OBJC_ACT_H */