OSDN Git Service

(DECL_DEFER_OUTPUT): New macro.
[pf3gnuchains/gcc-fork.git] / gcc / tree.h
index e522dcd..ed03b28 100644 (file)
@@ -1,5 +1,5 @@
 /* Front-end tree definitions for GNU compiler.
-   Copyright (C) 1989, 1993 Free Software Foundation, Inc.
+   Copyright (C) 1989, 1993, 1994 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -19,7 +19,11 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "machmode.h"
 
-/* codes of tree nodes */
+#ifndef RTX_CODE
+struct rtx_def;
+#endif
+
+/* Codes of tree nodes */
 
 #define DEFTREECODE(SYM, STRING, TYPE, NARGS)   SYM,
 
@@ -97,7 +101,10 @@ enum built_in_function
   BUILT_IN_NEW,
   BUILT_IN_VEC_NEW,
   BUILT_IN_DELETE,
-  BUILT_IN_VEC_DELETE
+  BUILT_IN_VEC_DELETE,
+
+  /* Upper bound on non-language-specific builtins. */
+  END_BUILTINS
 };
 \f
 /* The definition of tree nodes fills the next several pages.  */
@@ -220,6 +227,13 @@ struct tree_common
   (TREE_CODE (TYPE) == REAL_TYPE       \
    || (TREE_CODE (TYPE) == COMPLEX_TYPE \
        && TREE_CODE (TREE_TYPE (TYPE)) == REAL_TYPE))
+
+/* Nonzero if TYPE represents an aggregate (multi-component) type. */
+
+#define AGGREGATE_TYPE_P(TYPE) \
+  (TREE_CODE (TYPE) == ARRAY_TYPE || TREE_CODE (TYPE) == RECORD_TYPE \
+   || TREE_CODE (TYPE) == UNION_TYPE || TREE_CODE (TYPE) == QUAL_UNION_TYPE \
+   || TREE_CODE (TYPE) == SET_TYPE)
 \f
 /* Define many boolean fields that all tree nodes have.  */
 
@@ -242,21 +256,21 @@ struct tree_common
    In a CONSTRUCTOR, nonzero means allocate static storage.  */
 #define TREE_STATIC(NODE) ((NODE)->common.static_flag)
 
-/* In a CONVERT_EXPR or NOP_EXPR, this means the node was made
-   implicitly and should not lead to an "unused value" warning.  */
+/* In a CONVERT_EXPR, NOP_EXPR or COMPOUND_EXPR, this means the node was
+   made implicitly and should not lead to an "unused value" warning.  */
 #define TREE_NO_UNUSED_WARNING(NODE) ((NODE)->common.static_flag)
 
 /* Nonzero for a TREE_LIST or TREE_VEC node means that the derivation
    chain is via a `virtual' declaration.  */
 #define TREE_VIA_VIRTUAL(NODE) ((NODE)->common.static_flag)
 
-/* In an INTEGER_CST, this means there was an overflow in folding.
-   This is distinct from TREE_OVERFLOW because ANSI C requires a diagnostic
-   when overflows occur in constant expressions.  */
+/* In an INTEGER_CST, REAL_CST, or COMPLEX_CST, this means there was an
+   overflow in folding.  This is distinct from TREE_OVERFLOW because ANSI C
+   requires a diagnostic when overflows occur in constant expressions.  */
 #define TREE_CONSTANT_OVERFLOW(NODE) ((NODE)->common.static_flag)
 
-/* In an INTEGER_CST, this means there was an overflow in folding,
-   and no warning has been issued for this subexpression.
+/* In an INTEGER_CST, REAL_CST, of COMPLEX_CST, this means there was an
+   overflow in folding, and no warning has been issued for this subexpression.
    TREE_OVERFLOW implies TREE_CONSTANT_OVERFLOW, but not vice versa.  */
 #define TREE_OVERFLOW(NODE) ((NODE)->common.public_flag)
 
@@ -551,7 +565,8 @@ struct tree_block
 #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_ADDRESS(NODE) ((NODE)->type.symtab.address)
+#define TYPE_SYMTAB_POINTER(NODE) ((NODE)->type.symtab.pointer)
 #define TYPE_NAME(NODE) ((NODE)->type.name)
 #define TYPE_NEXT_VARIANT(NODE) ((NODE)->type.next_variant)
 #define TYPE_MAIN_VARIANT(NODE) ((NODE)->type.main_variant)
