diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2005-07-08 23:37:11 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2005-07-08 23:37:11 +0000 |
commit | 820cc88fbd53803f1b57374bfc78e628c6879fc0 (patch) | |
tree | e8e5667e9ce5aa5fc7514d5caa37a74c88e3f391 /gcc/tree.c | |
parent | c249f608702bff661796e3c188a848601cb4861c (diff) | |
download | gcc-820cc88fbd53803f1b57374bfc78e628c6879fc0.zip gcc-820cc88fbd53803f1b57374bfc78e628c6879fc0.tar.gz gcc-820cc88fbd53803f1b57374bfc78e628c6879fc0.tar.bz2 |
Makefile.in (TREE_H): Add treestruct.def.
2005-07-08 Daniel Berlin <dberlin@dberlin.org>
* Makefile.in (TREE_H): Add treestruct.def.
(c-decl.o): Add pointer-set.h
* c-decl.c (diagnose_mismatched_decls): Don't attempt to look at
visibility on regular DECL's.
(merge_decls): Fix the copying of decl nodes of various types for
the new structures. Don't update RTL, section name, weak status,
etc, on DECL's without RTL.
(grokdeclarator): DECL_ARG_TYPE_AS_WRITTEN is gone.
Don't check volatile on non-variable types.
(store_parm_decls_oldstyle): Use pointer_set instead of DECL_WEAK
to check whether we have seen arguments.
* c-objc-common.c (c_tree_printer): Reverse order of tests so that
flag is checked before field (flag is common, field is not).
* dwarf2out.c (decl_ultimate_origin): Only DECL's with
TS_DECL_COMMON could have an origin.
(add_location_or_const_value_attribute): Don't check section name
on non-var/function decls.
(dwarf2out_var_location): Reverse order of tests.
* emit-rtl.c (set_reg_attrs_for_parm): DECL_CHECK is dead, replace
with DECL_WRTL_CHECK.
* expmed.c (make_tree): rtl is now in decl_with_rtl.
* fold-const.c (fold_binary): Don't check weakness on
non-var/function decls.
(tree_expr_nonzero_p): Ditto.
(fold_checksum_tree): Use tree_decl_extra as sizeof
buffer.
* ggc-page.c (extra_order_size_table): Add sizes for
tree_decl_non_common, tree_parm_decl, tree_var_decl, and
tree_field_decl.
* gimplify.c (gimplify_bind_expr): Only set
DECL_SEEN_IN_BIND_EXPR_P on VAR_DECL.
* integrate.c (copy_decl_for_inlining): Don't set RTL on decl's
without RTL.
* langhooks-def.h (LANG_HOOK_INIT_TS): New.
* langhooks.h (init_ts). New langhook.
* passes.c (rest_of_decl_compilation): Reverse order of tests.
* print-tree.c (print_node): Update to only print fields that
exist in the structures the passed decl has.
* toplev.c (wrapup_global_declarations): Don't reset
DECL_DEFER_OUTPUT on DECL's that don't contain it.
* tree-browser.c (browse_tree): DECL_ARG_TYPE_AS_WRITTEN removed.
* tree-inline.c (remap_decl): Ditto.
* tree-outof-ssa.c (create_temp): Reverse order of tests.
* tree-pretty-print.c (print_declaration): Don't print
DECL_REGISTER on things that don't contain it.
* tree-vrp.c (expr_computes_nonzero): Don't check weakness on
non-var/function decls.
* tree.c (tree_contains_struct): New structure.
(init_priority_for_decl): New hashtable.
(tree_int_map): New structure.
(tree_int_map_eq): New function.
(tree_int_map_marked_p): Ditto.
(tree_int_map_hash): Ditto.
(tree_map): Move to tree.h.
(tree_map_eq): Externalize.
(tree_map_hash): Ditto.
(tree_map_marked_p): Ditto.
(init_ttree): Set up tree_contains_struct and call langhook.
(decl_assembler_name): Use DECL_NON_COMMON_CHECK..
(tree_code_size): Update for new structures.
(tree_node_structure): Update for new structures.
(make_node_stat): Don't try to set DECL_IN_SYSTEM_HEADER on decls
without the field.
(copy_node_stat): Copy init priority.
(build_decl_stat): Ditto for visibility.
(ts_enum_names): New.
(tree_contains_struct_check_failed): New function.
(decl_init_priority_lookup): Ditto.
(decl_init_priority_insert): Ditto.
* treestruct.def: New file.
* tree.h (CODE_CONTAINS_STRUCT): New macro.
(CONTAINS_STRUCT_CHECK): Ditto.
(tree_contains_struct_check_failed): New prototype.
(DECL_CHECK): Removed.
(DECL_MINIMAL_CHECK): New.
(DECL_COMMON_CHECK): Ditto.
(DECL_WRTL_CHECK): Ditto.
(DECL_NON_COMMON_CHECK): Ditto.
(DECL_WITH_VIS_CHECK): Ditto.
(VAR_OR_FUNCTION_DECL_P): Ditto
(struct tree_decl_minimal): New structure.
(struct tree_decl_common): Ditto.
(struct tree_decl_with_rtl): Ditto.
(struct tree_decl_with_vis): Ditto.
(struct tree_decl_non_common): Ditto.
(struct tree_field_decl): Ditto.
(struct tree_parm_decl): Ditto.
(struct tree_var_decl): Ditto.
(struct tree_function_decl): Ditto.
(struct tree_const_decl): Ditto.
(struct tree_result_decl): Ditto.
(union tree_node): Add new structures.
* var-tracking.c (track_expr_p): Reverse order of tests.
* doc/c-tree.texi: Add documentation on DECL node internal structure.
2005-07-08 Daniel Berlin <dberlin@dberlin.org>
* utils.c (create_param_decl): DECL_ARG_TYPE_AS_WRITTEN is
removed.
2005-07-08 Daniel Berlin <dberlin@dberlin.org>
* Make-lang.in: Add gt-cp-lang.h.
(cp-lang.o): Ditto.
* class.c (create_vtable_ptr): Stop setting DECL_ASSEMBLER_NAME on
the field.
* config-lang.in: Add cp-lang.c to gtfiles.
* cp-lang.c: Include hashtab.h.
(cp_init_ts): New function.
(LANG_HOOK_INIT_TS): Use macro.
(decl_shadowed_for_var_lookup): New function.
(decl_shadowed_for_var_insert): Ditto.
* cp-tree.h (THUNK_FUNCTION_CHECK): Use decl_common.
(NON_THUNK_FUNCTION_CHECK): Ditto.
(DECL_NAMESPACE_ASSOCIATIONS): Use decl_non_common.
(DECL_INIT_PRIORITY): Ditto.
(DECL_HAS_SHADOWED_FOR_VAR_P): Ditto.
(DECL_SHADOWED_FOR_VAR): Use hashtable.
(SET_DECL_SHADOWED_FOR_VAR): Ditto.
* decl.c (duplicate_decls): Update for new/updated structures.
(poplevel): Use SET_DECL_SHADOWED_FOR_VAR.
* decl2.c (start_static_initialization_or_destruction): Deal with
priority.
* pt.c (tsubst_decl): Check TS_DECL_WRTL before doing
SET_DECL_RTL.
* tree.c (handle_init_priority_attribute): Handle priority.
2005-07-08 Daniel Berlin <dberlin@dberlin.org>
* objc-act.c (objc_push_parm): DECL_ARG_TYPE_AS_WRITTEN is
removed.
* objc-act.h (KEYWORD_ARG_NAME): Use decl_non_common.
(KEYWORD_KEY_NAME): Use decl_minimal.
(METHOD_SEL_NAME): Ditto..
(METHOD_SEL_ARGS): Use decl_non_common.
(METHOD_ADD_ARGS): Ditto.
(METHOD_ADD_ARGS_ELLIPSIS_P): Use decl_common.
(METHOD_DEFINITION): Ditto.
(METHOD_ENCODING): Ditto.
* objc-lang.c: (objc_init_ts): New function.
2005-07-08 Daniel Berlin <dberlin@dberlin.org>
* trans-decl.c (create_function_arglist): DECL_ARG_TYPE_AS_WRITTEN
is removed.
From-SVN: r101799
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 237 |
1 files changed, 214 insertions, 23 deletions
@@ -133,12 +133,6 @@ static GTY ((if_marked ("ggc_marked_p"), param_is (union tree_node))) /* General tree->tree mapping structure for use in hash tables. */ -struct tree_map GTY(()) -{ - hashval_t hash; - tree from; - tree to; -}; static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) htab_t debug_expr_for_decl; @@ -146,11 +140,20 @@ static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) htab_t value_expr_for_decl; +static GTY ((if_marked ("tree_int_map_marked_p"), param_is (struct tree_int_map))) + htab_t init_priority_for_decl; + +struct tree_int_map GTY(()) +{ + tree from; + unsigned short to; +}; +static unsigned int tree_int_map_hash (const void *); +static int tree_int_map_eq (const void *, const void *); +static int tree_int_map_marked_p (const void *); static void set_type_quals (tree, int); static int type_hash_eq (const void *, const void *); static hashval_t type_hash_hash (const void *); -static int tree_map_eq (const void *, const void *); -static hashval_t tree_map_hash (const void *); static hashval_t int_cst_hash_hash (const void *); static int int_cst_hash_eq (const void *, const void *); static void print_type_hash_statistics (void); @@ -158,19 +161,20 @@ static void print_debug_expr_statistics (void); static void print_value_expr_statistics (void); static tree make_vector_type (tree, int, enum machine_mode); static int type_hash_marked_p (const void *); -static int tree_map_marked_p (const void *); static unsigned int type_hash_list (tree, hashval_t); static unsigned int attribute_hash_list (tree, hashval_t); tree global_trees[TI_MAX]; tree integer_types[itk_none]; +unsigned char tree_contains_struct[256][64]; /* Init tree.c. */ void init_ttree (void) { + /* Initialize the hash table of types. */ type_hash_table = htab_create_ggc (TYPE_HASH_INITIAL_SIZE, type_hash_hash, type_hash_eq, 0); @@ -180,12 +184,62 @@ init_ttree (void) value_expr_for_decl = htab_create_ggc (512, tree_map_hash, tree_map_eq, 0); + init_priority_for_decl = htab_create_ggc (512, tree_int_map_hash, + tree_int_map_eq, 0); int_cst_hash_table = htab_create_ggc (1024, int_cst_hash_hash, int_cst_hash_eq, NULL); int_cst_node = make_node (INTEGER_CST); + tree_contains_struct[FUNCTION_DECL][TS_DECL_NON_COMMON] = 1; + tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_NON_COMMON] = 1; + tree_contains_struct[TYPE_DECL][TS_DECL_NON_COMMON] = 1; + + + tree_contains_struct[CONST_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[VAR_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[PARM_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[RESULT_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[FUNCTION_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[TYPE_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[LABEL_DECL][TS_DECL_COMMON] = 1; + tree_contains_struct[FIELD_DECL][TS_DECL_COMMON] = 1; + + + tree_contains_struct[CONST_DECL][TS_DECL_WRTL] = 1; + tree_contains_struct[VAR_DECL][TS_DECL_WRTL] = 1; + tree_contains_struct[PARM_DECL][TS_DECL_WRTL] = 1; + tree_contains_struct[RESULT_DECL][TS_DECL_WRTL] = 1; + tree_contains_struct[FUNCTION_DECL][TS_DECL_WRTL] = 1; + tree_contains_struct[LABEL_DECL][TS_DECL_WRTL] = 1; + + tree_contains_struct[CONST_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[VAR_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[PARM_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[RESULT_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[FUNCTION_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[TYPE_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[LABEL_DECL][TS_DECL_MINIMAL] = 1; + tree_contains_struct[FIELD_DECL][TS_DECL_MINIMAL] = 1; + + tree_contains_struct[VAR_DECL][TS_DECL_WITH_VIS] = 1; + tree_contains_struct[FUNCTION_DECL][TS_DECL_WITH_VIS] = 1; + tree_contains_struct[TYPE_DECL][TS_DECL_WITH_VIS] = 1; + tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_WITH_VIS] = 1; + + tree_contains_struct[VAR_DECL][TS_VAR_DECL] = 1; + tree_contains_struct[FIELD_DECL][TS_FIELD_DECL] = 1; + tree_contains_struct[PARM_DECL][TS_PARM_DECL] = 1; + tree_contains_struct[LABEL_DECL][TS_LABEL_DECL] = 1; + tree_contains_struct[RESULT_DECL][TS_RESULT_DECL] = 1; + tree_contains_struct[CONST_DECL][TS_CONST_DECL] = 1; + tree_contains_struct[TYPE_DECL][TS_TYPE_DECL] = 1; + tree_contains_struct[FUNCTION_DECL][TS_FUNCTION_DECL] = 1; + + lang_hooks.init_ts (); } @@ -197,7 +251,7 @@ decl_assembler_name (tree decl) { if (!DECL_ASSEMBLER_NAME_SET_P (decl)) lang_hooks.set_decl_assembler_name (decl); - return DECL_CHECK (decl)->decl.assembler_name; + return DECL_WITH_VIS_CHECK (decl)->decl_with_vis.assembler_name; } /* Compute the number of bytes occupied by a tree with code CODE. @@ -209,7 +263,29 @@ tree_code_size (enum tree_code code) switch (TREE_CODE_CLASS (code)) { case tcc_declaration: /* A decl node */ - return sizeof (struct tree_decl); + { + switch (code) + { + case FIELD_DECL: + return sizeof (struct tree_field_decl); + case PARM_DECL: + return sizeof (struct tree_parm_decl); + case VAR_DECL: + return sizeof (struct tree_var_decl); + case LABEL_DECL: + return sizeof (struct tree_label_decl); + case RESULT_DECL: + return sizeof (struct tree_result_decl); + case CONST_DECL: + return sizeof (struct tree_const_decl); + case TYPE_DECL: + return sizeof (struct tree_type_decl); + case FUNCTION_DECL: + return sizeof (struct tree_function_decl); + default: + return sizeof (struct tree_decl_non_common); + } + } case tcc_type: /* a type node */ return sizeof (struct tree_type); @@ -395,12 +471,13 @@ make_node_stat (enum tree_code code MEM_STAT_DECL) if (code != FUNCTION_DECL) DECL_ALIGN (t) = 1; DECL_USER_ALIGN (t) = 0; - DECL_IN_SYSTEM_HEADER (t) = in_system_header; + if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) + DECL_IN_SYSTEM_HEADER (t) = in_system_header; + /* We have not yet computed the alias set for this declaration. */ + DECL_POINTER_ALIAS_SET (t) = -1; DECL_SOURCE_LOCATION (t) = input_location; DECL_UID (t) = next_decl_uid++; - /* We have not yet computed the alias set for this declaration. */ - DECL_POINTER_ALIAS_SET (t) = -1; break; case tcc_type: @@ -480,6 +557,11 @@ copy_node_stat (tree node MEM_STAT_DECL) SET_DECL_VALUE_EXPR (t, DECL_VALUE_EXPR (node)); DECL_HAS_VALUE_EXPR_P (t) = 1; } + if (TREE_CODE (node) == VAR_DECL && DECL_HAS_INIT_PRIORITY_P (node)) + { + SET_DECL_INIT_PRIORITY (t, DECL_INIT_PRIORITY (node)); + DECL_HAS_INIT_PRIORITY_P (t) = 1; + } } else if (TREE_CODE_CLASS (code) == tcc_type) @@ -1814,9 +1896,31 @@ tree_node_structure (tree t) enum tree_code code = TREE_CODE (t); switch (TREE_CODE_CLASS (code)) - { + { case tcc_declaration: - return TS_DECL; + { + switch (code) + { + case FIELD_DECL: + return TS_FIELD_DECL; + case PARM_DECL: + return TS_PARM_DECL; + case VAR_DECL: + return TS_VAR_DECL; + case LABEL_DECL: + return TS_LABEL_DECL; + case RESULT_DECL: + return TS_RESULT_DECL; + case CONST_DECL: + return TS_CONST_DECL; + case TYPE_DECL: + return TS_TYPE_DECL; + case FUNCTION_DECL: + return TS_FUNCTION_DECL; + default: + return TS_DECL_NON_COMMON; + } + } case tcc_type: return TS_TYPE; case tcc_reference: @@ -2877,10 +2981,13 @@ build_decl_stat (enum tree_code code, tree name, tree type MEM_STAT_DECL) else if (code == FUNCTION_DECL) DECL_MODE (t) = FUNCTION_MODE; - /* Set default visibility to whatever the user supplied with - visibility_specified depending on #pragma GCC visibility. */ - DECL_VISIBILITY (t) = default_visibility; - DECL_VISIBILITY_SPECIFIED (t) = visibility_options.inpragma; + if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)) + { + /* Set default visibility to whatever the user supplied with + visibility_specified depending on #pragma GCC visibility. */ + DECL_VISIBILITY (t) = default_visibility; + DECL_VISIBILITY_SPECIFIED (t) = visibility_options.inpragma; + } return t; } @@ -3513,7 +3620,7 @@ build_variant_type_copy (tree type) /* Return true if the from tree in both tree maps are equal. */ -static int +int tree_map_eq (const void *va, const void *vb) { const struct tree_map *a = va, *b = vb; @@ -3522,7 +3629,7 @@ tree_map_eq (const void *va, const void *vb) /* Hash a from tree in a tree_map. */ -static hashval_t +unsigned int tree_map_hash (const void *item) { return (((const struct tree_map *) item)->hash); @@ -3532,7 +3639,7 @@ tree_map_hash (const void *item) purposes. We simply return true if the from tree is marked, so that this structure goes away when the from tree goes away. */ -static int +int tree_map_marked_p (const void *p) { tree from = ((struct tree_map *) p)->from; @@ -3540,6 +3647,65 @@ tree_map_marked_p (const void *p) return ggc_marked_p (from); } +/* Return true if the trees in the tree_int_map *'s VA and VB are equal. */ + +static int +tree_int_map_eq (const void *va, const void *vb) +{ + const struct tree_int_map *a = va, *b = vb; + return (a->from == b->from); +} + +/* Hash a from tree in the tree_int_map * ITEM. */ + +static unsigned int +tree_int_map_hash (const void *item) +{ + return htab_hash_pointer (((const struct tree_int_map *)item)->from); +} + +/* Return true if this tree int map structure is marked for garbage collection + purposes. We simply return true if the from tree_int_map *P's from tree is marked, so that this + structure goes away when the from tree goes away. */ + +static int +tree_int_map_marked_p (const void *p) +{ + tree from = ((struct tree_int_map *) p)->from; + + return ggc_marked_p (from); +} +/* Lookup an init priority for FROM, and return it if we find one. */ + +unsigned short +decl_init_priority_lookup (tree from) +{ + struct tree_int_map *h, in; + in.from = from; + + h = htab_find_with_hash (init_priority_for_decl, + &in, htab_hash_pointer (from)); + if (h) + return h->to; + return 0; +} + +/* Insert a mapping FROM->TO in the init priority hashtable. */ + +void +decl_init_priority_insert (tree from, unsigned short to) +{ + struct tree_int_map *h; + void **loc; + + h = ggc_alloc (sizeof (struct tree_int_map)); + h->from = from; + h->to = to; + loc = htab_find_slot_with_hash (init_priority_for_decl, h, + htab_hash_pointer (from), INSERT); + *(struct tree_int_map **) loc = h; +} + /* Print out the statistics for the DECL_DEBUG_EXPR hash table. */ static void @@ -5664,6 +5830,31 @@ tree_class_check_failed (const tree node, const enum tree_code_class cl, TREE_CODE_CLASS_STRING (TREE_CODE_CLASS (TREE_CODE (node))), tree_code_name[TREE_CODE (node)], function, trim_filename (file), line); } +#undef DEFTREESTRUCT +#define DEFTREESTRUCT(VAL, NAME) NAME, + +static const char *ts_enum_names[] = { +#include "treestruct.def" +}; +#undef DEFTREESTRUCT + +#define TS_ENUM_NAME(EN) (ts_enum_names[(EN)]) + +/* Similar to tree_class_check_failed, except that we check for + whether CODE contains the tree structure identified by EN. */ + +void +tree_contains_struct_check_failed (const tree node, + const enum tree_node_structure_enum en, + const char *file, int line, + const char *function) +{ + internal_error + ("tree check: expected tree that contains %qs structure, have %qs in %s, at %s:%d", + TS_ENUM_NAME(en), + tree_code_name[TREE_CODE (node)], function, trim_filename (file), line); +} + /* Similar to above, except that the check is for the bounds of a TREE_VEC's (dynamically sized) vector. */ |