/* Front-end tree definitions for GNU compiler.
- Copyright (C) 1989 Free Software Foundation, Inc.
+ Copyright (C) 1989, 1993, 1994 Free Software Foundation, Inc.
This file is part of GNU CC.
#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,
BUILT_IN_STRCMP,
BUILT_IN_STRLEN,
BUILT_IN_FSQRT,
+ BUILT_IN_SIN,
+ BUILT_IN_COS,
BUILT_IN_GETEXP,
BUILT_IN_GETMAN,
BUILT_IN_SAVEREGS,
BUILT_IN_FRAME_ADDRESS,
BUILT_IN_RETURN_ADDRESS,
BUILT_IN_CALLER_RETURN_ADDRESS,
+ BUILT_IN_APPLY_ARGS,
+ BUILT_IN_APPLY,
+ BUILT_IN_RETURN,
/* C++ extensions */
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. */
typedef union tree_node *tree;
-#define NULL_TREE (tree) NULL
-
-/* Define a generic NULL if one hasn't already been defined. */
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-#ifndef NULL_PTR
-#define NULL_PTR (char *) NULL
-#endif
-
/* Every kind of tree node starts with this structure,
so all nodes have these fields.
&& (TREE_TYPE (EXP) \
== TREE_TYPE (TREE_OPERAND (EXP, 0)))) \
(EXP) = TREE_OPERAND (EXP, 0);
+
+/* Nonzero if TYPE represents an integral type. Note that we do not
+ include COMPLEX types here. */
+
+#define INTEGRAL_TYPE_P(TYPE) \
+ (TREE_CODE (TYPE) == INTEGER_TYPE || TREE_CODE (TYPE) == ENUMERAL_TYPE \
+ || TREE_CODE (TYPE) == BOOLEAN_TYPE || TREE_CODE (TYPE) == CHAR_TYPE)
+
+/* Nonzero if TYPE represents a floating-point type, including complex
+ floating-point types. */
+
+#define FLOAT_TYPE_P(TYPE) \
+ (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. */
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)
-/* In a NON_LVALUE_EXPR, this means there was overflow in folding.
- The folded constant is inside the NON_LVALUE_EXPR. */
-#define TREE_CONSTANT_OVERFLOW(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, 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, 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)
+
/* In a VAR_DECL or FUNCTION_DECL,
nonzero means name is to be accessible from outside this module.
- In an identifier node, nonzero means a external declaration
+ In an identifier node, nonzero means an external declaration
accessible from outside this module was previously seen
for this name in an inner scope. */
#define TREE_PUBLIC(NODE) ((NODE)->common.public_flag)
fields from the base class as public. */
#define TREE_VIA_PUBLIC(NODE) ((NODE)->common.public_flag)
+/* Ditto, for `private' declarations. */
+#define TREE_VIA_PRIVATE(NODE) ((NODE)->common.private_flag)
+
+/* Nonzero for TREE_LIST node means that the path to the
+ base class is via a `protected' declaration, which preserves
+ protected fields from the base class as protected.
+ OVERLOADED. */
+#define TREE_VIA_PROTECTED(NODE) ((NODE)->common.protected_flag)
+
/* In any expression, nonzero means it has side effects or reevaluation
of the whole expression could produce a different value.
This is set if any subexpression is a function call, a side effect
Nonzero in a FUNCTION_DECL means that the function has been compiled.
This is interesting in an inline function, since it might not need
to be compiled separately.
- Nonzero in a RECORD_TYPE, UNION_TYPE or ENUMERAL_TYPE
+ Nonzero in a RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE or ENUMERAL_TYPE
if the sdb debugging info for the type has been written.
In a BLOCK node, nonzero if reorder_blocks has already seen this block. */
#define TREE_ASM_WRITTEN(NODE) ((NODE)->common.asm_written_flag)
#define BLOCK_CHAIN(NODE) TREE_CHAIN (NODE)
#define BLOCK_ABSTRACT_ORIGIN(NODE) ((NODE)->block.abstract_origin)
#define BLOCK_ABSTRACT(NODE) ((NODE)->block.abstract_flag)
+#define BLOCK_END_NOTE(NODE) ((NODE)->block.end_note)
/* Nonzero means that this block is prepared to handle exceptions
listed in the BLOCK_VARS slot. */
union tree_node *subblocks;
union tree_node *supercontext;
union tree_node *abstract_origin;
+ struct rtx_def *end_note;
};
\f
/* Define fields and accessors for nodes representing data types. */
#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)
#define TYPE_BINFO(NODE) ((NODE)->type.binfo)
#define TYPE_NONCOPIED_PARTS(NODE) ((NODE)->type.noncopied_parts)
#define TYPE_CONTEXT(NODE) ((NODE)->type.context)
+#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)
#define TYPE_STUB_DECL(NODE) (TREE_CHAIN (NODE))
-/* In a RECORD_TYPE or UNION_TYPE, it means the type has BLKmode
- only because it lacks the alignment requirement for its size. */
+/* In a RECORD_TYPE, UNION_TYPE or QUAL_UNION_TYPE, it means the type
+ has BLKmode only because it lacks the alignment requirement for
+ its size. */
#define TYPE_NO_FORCE_BLK(NODE) ((NODE)->type.no_force_blk_flag)
/* Nonzero in a type considered volatile as a whole. */
#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 align;
- unsigned char precision;
+ unsigned string_flag : 1;
unsigned no_force_blk_flag : 1;
unsigned lang_flag_0 : 1;
unsigned lang_flag_1 : 1;
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;
union tree_node *binfo;
union tree_node *noncopied_parts;
union tree_node *context;
+ struct obstack *obstack;
/* Points to a structure whose details depend on the language in use. */
struct lang_type *lang_specific;
};
#define BINFO_BASETYPES(NODE) TREE_VEC_ELT ((NODE), 4)
#define TYPE_BINFO_BASETYPES(NODE) TREE_VEC_ELT (TYPE_BINFO (NODE), 4)
+/* For a BINFO record describing an inheritance, this yields a pointer
+ to the artificial FIELD_DECL node which contains the "virtual base
+ class pointer" for the given inheritance. */
+
+#define BINFO_VPTR_FIELD(NODE) TREE_VEC_ELT ((NODE), 5)
+
/* Accessor macro to get to the Nth basetype of this basetype. */
#define BINFO_BASETYPE(NODE,N) TREE_VEC_ELT (BINFO_BASETYPES (NODE), (N))
#define TYPE_BINFO_BASETYPE(NODE,N) BINFO_TYPE (TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (NODE)), (N)))
/* 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)
-/* The containing binding context; either a BINDING
- or a RECORD_TYPE or UNION_TYPE. */
+/* 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,
+ and CONST_DECL nodes, this points to the FUNCTION_DECL for the
+ 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 FIELD_DECL, this is the field position, counting in bits,
/* For a PARM_DECL, records the data type used to pass the argument,
which may be different from the type seen in the program. */
#define DECL_ARG_TYPE(NODE) ((NODE)->decl.initial) /* In PARM_DECL. */
+/* For a FIELD_DECL in a QUAL_UNION_TYPE, records the expression, which
+ if nonzero, indicates that the field occupies the type. */
+#define DECL_QUALIFIER(NODE) ((NODE)->decl.initial)
/* These two fields describe where in the source code the declaration was. */
#define DECL_SOURCE_FILE(NODE) ((NODE)->decl.filename)
#define DECL_SOURCE_LINE(NODE) ((NODE)->decl.linenum)
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)
-/* Holds the machine mode of a variable or field. */
+#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. */
#define DECL_MODE(NODE) ((NODE)->decl.mode)
-/* Holds the RTL expression for the value of a variable or function. */
+/* Holds the RTL expression for the value of a variable or function. If
+ PROMOTED_MODE is defined, the mode of this expression may not be same
+ as DECL_MODE. In that case, DECL_MODE contains the mode corresponding
+ to the variable's data type, while the mode
+ of DECL_RTL is the mode actually used to contain the data. */
#define DECL_RTL(NODE) ((NODE)->decl.rtl)
/* For PARM_DECL, holds an RTL for the stack slot or register
where the data was actually passed. */
#define DECL_INCOMING_RTL(NODE) ((NODE)->decl.saved_insns.r)
/* For FUNCTION_DECL, if it is inline, holds the saved insn chain. */
#define DECL_SAVED_INSNS(NODE) ((NODE)->decl.saved_insns.r)
-/* For FUNCTION_DECL for built-in function. */
-#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))
/* 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) ((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)
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)
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. */
#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)
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;
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. */
- int frame_size;
+ If built-in, this is the code for which built-in function.
+ For other kinds of decls, this is DECL_ALIGN. */
+ 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. */
struct tree_block block;
};
-/* Format for global names of constructor and destructor functions. */
-#ifndef NO_DOLLAR_IN_LABEL
-#define CONSTRUCTOR_NAME_FORMAT "_GLOBAL_$I$%s"
+/* 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
+
+#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 CONSTRUCTOR_NAME_FORMAT "_GLOBAL_.I.%s"
+#define GENERIC_PTR char *
+#endif
+#endif
+
+#ifndef NULL_PTR
+#define NULL_PTR ((GENERIC_PTR)0)
#endif
\f
/* The following functions accept a wide integer argument. Rather than
#define floor_log2(N) floor_log2_wide ((HOST_WIDE_INT) (N))
#endif
-extern char *oballoc ();
-extern char *permalloc ();
-extern char *savealloc ();
+#if 0
+/* At present, don't prototype xrealloc, since all of the callers don't
+ cast their pointers to char *, and all of the xrealloc's don't use
+ void * yet. */
+extern char *xmalloc PROTO((size_t));
+extern char *xrealloc PROTO((void *, size_t));
+#else
extern char *xmalloc ();
extern char *xrealloc ();
-extern void free ();
+#endif
+
+extern char *oballoc PROTO((int));
+extern char *permalloc PROTO((int));
+extern char *savealloc PROTO((int));
+extern void free PROTO((void *));
/* Lowest level primitive for allocating a node.
The TREE_CODE is the only argument. Contents are initialized
to zero except for a few of the common fields. */
-extern tree make_node ();
+extern tree make_node PROTO((enum tree_code));
/* Make a copy of a node, with all the same contents except
for TREE_PERMANENT. (The copy is permanent
iff nodes being made now are permanent.) */
-extern tree copy_node ();
+extern tree copy_node PROTO((tree));
/* Make a copy of a chain of TREE_LIST nodes. */
-extern tree copy_list ();
+extern tree copy_list PROTO((tree));
/* Make a TREE_VEC. */
-extern tree make_tree_vec ();
+extern tree make_tree_vec PROTO((int));
/* Return the (unique) IDENTIFIER_NODE node for a given name.
The name is supplied as a char *. */
-extern tree get_identifier ();
+extern tree get_identifier PROTO((char *));
/* Construct various types of nodes. */
#define build_int_2(LO,HI) \
build_int_2_wide ((HOST_WIDE_INT) (LO), (HOST_WIDE_INT) (HI))
-extern tree build_int_2_wide ();
-extern tree build_real ();
-extern tree build_real_from_string ();
-extern tree build_real_from_int_cst ();
-extern tree build_complex ();
-extern tree build_string ();
-extern tree build (), build1 ();
-extern tree build_nt (), build_parse_node ();
-extern tree build_tree_list (), build_decl_list ();
-extern tree build_op_identifier ();
-extern tree build_decl ();
-extern tree build_block ();
+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));
+extern tree build_real_from_int_cst PROTO((tree, tree));
+extern tree build_complex PROTO((tree, tree));
+extern tree build_string PROTO((int, char *));
+extern tree build1 PROTO((enum tree_code, tree, tree));
+extern tree build_tree_list PROTO((tree, tree));
+extern tree build_decl_list PROTO((tree, tree));
+extern tree build_decl PROTO((enum tree_code, tree, tree));
+extern tree build_block PROTO((tree, tree, tree, tree, tree));
/* Construct various nodes representing data types. */
-extern tree make_signed_type ();
-extern tree make_unsigned_type ();
-extern tree signed_or_unsigned_type ();
-extern void fixup_unsigned_type ();
-extern tree build_pointer_type ();
-extern tree build_reference_type ();
-extern tree build_index_type (), build_index_2_type ();
-extern tree build_array_type ();
-extern tree build_function_type ();
-extern tree build_method_type ();
-extern tree build_offset_type ();
-extern tree build_complex_type ();
-extern tree array_type_nelts ();
-
-/* Construct expressions, performing type checking. */
-
-extern tree build_binary_op ();
-extern tree build_indirect_ref ();
-extern tree build_unary_op ();
+extern tree make_signed_type PROTO((int));
+extern tree make_unsigned_type PROTO((int));
+extern tree signed_or_unsigned_type PROTO((int, tree));
+extern void fixup_unsigned_type PROTO((tree));
+extern tree build_pointer_type PROTO((tree));
+extern tree build_reference_type PROTO((tree));
+extern tree build_index_type PROTO((tree));
+extern tree build_index_2_type PROTO((tree, tree));
+extern tree build_array_type PROTO((tree, tree));
+extern tree build_function_type PROTO((tree, tree));
+extern tree build_method_type PROTO((tree, tree));
+extern tree build_offset_type PROTO((tree, tree));
+extern tree build_complex_type PROTO((tree));
+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
+ put the prototype here. Rtl.h does declare the prototype if
+ tree.h had been included. */
+
+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)
so that duplicate variants are never made.
Only main variants should ever appear as types of expressions. */
-extern tree build_type_variant ();
+extern tree build_type_variant PROTO((tree, int, int));
/* Make a copy of a type node. */
-extern tree build_type_copy ();
+extern tree build_type_copy PROTO((tree));
/* Given a ..._TYPE node, calculate the TYPE_SIZE, TYPE_SIZE_UNIT,
TYPE_ALIGN and TYPE_MODE fields.
If called more than once on one node, does nothing except
for the first time. */
-extern void layout_type ();
+extern void layout_type PROTO((tree));
/* Given a hashcode and a ..._TYPE node (for which the hashcode was made),
return a canonicalized ..._TYPE node, so that duplicates are not made.
How the hash code is computed is up to the caller, as long as any two
callers that could hash identical-looking type nodes agree. */
-extern tree type_hash_canon ();
+extern tree type_hash_canon PROTO((int, tree));
/* Given a VAR_DECL, PARM_DECL, RESULT_DECL or FIELD_DECL node,
calculates the DECL_SIZE, DECL_SIZE_UNIT, DECL_ALIGN and DECL_MODE
be starting at (in bits). Zero means it can be assumed aligned
on any boundary that may be needed. */
-extern void layout_decl ();
-
-/* Fold constants as much as possible in an expression.
- Returns the simplified expression.
- Acts only on the top level of the expression;
- if the argument itself cannot be simplified, its
- subexpressions are not changed. */
-
-extern tree fold ();
+extern void layout_decl PROTO((tree, unsigned));
/* Return an expr equal to X but certainly not valid as an lvalue. */
-extern tree non_lvalue ();
+extern tree non_lvalue PROTO((tree));
+extern tree pedantic_non_lvalue PROTO((tree));
-extern tree convert ();
-extern tree size_in_bytes ();
-extern int int_size_in_bytes ();
-extern tree size_binop ();
-extern tree size_int ();
-extern tree round_up ();
-extern tree get_pending_sizes ();
-extern tree get_permanent_types (), get_temporary_types ();
+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 round_up PROTO((tree, int));
+extern tree get_pending_sizes PROTO((void));
/* Type for sizes of data-type. */
by making the last node in X point to Y.
Returns X, except if X is 0 returns Y. */
-extern tree chainon ();
+extern tree chainon PROTO((tree, tree));
/* Make a new TREE_LIST node from specified PURPOSE, VALUE and CHAIN. */
-extern tree tree_cons (), perm_tree_cons (), temp_tree_cons ();
-extern tree saveable_tree_cons (), decl_tree_cons ();
+extern tree tree_cons PROTO((tree, tree, tree));
+extern tree perm_tree_cons PROTO((tree, tree, tree));
+extern tree temp_tree_cons PROTO((tree, tree, tree));
+extern tree saveable_tree_cons PROTO((tree, tree, tree));
+extern tree decl_tree_cons PROTO((tree, tree, tree));
/* Return the last tree node in a chain. */
-extern tree tree_last ();
+extern tree tree_last PROTO((tree));
/* Reverse the order of elements in a chain, and return the new head. */
-extern tree nreverse ();
-
-/* Make a copy of a chain of tree nodes. */
-
-extern tree copy_chain ();
+extern tree nreverse PROTO((tree));
/* Returns the length of a chain of nodes
(number of chain pointers to follow before reaching a null pointer). */
-extern int list_length ();
+extern int list_length PROTO((tree));
/* integer_zerop (tree x) is nonzero if X is an integer constant of value 0 */
-extern int integer_zerop ();
+extern int integer_zerop PROTO((tree));
/* integer_onep (tree x) is nonzero if X is an integer constant of value 1 */
-extern int integer_onep ();
+extern int integer_onep PROTO((tree));
/* integer_all_onesp (tree x) is nonzero if X is an integer constant
all of whose significant bits are 1. */
-extern int integer_all_onesp ();
+extern int integer_all_onesp PROTO((tree));
/* integer_pow2p (tree x) is nonzero is X is an integer constant with
exactly one bit 1. */
-extern int integer_pow2p ();
-
-/* type_unsigned_p (tree x) is nonzero if the type X is an unsigned type
- (all of its possible values are >= 0).
- If X is a pointer type, the value is 1.
- If X is a real type, the value is 0. */
-
-extern int type_unsigned_p ();
+extern int integer_pow2p PROTO((tree));
/* staticp (tree x) is nonzero if X is a reference to data allocated
at a fixed address in memory. */
-extern int staticp ();
+extern int staticp PROTO((tree));
/* Gets an error if argument X is not an lvalue.
Also returns 1 if X is an lvalue, 0 if not. */
-extern int lvalue_or_else ();
+extern int lvalue_or_else PROTO((tree, char *));
/* save_expr (EXP) returns an expression equivalent to EXP
but it can be used multiple times within context CTX
and only evaluate EXP once. */
-extern tree save_expr ();
+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
to compute the value at the right time when the data type
belongs to a function parameter. */
-extern tree variable_size ();
+extern tree variable_size PROTO((tree));
/* stabilize_reference (EXP) returns an reference equivalent to EXP
but it can be used multiple times
and only evaluate the subexpressions once. */
-extern tree stabilize_reference ();
+extern tree stabilize_reference PROTO((tree));
/* Return EXP, stripped of any conversions to wider types
in such a way that the result of converting to type FOR_TYPE
is the same as if EXP were converted to FOR_TYPE.
If FOR_TYPE is 0, it signifies EXP's type. */
-extern tree get_unwidened ();
+extern tree get_unwidened PROTO((tree, tree));
/* Return OP or a simpler expression for a narrower value
which can be sign-extended or zero-extended to give back OP.
Store in *UNSIGNEDP_PTR either 1 if the value should be zero-extended
or 0 if the value should be sign-extended. */
-extern tree get_narrower ();
+extern tree get_narrower PROTO((tree, int *));
/* Given MODE and UNSIGNEDP, return a suitable type-tree
with that mode.
The definition of this resides in language-specific code
as the repertoire of available types may vary. */
-extern tree type_for_mode ();
+extern tree type_for_mode PROTO((enum machine_mode, int));
/* Given PRECISION and UNSIGNEDP, return a suitable type-tree
for an integer type with at least that precision.
The definition of this resides in language-specific code
as the repertoire of available types may vary. */
-extern tree type_for_size ();
+extern tree type_for_size PROTO((unsigned, int));
/* Given an integer type T, return a type like T but unsigned.
If T is unsigned, the value is T.
The definition of this resides in language-specific code
as the repertoire of available types may vary. */
-extern tree unsigned_type ();
+extern tree unsigned_type PROTO((tree));
/* Given an integer type T, return a type like T but signed.
If T is signed, the value is T.
The definition of this resides in language-specific code
as the repertoire of available types may vary. */
-extern tree signed_type ();
+extern tree signed_type PROTO((tree));
/* This function must be defined in the language-specific files.
expand_expr calls it to build the cleanup-expression for a TARGET_EXPR.
This is defined in a language-specific file. */
-extern tree maybe_build_cleanup ();
-
-/* Return the floating type node for a given floating machine mode. */
-
-extern tree get_floating_type ();
+extern tree maybe_build_cleanup PROTO((tree));
/* Given an expression EXP that may be a COMPONENT_REF or an ARRAY_REF,
look for nested component-refs or array-refs at constant positions
and find the ultimate containing object, which is returned. */
-extern tree get_inner_reference ();
+extern tree get_inner_reference PROTO((tree, int *, int *, tree *, enum machine_mode *, int *, int *));
/* Return the FUNCTION_DECL which provides this _DECL with its context,
or zero if none. */
-extern tree decl_function_context ();
+extern tree decl_function_context PROTO((tree));
-/* Return the RECORD_TYPE or UNION_TYPE which provides this _DECL
- with its context, or zero if none. */
-extern tree decl_type_context ();
+/* Return the RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE which provides
+ this _DECL with its context, or zero if none. */
+extern tree decl_type_context PROTO((tree));
/* Given the FUNCTION_DECL for the current function,
return zero if it is ok for this function to be inline.
Otherwise return a warning message with a single %s
for the function's name. */
-extern char *function_cannot_inline_p ();
+extern char *function_cannot_inline_p PROTO((tree));
+
+/* Return 1 if EXPR is the real constant zero. */
+extern int real_zerop PROTO((tree));
\f
/* Declare commonly used variables for tree structure. */
/* Pointer to function to compute the name to use to print a declaration. */
extern char *(*decl_printable_name) ();
-\f
-/* In expmed.c */
-extern tree make_tree ();
+/* Pointer to function to finish handling an incomplete decl at the
+ end of compilation. */
+
+extern void (*incomplete_decl_finalize_hook) ();
+\f
+/* In tree.c */
+extern char *perm_calloc PROTO((int, long));
+\f
/* In stmt.c */
-extern tree expand_start_stmt_expr ();
-extern tree expand_end_stmt_expr ();
-extern void expand_expr_stmt (), clear_last_expr ();
-extern void expand_label (), expand_goto (), expand_asm ();
-extern void expand_start_cond (), expand_end_cond ();
-extern void expand_start_else (), expand_start_elseif ();
-extern struct nesting *expand_start_loop ();
-extern struct nesting *expand_start_loop_continue_elsewhere ();
-extern void expand_loop_continue_here ();
-extern void expand_end_loop ();
-extern int expand_continue_loop ();
-extern int expand_exit_loop (), expand_exit_loop_if_false ();
-extern int expand_exit_something ();
-
-extern void expand_start_delayed_expr ();
-extern tree expand_end_delayed_expr ();
-extern void expand_emit_delayed_expr ();
-
-extern void expand_null_return (), expand_return ();
-extern void expand_start_bindings (), expand_end_bindings ();
-extern tree last_cleanup_this_contour ();
-extern void expand_start_case (), expand_end_case ();
-extern int pushcase (), pushcase_range ();
-extern void expand_start_function (), expand_end_function ();
+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 void expand_decl_init PROTO((tree));
+extern void clear_last_expr PROTO((void));
+extern void expand_label PROTO((tree));
+extern void expand_goto PROTO((tree));
+extern void expand_asm PROTO((tree));
+extern void expand_start_cond PROTO((tree, int));
+extern void expand_end_cond PROTO((void));
+extern void expand_start_else PROTO((void));
+extern void expand_start_elseif PROTO((tree));
+extern struct nesting *expand_start_loop PROTO((int));
+extern struct nesting *expand_start_loop_continue_elsewhere PROTO((int));
+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_something PROTO((void));
+
+extern void expand_null_return PROTO((void));
+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_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 *));
/* In fold-const.c */
-extern tree invert_truthvalue ();
+/* Fold constants as much as possible in an expression.
+ Returns the simplified expression.
+ Acts only on the top level of the expression;
+ if the argument itself cannot be simplified, its
+ subexpressions are not changed. */
+
+extern tree fold PROTO((tree));
+
+extern int force_fit_type PROTO((tree, int));
+extern int add_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT *, HOST_WIDE_INT *));
+extern int neg_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT *, HOST_WIDE_INT *));
+extern int mul_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT *, HOST_WIDE_INT *));
+extern void lshift_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT, int, HOST_WIDE_INT *,
+ HOST_WIDE_INT *, int));
+extern void rshift_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT, int,
+ HOST_WIDE_INT *, HOST_WIDE_INT *, int));
+extern void lrotate_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT, int, HOST_WIDE_INT *,
+ HOST_WIDE_INT *));
+extern void rrotate_double PROTO((HOST_WIDE_INT, HOST_WIDE_INT,
+ HOST_WIDE_INT, int, HOST_WIDE_INT *,
+ HOST_WIDE_INT *));
+extern int operand_equal_p PROTO((tree, tree, int));
+extern tree invert_truthvalue PROTO((tree));
\f
/* The language front-end must define these functions. */
/* Function of no arguments for initializing lexical scanning. */
-extern void init_lex ();
+extern void init_lex PROTO((void));
/* Function of no arguments for initializing the symbol table. */
-extern void init_decl_processing ();
+extern void init_decl_processing PROTO((void));
/* Functions called with no arguments at the beginning and end or processing
the input source file. */
-extern void lang_init ();
-extern void lang_finish ();
+extern void lang_init PROTO((void));
+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 ();
+extern int yyparse PROTO((void));
/* Function called with option as argument
to decode options starting with -f or -W or +.
It should return nonzero if it handles the option. */
-extern int lang_decode_option ();
+extern int lang_decode_option PROTO((char *));
/* Functions for processing symbol declarations. */
/* Function to enter a new lexical scope.
Takes one argument: always zero when called from outside the front end. */
-extern void pushlevel ();
+extern void pushlevel PROTO((int));
/* Function to exit a lexical scope. It returns a BINDING for that scope.
Takes three arguments:
KEEP -- nonzero if there were declarations in this scope.
REVERSE -- reverse the order of decls before returning them.
FUNCTIONBODY -- nonzero if this level is the body of a function. */
-extern tree poplevel ();
+extern tree poplevel PROTO((int, int, int));
+/* Set the BLOCK node for the current scope level. */
+extern void set_block PROTO((tree));
/* Function to add a decl to the current scope level.
Takes one argument, a decl to add.
Returns that decl, or, if the same symbol is already declared, may
return a different decl for that name. */
-extern tree pushdecl ();
+extern tree pushdecl PROTO((tree));
/* Function to return the chain of decls so far in the current scope level. */
-extern tree getdecls ();
+extern tree getdecls PROTO((void));
/* Function to return the chain of structure tags in the current scope level. */
-extern tree gettags ();
+extern tree gettags PROTO((void));
+
+extern tree build_range_type PROTO((tree, tree, tree));
+
+/* Call when starting to parse a declaration:
+ make expressions in the declaration last the length of the function.
+ Returns an argument that should be passed to resume_momentary later. */
+extern int suspend_momentary PROTO((void));
+
+extern int allocation_temporary_p PROTO((void));
+
+/* Call when finished parsing a declaration:
+ restore the treatment of node-allocation that was
+ in effect before the suspension.
+ YES should be the value previously returned by suspend_momentary. */
+extern void resume_momentary PROTO((int));
+
+/* Called after finishing a record, union or enumeral type. */
+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));
+
+extern void pop_momentary PROTO((void));
+
+extern void end_temporary_allocation PROTO((void));
+
+/* Pop the obstack selection stack. */
+extern void pop_obstacks PROTO((void));