@@ -561,6 +576,10 @@ struct tree_block
 #define TYPE_OBSTACK(NODE) ((NODE)->type.obstack)
 #define TYPE_LANG_SPECIFIC(NODE) ((NODE)->type.lang_specific)
 
+/* A TREE_LIST of IDENTIFIER nodes of the attributes that apply
+   to this type.  */
+#define TYPE_ATTRIBUTES(NODE) ((NODE)->type.attributes)
+
 /* The alignment necessary for objects of this type.
    The value is an int, measured in bits.  */
 #define TYPE_ALIGN(NODE) ((NODE)->type.align)
@@ -587,20 +606,27 @@ struct tree_block
 #define TYPE_LANG_FLAG_5(NODE) ((NODE)->type.lang_flag_5)
 #define TYPE_LANG_FLAG_6(NODE) ((NODE)->type.lang_flag_6)
 
+/* If set in an ARRAY_TYPE, indicates a string type (for languages
+   that distinguish string from array of char).
+   If set in a SET_TYPE, indicates a bitstring type. */
+#define TYPE_STRING_FLAG(NODE) ((NODE)->type.string_flag)
+
 struct tree_type
 {
   char common[sizeof (struct tree_common)];
   union tree_node *values;
   union tree_node *size;
+  union tree_node *attributes;
   unsigned uid;
 
+  unsigned char precision;
 #ifdef ONLY_INT_FIELDS
   int mode : 8;
 #else
   enum machine_mode mode : 8;
 #endif
-  unsigned char precision;
 
+  unsigned string_flag : 1;
   unsigned no_force_blk_flag : 1;
   unsigned lang_flag_0 : 1;
   unsigned lang_flag_1 : 1;
@@ -609,12 +635,13 @@ struct tree_type
   unsigned lang_flag_4 : 1;
   unsigned lang_flag_5 : 1;
   unsigned lang_flag_6 : 1;
+  /* room for 7 more bits */
 
   unsigned int align;
   union tree_node *pointer_to;
   union tree_node *reference_to;
   int parse_info;
-  int symtab_address;
+  union {int address; char *pointer; } symtab;
   union tree_node *name;
   union tree_node *minval;
   union tree_node *maxval;
@@ -710,13 +737,14 @@ struct tree_type
 /* This is the name of the object as written by the user.
    It is an IDENTIFIER_NODE.  */
 #define DECL_NAME(NODE) ((NODE)->decl.name)
-/* This macro is marked for death.  */
-#define DECL_PRINT_NAME(NODE) ((NODE)->decl.print_name)
 /* This is the name of the object as the assembler will see it
    (but before any translations made by ASM_OUTPUT_LABELREF).
    Often this is the same as DECL_NAME.
    It is an IDENTIFIER_NODE.  */
 #define DECL_ASSEMBLER_NAME(NODE) ((NODE)->decl.assembler_name)
+/* Records the section name in a section attribute.  Used to pass
+   the name from decl_attributes to make_function_rtl and make_decl_rtl.  */
+#define DECL_SECTION_NAME(NODE) ((NODE)->decl.section_name)
 /*  For FIELD_DECLs, this is the
     RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE node that the field is
     a member of.  For VAR_DECL, PARM_DECL, FUNCTION_DECL, LABEL_DECL,
@@ -758,7 +786,7 @@ struct tree_type
    Need not be constant.  */
 #define DECL_SIZE(NODE) ((NODE)->decl.size)
 /* Holds the alignment required for the datum.  */
-#define DECL_ALIGN(NODE) ((NODE)->decl.frame_size)
+#define DECL_ALIGN(NODE) ((NODE)->decl.frame_size.u)
 /* Holds the machine mode corresponding to the declaration of a variable or
    field.  Always equal to TYPE_MODE (TREE_TYPE (decl)) except for a
    FIELD_DECL.  */
@@ -776,13 +804,11 @@ struct tree_type
 #define DECL_SAVED_INSNS(NODE) ((NODE)->decl.saved_insns.r)
 /* For FUNCTION_DECL, if it is inline,
    holds the size of the stack frame, as an integer.  */
-#define DECL_FRAME_SIZE(NODE) ((NODE)->decl.frame_size)
+#define DECL_FRAME_SIZE(NODE) ((NODE)->decl.frame_size.i)
 /* For FUNCTION_DECL, if it is built-in,
    this identifies which built-in operation it is.  */
-#define DECL_FUNCTION_CODE(NODE) \
- ((enum built_in_function) (NODE)->decl.frame_size)
-#define DECL_SET_FUNCTION_CODE(NODE,VAL) \
- ((NODE)->decl.frame_size = (int) (VAL))
+#define DECL_FUNCTION_CODE(NODE) ((NODE)->decl.frame_size.f)
+#define DECL_SET_FUNCTION_CODE(NODE,VAL) ((NODE)->decl.frame_size.f = (VAL))
 /* For a FIELD_DECL, holds the size of the member as an integer.  */
 #define DECL_FIELD_SIZE(NODE) ((NODE)->decl.saved_insns.i)
 
@@ -828,6 +854,11 @@ struct tree_type
    because this decl is unused.  */
 #define DECL_IN_SYSTEM_HEADER(NODE) ((NODE)->decl.in_system_header_flag)
 
+/* Nonzero for a given ..._DECL node means that this node should be
+   put in .common, if possible.  If a DECL_INITIAL is given, and it
+   is not error_mark_node, then the decl cannot be put in .common.  */
+#define DECL_COMMON(NODE) ((NODE)->decl.common_flag)
+
 /* Language-specific decl information.  */
 #define DECL_LANG_SPECIFIC(NODE) ((NODE)->decl.lang_specific)
 
@@ -836,6 +867,13 @@ struct tree_type
    do not allocate storage, and refer to a definition elsewhere.  */
 #define DECL_EXTERNAL(NODE) ((NODE)->decl.external_flag)
 
+/* In a TYPE_DECL
+   nonzero means the detail info about this type is not dumped into stabs.
+   Instead it will generate cross reference ('x') of names. 
+   This uses the same flag as DECL_EXTERNAL. */
+#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.  */
@@ -869,11 +907,18 @@ struct tree_type
 #define DECL_TOO_LATE(NODE) ((NODE)->decl.bit_field_flag)
 /* In a FUNCTION_DECL, nonzero means a built in function.  */
 #define DECL_BUILT_IN(NODE) ((NODE)->decl.bit_field_flag)
+/* In a VAR_DECL that's static,
+   nonzero if the space is in the text section.  */
+#define DECL_IN_TEXT_SECTION(NODE) ((NODE)->decl.bit_field_flag)
 
 /* Used in VAR_DECLs to indicate that the variable is a vtable.
    It is also used in FIELD_DECLs for vtable pointers.  */
 #define DECL_VIRTUAL_P(NODE) ((NODE)->decl.virtual_flag)
 
+/* Used to indicate that the linkage status of this DECL is not yet known,
+   so it should not be output now.  */
+#define DECL_DEFER_OUTPUT(NODE) ((NODE)->decl.defer_output)
+
 /* 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)
@@ -907,7 +952,9 @@ struct tree_decl
   unsigned abstract_flag : 1;
 
   unsigned in_system_header_flag : 1;
-  /* room for seven more */
+  unsigned common_flag : 1;
+  unsigned defer_output : 1;
+  /* room for five more */
 
   unsigned lang_flag_0 : 1;
   unsigned lang_flag_1 : 1;
@@ -924,15 +971,18 @@ struct tree_decl
   union tree_node *result;
   union tree_node *initial;
   union tree_node *abstract_origin;
-  /* The PRINT_NAME field is marked for death.  */
-  char *print_name;
   union tree_node *assembler_name;
+  union tree_node *section_name;
   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.
      If built-in, this is the code for which built-in function.
      For other kinds of decls, this is DECL_ALIGN.  */
-  int frame_size;
+  union {
+    int i;
+    unsigned int u;
+    enum built_in_function f;
+  } frame_size;
   /* For FUNCTION_DECLs: points to insn that constitutes its definition
      on the permanent obstack.  For any other kind of decl, this is the
      alignment.  */
@@ -974,6 +1024,25 @@ union tree_node
 #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
 
 #define NULL_TREE (tree) NULL
 
@@ -1050,19 +1119,9 @@ extern tree get_identifier               PROTO((char *));
 #define build_int_2(LO,HI)  \
   build_int_2_wide ((HOST_WIDE_INT) (LO), (HOST_WIDE_INT) (HI))
 
-#if 0
-/* We cannot define prototypes for the variable argument functions,
-   since they have not been ANSI-fied, and an ANSI compiler would
-   complain when compiling the definition of these functions.  */
-
-extern tree build                      PROTO((enum tree_code, tree, ...));
-extern tree build_nt                   PROTO((enum tree_code, ...));
-extern tree build_parse_node           PROTO((enum tree_code, ...));
-#else
-extern tree build ();
-extern tree build_nt ();
-extern tree build_parse_node ();
-#endif
+extern tree build                      PVPROTO((enum tree_code, tree, ...));
+extern tree build_nt                   PVPROTO((enum tree_code, ...));
+extern tree build_parse_node           PVPROTO((enum tree_code, ...));
 
 extern tree build_int_2_wide           PROTO((HOST_WIDE_INT, HOST_WIDE_INT));
 extern tree build_real                 PROTO((tree, REAL_VALUE_TYPE));
@@ -1095,8 +1154,11 @@ 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_list_equal                PROTO((tree, tree));
+extern int attribute_list_contained    PROTO((tree, tree));
 extern int tree_int_cst_equal          PROTO((tree, tree));
 extern int tree_int_cst_lt             PROTO((tree, tree));
+extern int tree_int_cst_sgn            PROTO((tree));
 extern int index_type_equal            PROTO((tree, tree));
 
 /* From expmed.c.  Since rtl.h is included after tree.h, we can't
@@ -1105,6 +1167,14 @@ extern int index_type_equal              PROTO((tree, tree));
 
 extern tree make_tree ();
 \f
+/* Return a type like TTYPE except that its TYPE_ATTRIBUTES
+   is ATTRIBUTE.
+
+   Such modified types already made are recorded so that duplicates
+   are not made. */
+
+extern tree build_type_attribute_variant PROTO((tree, tree));
+
 /* Given a type node TYPE, and CONSTP and VOLATILEP, return a type
    for the same kind of data as TYPE describes.
    Variants point to the "main variant" (which has neither CONST nor VOLATILE)
@@ -1220,6 +1290,27 @@ extern int lvalue_or_else                PROTO((tree, char *));
 
 extern tree save_expr                  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.
+
+   Note that we only allow such expressions within simple arithmetic
+   or a COND_EXPR.  */
+
+extern int contains_placeholder_p      PROTO((tree));
+
+/* Given a tree EXP, a FIELD_DECL F, and a replacement value R,
+   return a tree with all occurrences of references to F in a
+   PLACEHOLDER_EXPR replaced by R.   Note that we assume here that EXP
+   contains only arithmetic expressions.  */
+
+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
@@ -1384,6 +1475,7 @@ extern char *perm_calloc                  PROTO((int, long));
 \f
 /* In stmt.c */
 
+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));
@@ -1402,7 +1494,8 @@ extern void expand_loop_continue_here             PROTO((void));
 extern void expand_end_loop                    PROTO((void));
 extern int expand_continue_loop                        PROTO((struct nesting *));
 extern int expand_exit_loop                    PROTO((struct nesting *));
