📄 cp-tree.h
字号:
extern int flag_cadillac;/* C++ language-specific tree codes. */#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) SYM,enum cplus_tree_code { __DUMMY = LAST_AND_UNUSED_TREE_CODE,#include "tree.def" LAST_CPLUS_TREE_CODE};#undef DEFTREECODE/* Override OFFSET_REFs from the back-end, as we want our very own. *//* Allow complex pointer to members to work correctly. */#define OFFSET_REF CP_OFFSET_REFenum languages { lang_c, lang_cplusplus };/* Macros to make error reporting functions' lives easier. */#define TYPE_IDENTIFIER(NODE) (DECL_NAME (TYPE_NAME (NODE)))#define TYPE_NAME_STRING(NODE) (IDENTIFIER_POINTER (TYPE_IDENTIFIER (NODE)))#define TYPE_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (TYPE_IDENTIFIER (NODE)))#define TYPE_ASSEMBLER_NAME_STRING(NODE) (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE))))#define TYPE_ASSEMBLER_NAME_LENGTH(NODE) (IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (TYPE_NAME (NODE))))/* The _DECL for this _TYPE. */#define TYPE_MAIN_DECL(NODE) (TYPE_NAME (NODE))#define IS_AGGR_TYPE(t) (TYPE_LANG_FLAG_5 (t))#define IS_AGGR_TYPE_CODE(t) (t == RECORD_TYPE || t == UNION_TYPE || t == UNINSTANTIATED_P_TYPE)#define IS_AGGR_TYPE_2(TYPE1,TYPE2) \ (TREE_CODE (TYPE1) == TREE_CODE (TYPE2) \ && IS_AGGR_TYPE (TYPE1)&IS_AGGR_TYPE (TYPE2))#define IS_OVERLOAD_TYPE_CODE(t) (IS_AGGR_TYPE_CODE (t) || t == ENUMERAL_TYPE)#define IS_OVERLOAD_TYPE(t) (IS_OVERLOAD_TYPE_CODE (TREE_CODE (t)))/* In a *_TYPE, nonzero means a built-in type. */#define TYPE_BUILT_IN(NODE) TYPE_LANG_FLAG_6(NODE)/* Macros which might want to be replaced by function calls. */#define DELTA_FROM_VTABLE_ENTRY(ENTRY) \ (!flag_vtable_thunks ? \ TREE_VALUE (CONSTRUCTOR_ELTS (ENTRY)) \ : TREE_CODE (TREE_OPERAND ((ENTRY), 0)) != THUNK_DECL ? integer_zero_node \ : build_int_2 (THUNK_DELTA (TREE_OPERAND ((ENTRY), 0)), 0))#if 1/* Virtual function addresses can be gotten from a virtual function table entry using this macro. */#define FNADDR_FROM_VTABLE_ENTRY(ENTRY) \ (!flag_vtable_thunks ? \ TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) \ : TREE_CODE (TREE_OPERAND ((ENTRY), 0)) != THUNK_DECL ? (ENTRY) \ : DECL_INITIAL (TREE_OPERAND ((ENTRY), 0)))#define SET_FNADDR_FROM_VTABLE_ENTRY(ENTRY,VALUE) \ (TREE_VALUE (TREE_CHAIN (TREE_CHAIN (CONSTRUCTOR_ELTS (ENTRY)))) = (VALUE))#define FUNCTION_ARG_CHAIN(NODE) (TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (NODE))))#define PROMOTES_TO_AGGR_TYPE(NODE,CODE) \ (((CODE) == TREE_CODE (NODE) \ && IS_AGGR_TYPE (TREE_TYPE (NODE))) \ || IS_AGGR_TYPE (NODE))#else#define FNADDR_FROM_VTABLE_ENTRY(ENTRY) (fnaddr_from_vtable_entry (ENTRY))#define SET_FNADDR_FROM_VTABLE_ENTRY(ENTRY,VALUE) \ (set_fnaddr_from_vtable_entry (ENTRY, VALUE))/* #define TYPE_NAME_STRING(NODE) (type_name_string (NODE)) */#define FUNCTION_ARG_CHAIN(NODE) (function_arg_chain (NODE))#define PROMOTES_TO_AGGR_TYPE(NODE,CODE) (promotes_to_aggr_type (NODE, CODE))/* #define IS_AGGR_TYPE_2(TYPE1, TYPE2) (is_aggr_type_2 (TYPE1, TYPE2)) */#endif/* Nonzero iff TYPE is uniquely derived from PARENT. Under MI, PARENT can be an ambiguous base class of TYPE, and this macro will be false. */#define UNIQUELY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) >= 0)#define ACCESSIBLY_DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, -1, (tree *)0) >= 0)#define ACCESSIBLY_UNIQUELY_DERIVED_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 1, (tree *)0) >= 0)#define DERIVED_FROM_P(PARENT, TYPE) (get_base_distance (PARENT, TYPE, 0, (tree *)0) != -1)/* Statistics show that while the GNU C++ compiler may generate thousands of different types during a compilation run, it generates relatively few (tens) of classtypes. Because of this, it is not costly to store a generous amount of information in classtype nodes. This struct must fill out to a multiple of 4 bytes. */struct lang_type{ struct { unsigned has_type_conversion : 1; unsigned has_int_conversion : 1; unsigned has_float_conversion : 1; unsigned has_init_ref : 1; unsigned gets_init_aggr : 1; unsigned has_assignment : 1; unsigned has_default_ctor : 1; unsigned uses_multiple_inheritance : 1; unsigned has_nonpublic_ctor : 2; unsigned has_nonpublic_assign_ref : 2; unsigned const_needs_init : 1; unsigned ref_needs_init : 1; unsigned has_const_assign_ref : 1; unsigned vtable_needs_writing : 1; unsigned has_assign_ref : 1; unsigned gets_new : 2; unsigned gets_delete : 2; unsigned has_call_overloaded : 1; unsigned has_array_ref_overloaded : 1; unsigned has_arrow_overloaded : 1; unsigned local_typedecls : 1; unsigned interface_only : 1; unsigned interface_unknown : 1; unsigned needs_virtual_reinit : 1; unsigned vec_delete_takes_size : 1; unsigned declared_class : 1; unsigned being_defined : 1; unsigned redefined : 1; unsigned no_globalize : 1; unsigned marked : 1; unsigned marked2 : 1; unsigned marked3 : 1; unsigned marked4 : 1; unsigned marked5 : 1; unsigned marked6 : 1; unsigned use_template : 2; unsigned debug_requested : 1; unsigned has_method_call_overloaded : 1; unsigned private_attr : 1; unsigned got_semicolon : 1; unsigned ptrmemfunc_flag : 1; unsigned is_signature : 1; unsigned is_signature_pointer : 1; unsigned is_signature_reference : 1; unsigned has_default_implementation : 1; unsigned grokking_typedef : 1; unsigned has_opaque_typedecls : 1; unsigned sigtable_has_been_generated : 1; unsigned was_anonymous : 1; unsigned has_real_assignment : 1; unsigned has_real_assign_ref : 1; unsigned has_const_init_ref : 1; unsigned has_complex_init_ref : 1; unsigned has_complex_assign_ref : 1; unsigned has_abstract_assign_ref : 1; unsigned non_aggregate : 1; /* The MIPS compiler gets it wrong if this struct also does not fill out to a multiple of 4 bytes. Add a member `dummy' with new bits if you go over the edge. */ unsigned dummy : 19; unsigned n_vancestors : 16; } type_flags; int cid; int n_ancestors; int vsize; int max_depth; int vfield_parent; union tree_node *vbinfo[2]; union tree_node *baselink_vec; union tree_node *vfields; union tree_node *vbases; union tree_node *vbase_size; union tree_node *tags; char *memoized_table_entry; char *search_slot;#ifdef ONLY_INT_FIELDS unsigned int mode : 8;#else enum machine_mode mode : 8;#endif unsigned char size_unit; unsigned char align; unsigned char sep_unit; union tree_node *sep; union tree_node *size; union tree_node *base_init_list; union tree_node *abstract_virtuals; union tree_node *as_list; union tree_node *id_as_list; union tree_node *binfo_as_list; union tree_node *friend_classes; char *mi_matrix; union tree_node *rtti; union tree_node *methods; union tree_node *signature; union tree_node *signature_pointer_to; union tree_node *signature_reference_to; int linenum;};#define CLASSTYPE_SOURCE_LINE(NODE) (TYPE_LANG_SPECIFIC(NODE)->linenum)/* Indicates whether or not (and how) a template was expanded for this class. 0=no information yet/non-template class 1=implicit template instantiation 2=explicit template specialization 3=explicit template instantiation */#define CLASSTYPE_USE_TEMPLATE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.use_template)/* Fields used for storing information before the class is defined. After the class is defined, these fields hold other information. *//* List of friends which were defined inline in this class definition. */#define CLASSTYPE_INLINE_FRIENDS(NODE) (TYPE_NONCOPIED_PARTS (NODE))/* Nonzero for _CLASSTYPE means that the _CLASSTYPE either has a special meaning for the assignment operator ("operator="), or one of its fields (or base members) has a special meaning defined. */#define TYPE_HAS_ASSIGNMENT(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_assignment)#define TYPE_HAS_REAL_ASSIGNMENT(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_real_assignment)/* Nonzero for _CLASSTYPE means that operator new and delete are defined, respectively. */#define TYPE_GETS_NEW(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.gets_new)#define TYPE_GETS_DELETE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.gets_delete)#define TYPE_GETS_REG_DELETE(NODE) (TYPE_GETS_DELETE (NODE) & 1)/* Nonzero for _CLASSTYPE means that operator vec delete is defined and takes the optional size_t argument. */#define TYPE_VEC_DELETE_TAKES_SIZE(NODE) \ (TYPE_LANG_SPECIFIC(NODE)->type_flags.vec_delete_takes_size)#define TYPE_VEC_NEW_USES_COOKIE(NODE) \ (TYPE_NEEDS_DESTRUCTOR (NODE) \ || (TYPE_LANG_SPECIFIC (NODE) && TYPE_VEC_DELETE_TAKES_SIZE (NODE)))/* Nonzero for TREE_LIST or _TYPE node means that this node is class-local. */#define TREE_NONLOCAL_FLAG(NODE) (TREE_LANG_FLAG_0 (NODE))/* Nonzero for a _CLASSTYPE node which we know to be private. */#define TYPE_PRIVATE_P(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.private_attr)/* Nonzero means that this _CLASSTYPE node defines ways of converting itself to other types. */#define TYPE_HAS_CONVERSION(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_type_conversion)/* Nonzero means that this _CLASSTYPE node can convert itself to an INTEGER_TYPE. */#define TYPE_HAS_INT_CONVERSION(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_int_conversion)/* Nonzero means that this _CLASSTYPE node can convert itself to an REAL_TYPE. */#define TYPE_HAS_REAL_CONVERSION(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_float_conversion)/* Nonzero means that this _CLASSTYPE node overloads operator=(X&). */#define TYPE_HAS_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_assign_ref)#define TYPE_HAS_CONST_ASSIGN_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_const_assign_ref)/* Nonzero means that this _CLASSTYPE node has an X(X&) constructor. */#define TYPE_HAS_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_init_ref)#define TYPE_HAS_CONST_INIT_REF(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_const_init_ref)/* Nonzero means that this _CLASSTYPE node has an X(X ...) constructor. Note that there must be other arguments, or this constructor is flagged as being erroneous. */#define TYPE_GETS_INIT_AGGR(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.gets_init_aggr)/* Nonzero means that this type is being defined. I.e., the left brace starting the definition of this type has been seen. */#define TYPE_BEING_DEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.being_defined)/* Nonzero means that this type has been redefined. In this case, if convenient, don't reprocess any methods that appear in its redefinition. */#define TYPE_REDEFINED(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.redefined)/* Nonzero means that this _CLASSTYPE node overloads the method call operator. In this case, all method calls go through `operator->()(...). */#define TYPE_OVERLOADS_METHOD_CALL_EXPR(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_method_call_overloaded)/* Nonzero means that this type is a signature. */# define IS_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)?TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature:0)# define SET_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature=1)# define CLEAR_SIGNATURE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature=0)/* Nonzero means that this type is a signature pointer type. */# define IS_SIGNATURE_POINTER(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature_pointer)/* Nonzero means that this type is a signature reference type. */# define IS_SIGNATURE_REFERENCE(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.is_signature_reference)/* Nonzero means that this signature type has a default implementation. */# define HAS_DEFAULT_IMPLEMENTATION(NODE) (TYPE_LANG_SPECIFIC(NODE)->type_flags.has_default_implementation)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -