+2003-04-06 Zack Weinberg <zack@codesourcery.com>
+
+ * tree.c (tree_size): For all 'c' and 'x' nodes, look directly
+ at the sizes of the relevant structures, rather than relying
+ on TREE_CODE_LENGTH. Call lang_hooks.tree_size to get the
+ sizes of any such we don't know about. Use
+ lang_hooks.identifier_size for IDENTIFIER_NODE.
+
+ (initializer_zerop): Use CONSTRUCTOR_ELTS.
+ * tree.def: Update commentary. Make fourth element of
+ the definition for all 'c' and 'x' nodes zero.
+
+ * langhooks.h: New hook, tree_size / LANG_HOOKS_TREE_SIZE.
+ * langhooks-def.h: Update to match.
+ * langhooks.c: New default, lhd_tree_size.
+
+ * c-common.def (SRCLOC): Kill.
+ * c-pretty-print.c (pp_c_postfix_expression [case SRCLOC]):
+ Remove entirely - was already #if-ed out.
+
+
2003-04-06 Zack Weinberg <zack@codesourcery.com>
* mklibgcc.in: Use a here document to avoid running afoul of
2003-04-06 Aldy Hernandez <aldyh@redhat.com>
- * doc/invoke.texi (RS/6000 and PowerPC Options): Document -mspe
- option.
+ * doc/invoke.texi (RS/6000 and PowerPC Options): Document -mspe
+ option.
- * config/rs6000/eabispe.h (SUBSUBTARGET_OVERRIDE_OPTIONS): Set
- rs6000_spe.
+ * config/rs6000/eabispe.h (SUBSUBTARGET_OVERRIDE_OPTIONS): Set
+ rs6000_spe.
- * config/rs6000/eabi.h (TARGET_E500): Define.
+ * config/rs6000/eabi.h (TARGET_E500): Define.
- * config/rs6000/rs6000.h (TARGET_E500): Define.
- (TARGET_OPTIONS): Add spe= option.
- Declare rs6000_spe and rs6000_spe_string extern.
+ * config/rs6000/rs6000.h (TARGET_E500): Define.
+ (TARGET_OPTIONS): Add spe= option.
+ Declare rs6000_spe and rs6000_spe_string extern.
- * config/rs6000/rs6000.c (branch_positive_comparison_operator):
- Change TARGET_SPE to TARGET_E500.
- (ccr_bit): Change TARGET_SPE to TARGET_E500. Check for
- !TARGET_FPRS.
- (print_operand): Same.
- (rs6000_generate_compare): Same.
- (output_cbranch): Same.
- (rs6000_spe): Declare.
- (rs6000_spe_string): Declare.
- (rs6000_override_options): Call rs6000_parse_spe_option.
- (rs6000_parse_spe_option): New.
+ * config/rs6000/rs6000.c (branch_positive_comparison_operator):
+ Change TARGET_SPE to TARGET_E500.
+ (ccr_bit): Change TARGET_SPE to TARGET_E500. Check for
+ !TARGET_FPRS.
+ (print_operand): Same.
+ (rs6000_generate_compare): Same.
+ (output_cbranch): Same.
+ (rs6000_spe): Declare.
+ (rs6000_spe_string): Declare.
+ (rs6000_override_options): Call rs6000_parse_spe_option.
+ (rs6000_parse_spe_option): New.
2003-04-06 Steven Bosscher <steven@gcc.gnu.org>
Fri Apr 4 17:43:52 2003 Olivier Hainque <hainque@act-europe.fr>
- * emit-rtl.c (get_mem_attrs): Adjust alignment tests determining
- use of default attributes to agree MEM_ALIGN macro.
+ * emit-rtl.c (get_mem_attrs): Adjust alignment tests determining
+ use of default attributes to agree MEM_ALIGN macro.
Fri Apr 4 17:33:24 2003 Joel Brobecker <brobecker@gnat.com>
- * dbxout.c (dbxout_type): When printing type index of range type
+ * dbxout.c (dbxout_type): When printing type index of range type
whose bounds are printed in octal format, print type of parent type if
it exists so enumerated type descriptions are not transformed
- into unsigned types.
+ into unsigned types.
2003-04-04 Kazu Hirata <kazu@cs.umass.edu>
2003-04-03 Nick Clifton <nickc@redhat.com>
* config/sparc/sol2-bi.h (ASM_CPU64_DEFAULT_SPEC): Add -TSO.
- (DEF_ARCH64_SPEC): Likewise.
+ (DEF_ARCH64_SPEC): Likewise.
Thu Apr 3 09:53:40 CEST 2003 Jan Hubicka <jh@suse.cz>
2003-04-02 Richard Henderson <rth@redhat.com>
- * dwarf2out.c (output_call_frame_info): Ignore fde->nothrow as an
- optimization when flag_exceptions not enabled.
+ * dwarf2out.c (output_call_frame_info): Ignore fde->nothrow as an
+ optimization when flag_exceptions not enabled.
2003-04-02 Vladimir Makarov <vmakarov@redhat.com>
2003-04-01 Richard Henderson <rth@redhat.com>
- * except.c (convert_from_eh_region_ranges_1): Smash REG_EH_REGION
- notes for nothrow calls if flag_forced_unwind_exceptions.
- (build_post_landing_pads): Mind flag_forced_unwind_exceptions.
- (sjlj_find_directly_reachable_regions): Likewise.
- (reachable_handlers): Likewise.
- (can_throw_external): Likewise.
- (collect_one_action_chain): Record cleanups after catch-all and
- must-not-throw if flag_forced_unwind_exceptions.
- * flags.h (flag_forced_unwind_exceptions): Declare.
- * toplev.c (flag_forced_unwind_exceptions): New.
- (lang_independent_options): Add it.
+ * except.c (convert_from_eh_region_ranges_1): Smash REG_EH_REGION
+ notes for nothrow calls if flag_forced_unwind_exceptions.
+ (build_post_landing_pads): Mind flag_forced_unwind_exceptions.
+ (sjlj_find_directly_reachable_regions): Likewise.
+ (reachable_handlers): Likewise.
+ (can_throw_external): Likewise.
+ (collect_one_action_chain): Record cleanups after catch-all and
+ must-not-throw if flag_forced_unwind_exceptions.
+ * flags.h (flag_forced_unwind_exceptions): Declare.
+ * toplev.c (flag_forced_unwind_exceptions): New.
+ (lang_independent_options): Add it.
* doc/invoke.text: Add it.
2003-04-01 David Mosberger <davidm@hpl.hp.com>
- * config/ia64/crti.asm: Clean up trailing whitespace.
- Remove trailing hashes (#) from identifiers.
+ * config/ia64/crti.asm: Clean up trailing whitespace.
+ Remove trailing hashes (#) from identifiers.
- * config/ia64/crtn.asm: Ditto.
+ * config/ia64/crtn.asm: Ditto.
- * config/ia64/crtend.asm: Remove trailing hashes (#) from
- identifiers.
- (__do_global_ctors_aux): Align to 32-byte boundary. Add unwind
- directives. Drop explicit bundling---it just makes the code
- harder to read. Don't save/restore gp needlessly.
+ * config/ia64/crtend.asm: Remove trailing hashes (#) from
+ identifiers.
+ (__do_global_ctors_aux): Align to 32-byte boundary. Add unwind
+ directives. Drop explicit bundling---it just makes the code
+ harder to read. Don't save/restore gp needlessly.
- * config/ia64/crtbegin.asm: Remove trailing hashes (#) from
- identifiers (they're only needed if the identifier would clash
- with a register name otherwise).
- (__do_global_dtors_aux): Align to 32-byte boundary. Add unwind
- directives. Drop explicit bundling---it just makes the code
- harder to read.
- (__do_jv_register_classes): Ditto.
- (.fini_array): Remove "progbits" (newer
- assemblers don't like wrong section-types).
- (.init_array): Ditto.
+ * config/ia64/crtbegin.asm: Remove trailing hashes (#) from
+ identifiers (they're only needed if the identifier would clash
+ with a register name otherwise).
+ (__do_global_dtors_aux): Align to 32-byte boundary. Add unwind
+ directives. Drop explicit bundling---it just makes the code
+ harder to read.
+ (__do_jv_register_classes): Ditto.
+ (.fini_array): Remove "progbits" (newer
+ assemblers don't like wrong section-types).
+ (.init_array): Ditto.
2003-04-01 Roger Sayle <roger@eyesopen.com>
2003-02-31 Aldy Hernandez <aldyh@redhat.com>
- * testsuite/gcc.c-torture/execute/simd-3.c: New.
-
- * expr.c (expand_expr): Handle VECTOR_CST.
- (const_vector_from_tree): New.
-
- * varasm.c (output_constant): Handle VECTOR_CST.
-
- * c-typeck.c (digest_init): Build a vector constant from a
- VECTOR_TYPE.
-
- * config/rs6000/rs6000.c: Remove prototype for
- easy_vector_constant.
- (easy_vector_constant): Add mode parameter. Rewrite to handle
- more easy constants.
- (rs6000_emit_move): Pass mode to easy_vector_constant.
- Call emit_easy_vector_insn for SPE V2SI vector constant moves.
- (emit_easy_vector_insn): New.
- (easy_vector_same): New.
- (EASY_VECTOR_15): New macro.
- (EASY_VECTOR_15_ADD_SELF): New macro.
- (bdesc_2arg): Rename to xorv2si3.
- (easy_vector_constant_add_self): New.
- (input_operand): Allow vector constants.
-
- * config/rs6000/rs6000.h (PREDICATE_CODES): Add
- easy_vector_constant, easy_vector_constant_add_self.
- (EXTRA_CONSTRAINT): Add 'W'.
-
- * config/rs6000/rs6000-protos.h: Add prototype for
- easy_vector_constant, emit_easy_vector_insn.
-
- * config/rs6000/altivec.md (xorv8hi3): New.
- (xorv16qi3): New.
- Remove all _const0 patterns.
- (movv4si_internal): Rewrite to use code. Add vector constant to
- vector alternative. Add splitter.
- (movv8hi_internal): Same.
- (movv16qi_internal): Same.
- (movv4sf_internal): Same.
- Change the unspecs for vspltis* to use constants.
-
- * config/rs6000/spe.md ("xorv4hi3"): New.
- ("spe_evxor"): Rename to xorv2si3.
- ("xorv1di3"): New.
- Remove all _const0 patterns.
- (movv2si_internal): Rewrite to use code. Add vector constant to
- alternatives. Add splitter.
- (movv4hi_internal): Add vector constant to alternatives.
- (movv1di_internal): Same.
- (movv2sf_internal): Same.
+ * testsuite/gcc.c-torture/execute/simd-3.c: New.
+
+ * expr.c (expand_expr): Handle VECTOR_CST.
+ (const_vector_from_tree): New.
+
+ * varasm.c (output_constant): Handle VECTOR_CST.
+
+ * c-typeck.c (digest_init): Build a vector constant from a
+ VECTOR_TYPE.
+
+ * config/rs6000/rs6000.c: Remove prototype for
+ easy_vector_constant.
+ (easy_vector_constant): Add mode parameter. Rewrite to handle
+ more easy constants.
+ (rs6000_emit_move): Pass mode to easy_vector_constant.
+ Call emit_easy_vector_insn for SPE V2SI vector constant moves.
+ (emit_easy_vector_insn): New.
+ (easy_vector_same): New.
+ (EASY_VECTOR_15): New macro.
+ (EASY_VECTOR_15_ADD_SELF): New macro.
+ (bdesc_2arg): Rename to xorv2si3.
+ (easy_vector_constant_add_self): New.
+ (input_operand): Allow vector constants.
+
+ * config/rs6000/rs6000.h (PREDICATE_CODES): Add
+ easy_vector_constant, easy_vector_constant_add_self.
+ (EXTRA_CONSTRAINT): Add 'W'.
+
+ * config/rs6000/rs6000-protos.h: Add prototype for
+ easy_vector_constant, emit_easy_vector_insn.
+
+ * config/rs6000/altivec.md (xorv8hi3): New.
+ (xorv16qi3): New.
+ Remove all _const0 patterns.
+ (movv4si_internal): Rewrite to use code. Add vector constant to
+ vector alternative. Add splitter.
+ (movv8hi_internal): Same.
+ (movv16qi_internal): Same.
+ (movv4sf_internal): Same.
+ Change the unspecs for vspltis* to use constants.
+
+ * config/rs6000/spe.md ("xorv4hi3"): New.
+ ("spe_evxor"): Rename to xorv2si3.
+ ("xorv1di3"): New.
+ Remove all _const0 patterns.
+ (movv2si_internal): Rewrite to use code. Add vector constant to
+ alternatives. Add splitter.
+ (movv4hi_internal): Add vector constant to alternatives.
+ (movv1di_internal): Same.
+ (movv2sf_internal): Same.
2003-03-31 Mark Mitchell <mark@codesourcery.com>
2003-03-30 Richard Henderson <rth@redhat.com>
PR opt/10011, opt/10252:
- * toplev.c (rest_of_compilation): Run purge_builtin_constant_p
- before post-gcse cse pass.
+ * toplev.c (rest_of_compilation): Run purge_builtin_constant_p
+ before post-gcse cse pass.
2003-03-30 Roger Sayle <roger@eyesopen.com>
2003-03-30 Gabriel Dos Reis <gdr@integrable-solutions.net>
- * Makefile.in (STRICT_WARN): Don't warn for ISO C constructs.
- (STRICT2_WARN): Likewise.
+ * Makefile.in (STRICT_WARN): Don't warn for ISO C constructs.
+ (STRICT2_WARN): Likewise.
2003-03-30 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
(load_mems): Adjust replace_loop_mems call.
2003-03-28 Eric Botcazou <ebotcazou@libertysurf.fr>
- Richard Henderson <rth@redhat.com>
+ Richard Henderson <rth@redhat.com>
PR target/10114 and PR target/10084
* dwarf2out.c (mem_loc_descriptor): Handle LO_SUM.
2003-03-27 David Mosberger <davidm@hpl.hp.com>
- * unwind-libunwind.c (uw_frame_state_for): Adjust for libunwind
- v0.9 API change: replace read of UNW_REG_HANDLER with
- unw_get_proc_info().
- (_Unwind_GetLanguageSpecificData): Replace read of UNW_REG_LSDA
- with unw_get_proc_info().
- (_Unwind_GetRegionStart): Replace UNW_REG_PROC_START with
- unw_get_proc_info().
+ * unwind-libunwind.c (uw_frame_state_for): Adjust for libunwind
+ v0.9 API change: replace read of UNW_REG_HANDLER with
+ unw_get_proc_info().
+ (_Unwind_GetLanguageSpecificData): Replace read of UNW_REG_LSDA
+ with unw_get_proc_info().
+ (_Unwind_GetRegionStart): Replace UNW_REG_PROC_START with
+ unw_get_proc_info().
2003-03-27 Vladimir Makarov <vmakarov@redhat.com>
2003-03-26 Vladimir Makarov <vmakarov@redhat.com>
- * config/rs6000/8540.md: New file.
+ * config/rs6000/8540.md: New file.
* config/rs6000/{40x.md, 603.md, 6xx.md, 7450.md, 7xx.md, mpc.md,
power4.md, rios1.md, rios2.md, rs64.md}: Add mult_compare to
+2003-04-06 Zack Weinberg <zack@codesourcery.com>
+
+ * ada-tree.def: Make fourth element for GNAT_LOOP_ID zero.
+ * misc.c (gnat_tree_size): New function.
+ (LANG_HOOKS_TREE_SIZE): Override.
+
2003-04-03 Jason Merrill <jason@redhat.com>
* misc.c (gnat_adjust_rli): #if 0.
2003-01-29 Laurent Guerby <guerby@acm.org>
- PR ada/8344
- * final.c: rename to adafinal.c to avoid file name conflicts with gcc file.
- * Makefile.in: match previous change.
- * Make-lang.in: match previous change.
+ PR ada/8344
+ * final.c: rename to adafinal.c to avoid file name conflicts with gcc file.
+ * Makefile.in: match previous change.
+ * Make-lang.in: match previous change.
2003-01-29 Joel Sherrill <joel@OARcorp.com>
??? This should be redone at some point. */
-DEFTREECODE (GNAT_LOOP_ID, "gnat_loop_id", 'x', 1)
+DEFTREECODE (GNAT_LOOP_ID, "gnat_loop_id", 'x', 0)
extern int save_argc;
extern char **save_argv;
+static size_t gnat_tree_size PARAMS ((enum tree_code));
static bool gnat_init PARAMS ((void));
static void gnat_init_options PARAMS ((void));
static int gnat_decode_option PARAMS ((int, char **));
#define LANG_HOOKS_NAME "GNU Ada"
#undef LANG_HOOKS_IDENTIFIER_SIZE
#define LANG_HOOKS_IDENTIFIER_SIZE sizeof (struct tree_identifier)
+#undef LANG_HOOKS_TREE_SIZE
+#define LANG_HOOKS_TREE_SIZE gnat_tree_size
#undef LANG_HOOKS_INIT
#define LANG_HOOKS_INIT gnat_init
#undef LANG_HOOKS_INIT_OPTIONS
Compiler_Abort (fp, -1);
}
+/* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */
+static size_t
+gnat_tree_size (enum tree_code code)
+{
+ switch (code)
+ {
+ case GNAT_LOOP_ID: return sizeof (struct tree_loop_id);
+ default:
+ abort ();
+ }
+ /* NOTREACHED */
+}
+
/* Perform all the initialization steps that are language-specific. */
static bool
/* Tree nodes relevant to both C and C++. These were originally in
cp-tree.def in the cp subdir. */
-/* A node to remember a source position. */
-DEFTREECODE (SRCLOC, "srcloc", 'x', 2)
-
DEFTREECODE (SIZEOF_EXPR, "sizeof_expr", '1', 1)
DEFTREECODE (ARROW_EXPR, "arrow_expr", 'e', 1)
DEFTREECODE (ALIGNOF_EXPR, "alignof_expr", '1', 1)
pp_initializer (ppi, e);
break;
-#if 0
- case SRCLOC:
- pp_left_paren (ppi);
- pp_identifier (ppi, "__location__");
- pp_right_paren (ppi);
- pp_whitespace (ppi);
- pp_left_brace (ppi);
- pp_dot (ppi);
- pp_identifier (ppi, "file");
- pp_whitespace (ppi);
- pp_equal (ppi);
- pp_c_whitespace (ppi);
- pp_c_expression (ppi, SRCLOC_FILE (e));
- pp_separate_with (ppi, ',');
- pp_dot (ppi);
- pp_identifier (ppi, "line");
- pp_whitespace (ppi);
- pp_equal (ppi);
- pp_c_whitespace (ppi);
- pp_c_expression (ppi, SRCLOC_LINE (e));
- pp_right_brace (ppi);
- break;
-#endif
-
case VA_ARG_EXPR:
pp_c_identifier (ppi, "__builtin_va_arg");
pp_c_left_paren (ppi);
+2003-04-06 Zack Weinberg <zack@codesourcery.com>
+
+ * cp-tree.def: Make fourth element for all 'c' and 'x' nodes zero.
+ * cp-lang.c (cp_tree_size): New function.
+ (LANG_HOOKS_TREE_SIZE): Override.
+
+ * cp-tree.h (SOURCE_LOCUS, SRCLOC_FILE, SRCLOC_LINE, struct
+ tree_srcloc, TS_CP_COMMON, TS_CP_SRCLOC): Kill.
+ (union lang_tree_node): Remove common and srcloc members.
+ (build_srcloc_here): Don't prototype.
+ * decl.c (cp_tree_node_structure): Kill SRCLOC case.
+ * pt.c (pending_templates): Correct comment.
+ * tree.c (build_srcloc, build_srcloc_here): Kill.
+
2003-04-06 Zack Weinberg <zack@codesourcery.com>
* call.c: Include intl.h.
2002-08-11 Gabriel Dos Reis <gdr@nerim.net>
- * decl.c (duplicate_decls): Replace DECL_SOURCE_FILE +
+ * decl.c (duplicate_decls): Replace DECL_SOURCE_FILE
DECL_SOURCE_LINE with DECL_SOURCE_LOCATION.
* optimize.c (maybe_clone_body): Likewise.
* pt.c (tsubst_enum): Likewise.
static bool ok_to_generate_alias_set_for_type (tree);
static bool cxx_warn_unused_global_decl (tree);
static tree cp_expr_size (tree);
+static size_t cp_tree_size (enum tree_code);
static bool cp_var_mod_type_p (tree);
#undef LANG_HOOKS_NAME
#define LANG_HOOKS_NAME "GNU C++"
+#undef LANG_HOOKS_TREE_SIZE
+#define LANG_HOOKS_TREE_SIZE cp_tree_size
#undef LANG_HOOKS_INIT
#define LANG_HOOKS_INIT cxx_init
#undef LANG_HOOKS_FINISH
return lhd_expr_size (exp);
}
+/* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */
+static size_t
+cp_tree_size (enum tree_code code)
+{
+ switch (code)
+ {
+ case PTRMEM_CST: return sizeof (struct ptrmem_cst);
+ case BASELINK: return sizeof (struct tree_baselink);
+ case TEMPLATE_PARM_INDEX: return sizeof (template_parm_index);
+ case DEFAULT_ARG: return sizeof (struct tree_default_arg);
+ case OVERLOAD: return sizeof (struct tree_overload);
+ case WRAPPER: return sizeof (struct tree_wrapper);
+ default:
+ abort ();
+ }
+ /* NOTREACHED */
+}
+
/* Returns true if T is a variably modified type, in the sense of C99.
This routine needs only check cases that cannot be handled by the
language-independent logic in tree-inline.c. */
/* A pointer-to-member constant. For a pointer-to-member constant
`X::Y' The PTRMEM_CST_CLASS is the RECORD_TYPE for `X' and the
PTRMEM_CST_MEMBER is the _DECL for `Y'. */
-DEFTREECODE (PTRMEM_CST, "ptrmem_cst", 'c', 2)
+DEFTREECODE (PTRMEM_CST, "ptrmem_cst", 'c', 0)
/* For NEW_EXPR, operand 0 is the placement list.
Operand 1 is the new-declarator.
the type of the expression. This type is either a FUNCTION_TYPE,
METHOD_TYPE, or `unknown_type_node' indicating that the function is
overloaded. */
-DEFTREECODE (BASELINK, "baselink", 'x', 3)
+DEFTREECODE (BASELINK, "baselink", 'x', 0)
/* Template definition. The following fields have the specified uses,
although there are other macros in cp-tree.h that should be used for
The LEVEL is the level of the parameter when we are worrying about
the types of things; the ORIG_LEVEL is the level when we are
worrying about instantiating things. */
-DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", 'x',
- /* The addition of (sizeof(tree) - 1) in the next expression
- is to handle the case when padding pushes us past an even
- multiple of sizeof(tree). */
- /* We used to try to calculate this using
- 1+3*sizeof(HOST_WIDE_INT), but that fails if alignment
- makes it bigger. */
- ((sizeof (template_parm_index) - sizeof (struct tree_common))
- + sizeof (tree) - 1)
- / sizeof (tree))
+DEFTREECODE (TEMPLATE_PARM_INDEX, "template_parm_index", 'x', 0)
/* Index into a template parameter list. This parameter must be a type.
The TYPE_FIELDS value will be a TEMPLATE_PARM_INDEX. */
DEFTREECODE (USING_STMT, "using_directive", 'e', 1)
/* An un-parsed default argument. Looks like an IDENTIFIER_NODE. */
-DEFTREECODE (DEFAULT_ARG, "default_arg", 'x', 2)
+DEFTREECODE (DEFAULT_ARG, "default_arg", 'x', 0)
/* A template-id, like foo<int>. The first operand is the template.
The second is the TREE_LIST or TREE_VEC of explicitly specified
/* A list-like node for chaining overloading candidates. TREE_TYPE is
the original name, and the parameter is the FUNCTION_DECL. */
-DEFTREECODE (OVERLOAD, "overload", 'x', 1)
+DEFTREECODE (OVERLOAD, "overload", 'x', 0)
/* A generic wrapper for something not tree that we want to include in
tree structure. */
-DEFTREECODE (WRAPPER, "wrapper", 'x', 1)
+DEFTREECODE (WRAPPER, "wrapper", 'x', 0)
/* Used to represent deferred name lookup for dependent names while
parsing a template declaration. The first argument is an
struct z_candidate *z_c;
};
-#define SOURCE_LOCUS(NODE) \
- (((struct tree_srcloc*)SRCLOC_CHECK (NODE))->locus)
-#define SRCLOC_FILE(NODE) SOURCE_LOCUS (NODE).file
-#define SRCLOC_LINE(NODE) SOURCE_LOCUS (NODE).line
-
-struct tree_srcloc GTY(())
-{
- struct tree_common common;
- location_t locus;
-};
-
/* Macros for access to language-specific slots in an identifier. */
#define IDENTIFIER_NAMESPACE_BINDINGS(NODE) \
};
enum cp_tree_node_structure_enum {
- TS_CP_COMMON,
TS_CP_GENERIC,
TS_CP_IDENTIFIER,
TS_CP_TPI,
TS_CP_OVERLOAD,
TS_CP_BASELINK,
TS_CP_WRAPPER,
- TS_CP_SRCLOC,
TS_CP_DEFAULT_ARG,
LAST_TS_CP_ENUM
};
union lang_tree_node GTY((desc ("cp_tree_node_structure (&%h)"),
chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)")))
{
- struct tree_common GTY ((tag ("TS_CP_COMMON"))) common;
union tree_node GTY ((tag ("TS_CP_GENERIC"),
desc ("tree_node_structure (&%h)"))) generic;
struct template_parm_index_s GTY ((tag ("TS_CP_TPI"))) tpi;
struct tree_overload GTY ((tag ("TS_CP_OVERLOAD"))) overload;
struct tree_baselink GTY ((tag ("TS_CP_BASELINK"))) baselink;
struct tree_wrapper GTY ((tag ("TS_CP_WRAPPER"))) wrapper;
- struct tree_srcloc GTY ((tag ("TS_CP_SRCLOC"))) srcloc;
struct tree_default_arg GTY ((tag ("TS_CP_DEFAULT_ARG"))) default_arg;
struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier;
};
extern tree lvalue_type (tree);
extern tree error_type (tree);
extern tree build_zc_wrapper (struct z_candidate *);
-extern tree build_srcloc_here (void);
extern int varargs_function_p (tree);
extern int really_overloaded_fn (tree);
extern int cp_tree_equal (tree, tree);
case PTRMEM_CST: return TS_CP_PTRMEM;
case BASELINK: return TS_CP_BASELINK;
case WRAPPER: return TS_CP_WRAPPER;
- case SRCLOC: return TS_CP_SRCLOC;
default: return TS_CP_GENERIC;
}
}
/* The PENDING_TEMPLATES is a TREE_LIST of templates whose
instantiations have been deferred, either because their definitions
- were not yet available, or because we were putting off doing the
- work. The TREE_PURPOSE of each entry is a SRCLOC indicating where
- the instantiate request occurred; the TREE_VALUE is either a DECL
- (for a function or static data member), or a TYPE (for a class)
- indicating what we are hoping to instantiate. */
+ were not yet available, or because we were putting off doing the work.
+ The TREE_PURPOSE of each entry is either a DECL (for a function or
+ static data member), or a TYPE (for a class) indicating what we are
+ hoping to instantiate. The TREE_VALUE is not used. */
static GTY(()) tree pending_templates;
static GTY(()) tree last_pending_template;
static hashval_t list_hash PARAMS ((const void *));
static cp_lvalue_kind lvalue_p_1 PARAMS ((tree, int, int));
static tree no_linkage_helper PARAMS ((tree *, int *, void *));
-static tree build_srcloc PARAMS ((const char *, int));
static tree mark_local_for_remap_r PARAMS ((tree *, int *, void *));
static tree cp_unsave_r PARAMS ((tree *, int *, void *));
static tree build_target_expr PARAMS ((tree, tree));
return t;
}
-static tree
-build_srcloc (file, line)
- const char *file;
- int line;
-{
- tree t;
-
- t = make_node (SRCLOC);
- SRCLOC_FILE (t) = file;
- SRCLOC_LINE (t) = line;
-
- return t;
-}
-
-tree
-build_srcloc_here ()
-{
- return build_srcloc (input_filename, lineno);
-}
-
/* The type of ARG when used as an lvalue. */
tree
extern void lhd_incomplete_type_error PARAMS ((tree, tree));
extern tree lhd_type_promotes_to PARAMS ((tree));
extern tree lhd_expr_size PARAMS ((tree));
+extern size_t lhd_tree_size PARAMS ((enum tree_code));
/* Declarations of default tree inlining hooks. */
tree lhd_tree_inlining_walk_subtrees PARAMS ((tree *, int *,
#define LANG_HOOKS_PRINT_ERROR_FUNCTION lhd_print_error_function
#define LANG_HOOKS_DECL_PRINTABLE_NAME lhd_decl_printable_name
#define LANG_HOOKS_EXPR_SIZE lhd_expr_size
+#define LANG_HOOKS_TREE_SIZE lhd_tree_size
#define LANG_HOOKS_FUNCTION_INIT lhd_do_nothing_f
#define LANG_HOOKS_FUNCTION_FINAL lhd_do_nothing_f
#define LANG_HOOKS_INITIALIZER { \
LANG_HOOKS_NAME, \
LANG_HOOKS_IDENTIFIER_SIZE, \
+ LANG_HOOKS_TREE_SIZE, \
LANG_HOOKS_INIT_OPTIONS, \
LANG_HOOKS_DECODE_OPTION, \
LANG_HOOKS_POST_OPTIONS, \
return size_in_bytes (TREE_TYPE (exp));
}
+/* lang_hooks.tree_size: Determine the size of a tree with code C,
+ which is a language-specific tree code in category 'x'. The
+ default expects never to be called. */
+size_t
+lhd_tree_size (c)
+ enum tree_code c ATTRIBUTE_UNUSED;
+{
+ abort ();
+ return 0;
+}
+
/* lang_hooks.decls.final_write_globals: perform final processing on
global variables. */
void
identifier nodes long enough for the language-specific slots. */
size_t identifier_size;
+ /* Determines the size of any language-specific 'x' or 'c' nodes.
+ Since it is called from make_node, the only information available
+ is the tree code. Expected to abort on unrecognized codes. */
+ size_t (*tree_size) PARAMS ((enum tree_code));
+
/* The first callback made to the front end, for simple
initialization needed before any calls to decode_option. */
void (*init_options) PARAMS ((void));
+ TREE_CODE_LENGTH (code) * sizeof (char *) - sizeof (char *));
case 'c': /* a constant */
- /* We can't use TREE_CODE_LENGTH for INTEGER_CST, since the number of
- words is machine-dependent due to varying length of HOST_WIDE_INT,
- which might be wider than a pointer (e.g., long long). Similarly
- for REAL_CST, since the number of words is machine-dependent due
- to varying size and alignment of `double'. */
- if (code == INTEGER_CST)
- return sizeof (struct tree_int_cst);
- else if (code == REAL_CST)
- return sizeof (struct tree_real_cst);
- else
- return (sizeof (struct tree_common)
- + TREE_CODE_LENGTH (code) * sizeof (char *));
+ switch (code)
+ {
+ case INTEGER_CST: return sizeof (struct tree_int_cst);
+ case REAL_CST: return sizeof (struct tree_real_cst);
+ case COMPLEX_CST: return sizeof (struct tree_complex);
+ case VECTOR_CST: return sizeof (struct tree_vector);
+ case STRING_CST: return sizeof (struct tree_string);
+ default:
+ return (*lang_hooks.tree_size) (code);
+ }
case 'x': /* something random, like an identifier. */
- {
- size_t length;
- length = (sizeof (struct tree_common)
- + TREE_CODE_LENGTH (code) * sizeof (char *));
- if (code == TREE_VEC)
- length += TREE_VEC_LENGTH (node) * sizeof (char *) - sizeof (char *);
- return length;
- }
+ switch (code)
+ {
+ case IDENTIFIER_NODE: return lang_hooks.identifier_size;
+ case TREE_LIST: return sizeof (struct tree_list);
+ case TREE_VEC: return (sizeof (struct tree_vec)
+ + TREE_VEC_LENGTH(node) * sizeof(char *)
+ - sizeof (char *));
+
+ case ERROR_MARK:
+ case PLACEHOLDER_EXPR: return sizeof (struct tree_common);
+
+ default:
+ return (*lang_hooks.tree_size) (code);
+ }
default:
abort ();
{
if (AGGREGATE_TYPE_P (TREE_TYPE (init)))
{
- tree aggr_init = TREE_OPERAND (init, 1);
+ tree aggr_init = CONSTRUCTOR_ELTS (init);
while (aggr_init)
{
's' for codes for expressions with inherent side effects.
'e' for codes for other kinds of expressions. */
-/* For `r', `e', `<', `1', `2', `s' and `x' nodes,
- the 4th element is the number of argument slots to allocate.
- This determines the size of the tree node object. */
+/* For `r', `e', `<', `1', `2', and `s' nodes, which use struct
+ tree_exp, the 4th element is the number of argument slots to
+ allocate. This determines the size of the tree node object.
+ Other nodes use different structures, and the size is determined
+ by the tree_union member structure; the 4th element should be
+ zero. Languages that define language-specific 'x' or 'c' codes
+ must define the tree_size langhook to say how big they are. */
/* Any erroneous construct is parsed into a node of this type.
This type of node is accepted without complaint in all contexts
Internally it looks like a STRING_CST node.
There is only one IDENTIFIER_NODE ever made for any particular name.
Use `get_identifier' to get it (or create it, the first time). */
-DEFTREECODE (IDENTIFIER_NODE, "identifier_node", 'x', ((LANG_HOOKS_IDENTIFIER_SIZE - sizeof (struct tree_common) + sizeof (tree) - 1) / sizeof (tree)))
+DEFTREECODE (IDENTIFIER_NODE, "identifier_node", 'x', 0)
/* Has the TREE_VALUE and TREE_PURPOSE fields. */
/* These nodes are made into lists by chaining through the
TREE_CHAIN field. The elements of the list live in the
TREE_VALUE fields, while TREE_PURPOSE fields are occasionally
used as well to get the effect of Lisp association lists. */
-DEFTREECODE (TREE_LIST, "tree_list", 'x', 2)
+DEFTREECODE (TREE_LIST, "tree_list", 'x', 0)
/* These nodes contain an array of tree nodes. */
-DEFTREECODE (TREE_VEC, "tree_vec", 'x', 2)
+DEFTREECODE (TREE_VEC, "tree_vec", 'x', 0)
/* A symbol binding block. These are arranged in a tree,
where the BLOCK_SUBBLOCKS field contains a chain of subblocks
Note: constants of type char in Pascal are INTEGER_CST,
and so are pointer constants such as nil in Pascal or NULL in C.
`(int *) 1' in C also results in an INTEGER_CST. */
-DEFTREECODE (INTEGER_CST, "integer_cst", 'c', 2)
+DEFTREECODE (INTEGER_CST, "integer_cst", 'c', 0)
-/* Contents are in TREE_REAL_CST field. Also there is TREE_CST_RTL. */
-DEFTREECODE (REAL_CST, "real_cst", 'c', 3)
+/* Contents are in TREE_REAL_CST field. */
+DEFTREECODE (REAL_CST, "real_cst", 'c', 0)
/* Contents are in TREE_REALPART and TREE_IMAGPART fields,
- whose contents are other constant nodes.
- Also there is TREE_CST_RTL. */
-DEFTREECODE (COMPLEX_CST, "complex_cst", 'c', 3)
+ whose contents are other constant nodes. */
+DEFTREECODE (COMPLEX_CST, "complex_cst", 'c', 0)
/* Contents are in TREE_VECTOR_CST_ELTS field. */
-DEFTREECODE (VECTOR_CST, "vector_cst", 'c', 3)
+DEFTREECODE (VECTOR_CST, "vector_cst", 'c', 0)
-/* Contents are TREE_STRING_LENGTH and TREE_STRING_POINTER fields.
- Also there is TREE_CST_RTL. */
-DEFTREECODE (STRING_CST, "string_cst", 'c', 3)
+/* Contents are TREE_STRING_LENGTH and TREE_STRING_POINTER fields. */
+DEFTREECODE (STRING_CST, "string_cst", 'c', 0)
/* Declarations. All references to names are represented as ..._DECL nodes.
The decls in one binding context are chained through the TREE_CHAIN field.