-extern int expand_exit_loop_if_false           PROTO((struct nesting *, tree));
+extern int expand_exit_loop_if_false           PROTO((struct nesting *,
+                                                      tree));
 extern int expand_exit_something               PROTO((void));
 
 extern void expand_null_return                 PROTO((void));
@@ -1410,10 +1503,15 @@ extern void expand_return                       PROTO((tree));
 extern void expand_start_bindings              PROTO((int));
 extern void expand_end_bindings                        PROTO((tree, int, int));
 extern tree last_cleanup_this_contour          PROTO((void));
-extern void expand_start_case                  PROTO((int, tree, tree, char *));
+extern void expand_start_case                  PROTO((int, tree, tree,
+                                                      char *));
 extern void expand_end_case                    PROTO((tree));
-extern int pushcase                            PROTO((tree, tree (*) (tree, tree), tree, tree *));
-extern int pushcase_range                      PROTO((tree, tree, tree (*) (tree, tree), tree, tree *));
+extern int pushcase                            PROTO((tree,
+                                                      tree (*) (tree, tree),
+                                                      tree, tree *));
+extern int pushcase_range                      PROTO((tree, tree,
+                                                      tree (*) (tree, tree),
+                                                      tree, tree *));
 
 /* In fold-const.c */
 
@@ -1464,6 +1562,9 @@ extern void lang_finish                           PROTO((void));
 /* Funtion 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.  */
+extern void copy_lang_decl                     PROTO((tree));
+
 /* Function called with no arguments to parse and compile the input.  */
 extern int yyparse                             PROTO((void));
 /* Function called with option as argument
@@ -1514,6 +1615,8 @@ extern void rest_of_type_compilation PROTO((tree, int));
 /* Save the current set of obstacks, but don't change them.  */
 extern void push_obstacks_nochange PROTO((void));
 
+extern void permanent_allocation PROTO((int));
+
 extern void push_momentary PROTO((void));
 
 extern void clear_momentary PROTO((void));