X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree.h;h=343c037dce991d1b30c297324cb5e4c59c2a7ced;hb=3d4579306a1e66fe78122b92c463f7f6bac4fce9;hp=94a6b2eaef4f8e7a52484a7507e79cadae6a96ba;hpb=00e1545c7079dbb02c5a04790bef9a0208407778;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree.h b/gcc/tree.h index 94a6b2eaef4..343c037dce9 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -1,5 +1,5 @@ /* Front-end tree definitions for GNU compiler. - Copyright (C) 1989, 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright (C) 1989, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. This file is part of GNU CC. @@ -15,7 +15,8 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ +the Free Software Foundation, 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. */ #include "machmode.h" @@ -96,6 +97,8 @@ enum built_in_function BUILT_IN_APPLY_ARGS, BUILT_IN_APPLY, BUILT_IN_RETURN, + BUILT_IN_SETJMP, + BUILT_IN_LONGJMP, /* C++ extensions */ BUILT_IN_NEW, @@ -165,9 +168,110 @@ struct tree_common unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; - /* There is room for two more flags. */ + /* There is room for three more flags. */ }; +/* The following table lists the uses of each of the above flags and + for which types of nodes they are defined. Note that expressions + include decls. + + addressable_flag: + + TREE_ADDRESSABLE in + VAR_DECL, FUNCTION_DECL, CONSTRUCTOR, LABEL_DECL, ..._TYPE + IDENTIFIER_NODE + + static_flag: + + TREE_STATIC in + VAR_DECL, FUNCTION_DECL, CONSTRUCTOR + TREE_NO_UNUSED_WARNING in + CONVERT_EXPR, NOP_EXPR, COMPOUND_EXPR + TREE_VIA_VIRTUAL in + TREE_LIST or TREE_VEC + TREE_CONSTANT_OVERFLOW in + INTEGER_CST, REAL_CST, COMPLEX_CST + TREE_SYMBOL_REFERENCED in + IDENTIFIER_NODE + + public_flag: + + TREE_OVERFLOW in + INTEGER_CST, REAL_CST, COMPLEX_CST + TREE_PUBLIC in + VAR_DECL or FUNCTION_DECL + TREE_VIA_PUBLIC in + TREE_LIST or TREE_VEC + + private_flag: + + TREE_VIA_PRIVATE in + TREE_LIST or TREE_VEC + TREE_PRIVATE in + ??? unspecified nodes + + protected_flag: + + TREE_VIA_PROTECTED in + TREE_LIST + TREE_PROTECTED in + BLOCK + ??? unspecified nodes + + side_effects_flag: + + TREE_SIDE_EFFECTS in + all expressions + + volatile_flag: + + TREE_THIS_VOLATILE in + all expressions + TYPE_VOLATILE in + ..._TYPE + + readonly_flag: + + TREE_READONLY in + VAR_DECL, PARM_DECL, FIELD_DECL, ..._REF + ITERATOR_BOUND_P in + VAR_DECL if iterator (C) + TYPE_READONLY in + ..._TYPE + + constant_flag: + + TREE_CONSTANT in + all expressions + + permanent_flag: TREE_PERMANENT in all nodes + + unsigned_flag: + + TREE_UNSIGNED in + INTEGER_TYPE, ENUMERAL_TYPE, FIELD_DECL + DECL_BUILT_IN_NONANSI in + FUNCTION_DECL + TREE_PARMLIST in + TREE_PARMLIST (C++) + + asm_written_flag: + + TREE_ASM_WRITTEN in + VAR_DECL, FUNCTION_DECL, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE + BLOCK + + used_flag: + + TREE_USED in + expressions, IDENTIFIER_NODE + + raises_flag: + + TREE_RAISES in + expressions + + */ /* Define accessors for the fields that all tree nodes have (though some fields are not used for all kinds of nodes). */ @@ -406,6 +510,8 @@ struct tree_common struct tree_int_cst { char common[sizeof (struct tree_common)]; + struct rtx_def *rtl; /* acts as link to register transfer language + (rtl) info */ HOST_WIDE_INT int_cst_low; HOST_WIDE_INT int_cst_high; }; @@ -573,7 +679,6 @@ struct tree_block #define TYPE_MIN_VALUE(NODE) ((NODE)->type.minval) #define TYPE_MAX_VALUE(NODE) ((NODE)->type.maxval) #define TYPE_PRECISION(NODE) ((NODE)->type.precision) -#define TYPE_PARSE_INFO(NODE) ((NODE)->type.parse_info) #define TYPE_SYMTAB_ADDRESS(NODE) ((NODE)->type.symtab.address) #define TYPE_SYMTAB_POINTER(NODE) ((NODE)->type.symtab.pointer) #define TYPE_NAME(NODE) ((NODE)->type.name) @@ -620,6 +725,10 @@ struct tree_block If set in a SET_TYPE, indicates a bitstring type. */ #define TYPE_STRING_FLAG(NODE) ((NODE)->type.string_flag) +/* If non-NULL, this is a upper bound of the size (in bytes) of an + object of the given ARRAY_TYPE. This allows temporaries to be allocated. */ +#define TYPE_ARRAY_MAX_SIZE(ARRAY_TYPE) TYPE_MAX_VALUE (ARRAY_TYPE) + /* Indicates that objects of this type must be initialized by calling a function when they are created. */ #define TYPE_NEEDS_CONSTRUCTING(NODE) ((NODE)->type.needs_constructing_flag) @@ -628,6 +737,10 @@ struct tree_block the same way that the first union alternative would be passed. */ #define TYPE_TRANSPARENT_UNION(NODE) ((NODE)->type.transparent_union_flag) +/* Indicated that objects of this type should be layed out in as + compact a way as possible. */ +#define TYPE_PACKED(NODE) ((NODE)->type.packed_flag) + struct tree_type { char common[sizeof (struct tree_common)]; @@ -647,6 +760,7 @@ struct tree_type unsigned no_force_blk_flag : 1; unsigned needs_constructing_flag : 1; unsigned transparent_union_flag : 1; + unsigned packed_flag : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; unsigned lang_flag_2 : 1; @@ -654,12 +768,11 @@ struct tree_type unsigned lang_flag_4 : 1; unsigned lang_flag_5 : 1; unsigned lang_flag_6 : 1; - /* room for 5 more bits */ + /* room for 4 more bits */ unsigned int align; union tree_node *pointer_to; union tree_node *reference_to; - int parse_info; union {int address; char *pointer; } symtab; union tree_node *name; union tree_node *minval; @@ -771,6 +884,9 @@ struct tree_type containing function, or else yields NULL_TREE if the given decl has "file scope". */ #define DECL_CONTEXT(NODE) ((NODE)->decl.context) #define DECL_FIELD_CONTEXT(NODE) ((NODE)->decl.context) +/* In a DECL this is the field where configuration dependent machine + attributes are store */ +#define DECL_MACHINE_ATTRIBUTES(NODE) ((NODE)->decl.machine_attributes) /* In a FIELD_DECL, this is the field position, counting in bits, of the bit closest to the beginning of the structure. */ #define DECL_FIELD_BITPOS(NODE) ((NODE)->decl.arguments) @@ -784,6 +900,8 @@ struct tree_type #define DECL_ARGUMENTS(NODE) ((NODE)->decl.arguments) /* In FUNCTION_DECL, holds the decl for the return value. */ #define DECL_RESULT(NODE) ((NODE)->decl.result) +/* For a TYPE_DECL, holds the "original" type. (TREE_TYPE has the copy.) */ +#define DECL_ORIGINAL_TYPE(NODE) ((NODE)->decl.result) /* In PARM_DECL, holds the type as written (perhaps a function or array). */ #define DECL_ARG_TYPE_AS_WRITTEN(NODE) ((NODE)->decl.result) /* For a FUNCTION_DECL, holds the tree of BINDINGs. @@ -864,7 +982,7 @@ struct tree_type /* Nonzero for a given ..._DECL node means that this node represents an "abstract instance" of the given declaration (e.g. in the original declaration of an inline function). When generating symbolic debugging - information, we musn't try to generate any address information for nodes + information, we mustn't try to generate any address information for nodes marked as "abstract instances" because we don't actually generate any code or allocate any data space for such instances. */ #define DECL_ABSTRACT(NODE) ((NODE)->decl.abstract_flag) @@ -893,12 +1011,16 @@ struct tree_type #define TYPE_DECL_SUPPRESS_DEBUG(NODE) ((NODE)->decl.external_flag) -/* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'. - In LABEL_DECL nodes, nonzero means that an error message about - jumping into such a binding contour has been printed for this label. */ +/* In VAR_DECL and PARM_DECL nodes, nonzero means declared `register'. */ #define DECL_REGISTER(NODE) ((NODE)->decl.regdecl_flag) +/* In LABEL_DECL nodes, nonzero means that an error message about + jumping into such a binding contour has been printed for this label. */ +#define DECL_ERROR_ISSUED(NODE) ((NODE)->decl.regdecl_flag) /* In a FIELD_DECL, indicates this field should be bit-packed. */ #define DECL_PACKED(NODE) ((NODE)->decl.regdecl_flag) +/* In a FUNCTION_DECL with a non-zero DECL_CONTEXT, indicates that a + static chain is not needed. */ +#define DECL_NO_STATIC_CHAIN(NODE) ((NODE)->decl.regdecl_flag) /* Nonzero in a ..._DECL means this variable is ref'd from a nested function. For VAR_DECL nodes, PARM_DECL nodes, and FUNCTION_DECL nodes. @@ -944,18 +1066,17 @@ struct tree_type alternative would be passed. */ #define DECL_TRANSPARENT_UNION(NODE) ((NODE)->decl.transparent_union) -/* In a FUNCTION_DECL, zero means it is a nested function that needs - a trampoline (closure). If nonzero, it is a normal function. - (A nested function can be static if it doesn't need to reference - stack variables in a surrounding function.) - This is unrelated to whether a function is static in the C sense. */ -#define FUNCTION_NEEDS_STATIC_CHAIN(NODE) ((NODE)->decl.transparent_union) - /* Used in FUNCTION_DECLs to indicate that they should be run automatically at the beginning or end of execution. */ #define DECL_STATIC_CONSTRUCTOR(NODE) ((NODE)->decl.static_ctor_flag) #define DECL_STATIC_DESTRUCTOR(NODE) ((NODE)->decl.static_dtor_flag) +/* Used to indicate that this DECL represents a compiler-generated entity. */ +#define DECL_ARTIFICIAL(NODE) ((NODE)->decl.artificial_flag) + +/* Used to indicate that this DECL has weak linkage. */ +#define DECL_WEAK(NODE) ((NODE)->decl.weak_flag) + /* Additional flags for language-specific uses. */ #define DECL_LANG_FLAG_0(NODE) ((NODE)->decl.lang_flag_0) #define DECL_LANG_FLAG_1(NODE) ((NODE)->decl.lang_flag_1) @@ -994,7 +1115,9 @@ struct tree_decl unsigned transparent_union : 1; unsigned static_ctor_flag : 1; unsigned static_dtor_flag : 1; - /* room for two more */ + unsigned artificial_flag : 1; + unsigned weak_flag : 1; + /* room for no more */ unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; @@ -1013,6 +1136,7 @@ struct tree_decl union tree_node *abstract_origin; union tree_node *assembler_name; union tree_node *section_name; + union tree_node *machine_attributes; struct rtx_def *rtl; /* acts as link to register transfer language (rtl) info */ /* For a FUNCTION_DECL, if inline, this is the size of frame needed. @@ -1054,56 +1178,11 @@ union tree_node struct tree_exp exp; struct tree_block block; }; - -/* Add prototype support. */ -#ifndef PROTO -#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) -#define PROTO(ARGS) ARGS -#else -#define PROTO(ARGS) () -#endif -#endif - -#ifndef VPROTO -#ifdef __STDC__ -#define PVPROTO(ARGS) ARGS -#define VPROTO(ARGS) ARGS -#define VA_START(va_list,var) va_start(va_list,var) -#else -#define PVPROTO(ARGS) () -#define VPROTO(ARGS) (va_alist) va_dcl -#define VA_START(va_list,var) va_start(va_list) -#endif -#endif - -#ifndef STDIO_PROTO -#ifdef BUFSIZ -#define STDIO_PROTO(ARGS) PROTO(ARGS) -#else -#define STDIO_PROTO(ARGS) () -#endif -#endif + +#include "gansidecl.h" #define NULL_TREE (tree) NULL -/* Define a generic NULL if one hasn't already been defined. */ - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef GENERIC_PTR -#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__) -#define GENERIC_PTR void * -#else -#define GENERIC_PTR char * -#endif -#endif - -#ifndef NULL_PTR -#define NULL_PTR ((GENERIC_PTR)0) -#endif - /* The following functions accept a wide integer argument. Rather than having to cast on every function call, we use a macro instead, that is defined here and in rtl.h. */ @@ -1124,6 +1203,8 @@ extern char *xmalloc (); extern char *xrealloc (); #endif +extern char *xstrdup PROTO((char *)); + extern char *oballoc PROTO((int)); extern char *permalloc PROTO((int)); extern char *savealloc PROTO((int)); @@ -1194,6 +1275,7 @@ extern tree array_type_nelts PROTO((tree)); extern tree value_member PROTO((tree, tree)); extern tree purpose_member PROTO((tree, tree)); extern tree binfo_member PROTO((tree, tree)); +extern int attribute_hash_list PROTO((tree)); extern int attribute_list_equal PROTO((tree, tree)); extern int attribute_list_contained PROTO((tree, tree)); extern int tree_int_cst_equal PROTO((tree, tree)); @@ -1214,6 +1296,25 @@ extern tree make_tree (); are not made. */ extern tree build_type_attribute_variant PROTO((tree, tree)); +extern tree build_decl_attribute_variant PROTO((tree, tree)); + +/* Return 1 if an attribute and its arguments are valid for a decl or type. */ + +extern int valid_machine_attribute PROTO((tree, tree, tree, tree)); + +/* Given a tree node and a string, return non-zero if the tree node is + a valid attribute name for the string. */ + +extern int is_attribute_p PROTO((char *, tree)); + +/* Given an attribute name and a list of attributes, return the list element + of the attribute or NULL_TREE if not found. */ + +extern tree lookup_attribute PROTO((char *, tree)); + +/* Given two attributes lists, return a list of their union. */ + +extern tree merge_attributes PROTO((tree, tree)); /* Given a type node TYPE, and CONSTP and VOLATILEP, return a type for the same kind of data as TYPE describes. @@ -1261,9 +1362,10 @@ extern tree convert PROTO((tree, tree)); extern tree size_in_bytes PROTO((tree)); extern int int_size_in_bytes PROTO((tree)); extern tree size_binop PROTO((enum tree_code, tree, tree)); -extern tree size_int PROTO((unsigned)); +extern tree size_int PROTO((unsigned HOST_WIDE_INT)); extern tree round_up PROTO((tree, int)); extern tree get_pending_sizes PROTO((void)); +extern void put_pending_sizes PROTO((tree)); /* Type for sizes of data-type. */ @@ -1272,7 +1374,7 @@ extern tree sizetype; /* If nonzero, an upper limit on alignment of structure fields, in bits. */ extern int maximum_field_alignment; -/* If non-zero, the alignment of a bitsting or (power-)set value, in bits. */ +/* If non-zero, the alignment of a bitstring or (power-)set value, in bits. */ extern int set_alignment; /* Concatenate two lists (chains of TREE_LIST nodes) X and Y @@ -1336,6 +1438,17 @@ extern int lvalue_or_else PROTO((tree, char *)); extern tree save_expr PROTO((tree)); +/* unsave_expr (EXP) returns an expression equivalent to EXP but it + can be used multiple times and will evaluate EXP, in it's entirety + each time. */ + +extern tree unsave_expr PROTO((tree)); + +/* unsave_expr_now (EXP) resets EXP in place, so that it can be + expanded again. */ + +extern tree unsave_expr_now PROTO((tree)); + /* Return 1 if EXP contains a PLACEHOLDER_EXPR; i.e., if it represents a size or offset that depends on a field within a record. @@ -1351,12 +1464,6 @@ extern int contains_placeholder_p PROTO((tree)); extern tree substitute_in_expr PROTO((tree, tree, tree)); -/* Given a type T, a FIELD_DECL F, and a replacement value R, - return a new type with all size expressions that contain F - updated by replacing the reference to F with R. */ - -extern tree substitute_in_type PROTO((tree, tree, tree)); - /* variable_size (EXP) is like save_expr (EXP) except that it is for the special case of something that is part of a variable size for a data type. It makes special arrangements @@ -1529,9 +1636,9 @@ extern void (*incomplete_decl_finalize_hook) (); /* In tree.c */ extern char *perm_calloc PROTO((int, long)); -extern tree get_set_constructor_bits PROTO((tree, char*, int)); +extern tree get_set_constructor_bits PROTO((tree, char *, int)); extern tree get_set_constructor_bytes PROTO((tree, - HOST_WIDE_INT*, int)); + unsigned char *, int)); /* In stmt.c */ @@ -1539,6 +1646,7 @@ extern void expand_fixups PROTO((struct rtx_def *)); extern tree expand_start_stmt_expr PROTO((void)); extern tree expand_end_stmt_expr PROTO((tree)); extern void expand_expr_stmt PROTO((tree)); +extern int warn_if_unused_value PROTO((tree)); extern void expand_decl_init PROTO((tree)); extern void clear_last_expr PROTO((void)); extern void expand_label PROTO((tree)); @@ -1619,7 +1727,7 @@ extern void init_decl_processing PROTO((void)); extern void lang_init PROTO((void)); extern void lang_finish PROTO((void)); -/* Funtion to identify which front-end produced the output file. */ +/* Function to identify which front-end produced the output file. */ extern char *lang_identify PROTO((void)); /* Function to replace the DECL_LANG_SPECIFIC field of a DECL with a copy. */