From b34417a407f5f98338c532295860f07d99a3c38a Mon Sep 17 00:00:00 2001 From: Ziemowit Laski Date: Wed, 11 Feb 2004 01:55:29 +0000 Subject: [PATCH] c-common.c (vector_size_helper): Remove; call reconstruct_complex_type() instead. 2004-02-10 Ziemowit Laski * c-common.c (vector_size_helper): Remove; call reconstruct_complex_type() instead. * tree.c (reconstruct_complex_type): New function (formerly vector_size_helper() in c-common.c). (make_vector): Make externally visible. * tree.h (reconstruct_complex_type, make_vector): Add prototypes. From-SVN: r77632 --- gcc/ChangeLog | 9 +++++++++ gcc/c-common.c | 49 +------------------------------------------------ gcc/tree.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- gcc/tree.h | 2 ++ 4 files changed, 59 insertions(+), 50 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bafbbb63a80..90cad633531 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2004-02-10 Ziemowit Laski + + * c-common.c (vector_size_helper): Remove; call + reconstruct_complex_type() instead. + * tree.c (reconstruct_complex_type): New function + (formerly vector_size_helper() in c-common.c). + (make_vector): Make externally visible. + * tree.h (reconstruct_complex_type, make_vector): Add prototypes. + 2004-02-10 Kazu Hirata * config/h8300/h8300-protos.h: Add a prototype for diff --git a/gcc/c-common.c b/gcc/c-common.c index e8370d519ee..184f26e8924 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -784,7 +784,6 @@ static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *); static tree handle_cleanup_attribute (tree *, tree, tree, int, bool *); static tree handle_warn_unused_result_attribute (tree *, tree, tree, int, bool *); -static tree vector_size_helper (tree, tree); static void check_function_nonnull (tree, tree); static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT); @@ -5246,57 +5245,11 @@ handle_vector_size_attribute (tree *node, tree name, tree args, } /* Build back pointers if needed. */ - *node = vector_size_helper (*node, new_type); + *node = reconstruct_complex_type (*node, new_type); return NULL_TREE; } -/* HACK. GROSS. This is absolutely disgusting. I wish there was a - better way. - - If we requested a pointer to a vector, build up the pointers that - we stripped off while looking for the inner type. Similarly for - return values from functions. - - The argument "type" is the top of the chain, and "bottom" is the - new type which we will point to. */ - -static tree -vector_size_helper (tree type, tree bottom) -{ - tree inner, outer; - - if (POINTER_TYPE_P (type)) - { - inner = vector_size_helper (TREE_TYPE (type), bottom); - outer = build_pointer_type (inner); - } - else if (TREE_CODE (type) == ARRAY_TYPE) - { - inner = vector_size_helper (TREE_TYPE (type), bottom); - outer = build_array_type (inner, TYPE_DOMAIN (type)); - } - else if (TREE_CODE (type) == FUNCTION_TYPE) - { - inner = vector_size_helper (TREE_TYPE (type), bottom); - outer = build_function_type (inner, TYPE_ARG_TYPES (type)); - } - else if (TREE_CODE (type) == METHOD_TYPE) - { - inner = vector_size_helper (TREE_TYPE (type), bottom); - outer = build_method_type_directly (TYPE_METHOD_BASETYPE (type), - inner, - TYPE_ARG_TYPES (type)); - } - else - return bottom; - - TREE_READONLY (outer) = TREE_READONLY (type); - TREE_THIS_VOLATILE (outer) = TREE_THIS_VOLATILE (type); - - return outer; -} - /* Handle the "nonnull" attribute. */ static tree handle_nonnull_attribute (tree *node, tree name ATTRIBUTE_UNUSED, diff --git a/gcc/tree.c b/gcc/tree.c index 12eabd9361d..c02b1004b91 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -106,7 +106,6 @@ static int type_hash_eq (const void *, const void *); static hashval_t type_hash_hash (const void *); static void print_type_hash_statistics (void); static void finish_vector_type (tree); -static tree make_vector (enum machine_mode, tree, int); static int type_hash_marked_p (const void *); tree global_trees[TI_MAX]; @@ -5030,10 +5029,56 @@ build_common_tree_nodes_2 (int short_double) V4DF_type_node = make_vector (V4DFmode, double_type_node, 0); } +/* HACK. GROSS. This is absolutely disgusting. I wish there was a + better way. + + If we requested a pointer to a vector, build up the pointers that + we stripped off while looking for the inner type. Similarly for + return values from functions. + + The argument TYPE is the top of the chain, and BOTTOM is the + new type which we will point to. */ + +tree +reconstruct_complex_type (tree type, tree bottom) +{ + tree inner, outer; + + if (POINTER_TYPE_P (type)) + { + inner = reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_pointer_type (inner); + } + else if (TREE_CODE (type) == ARRAY_TYPE) + { + inner = reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_array_type (inner, TYPE_DOMAIN (type)); + } + else if (TREE_CODE (type) == FUNCTION_TYPE) + { + inner = reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_function_type (inner, TYPE_ARG_TYPES (type)); + } + else if (TREE_CODE (type) == METHOD_TYPE) + { + inner = reconstruct_complex_type (TREE_TYPE (type), bottom); + outer = build_method_type_directly (TYPE_METHOD_BASETYPE (type), + inner, + TYPE_ARG_TYPES (type)); + } + else + return bottom; + + TREE_READONLY (outer) = TREE_READONLY (type); + TREE_THIS_VOLATILE (outer) = TREE_THIS_VOLATILE (type); + + return outer; +} + /* Returns a vector tree node given a vector mode, the inner type, and the signness. */ -static tree +tree make_vector (enum machine_mode mode, tree innertype, int unsignedp) { tree t; diff --git a/gcc/tree.h b/gcc/tree.h index 6f19cab177a..d8bbb86bac5 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2852,6 +2852,8 @@ extern void dump_tree_statistics (void); extern void expand_function_end (void); extern void expand_function_start (tree, int); extern void expand_pending_sizes (tree); +extern tree make_vector (enum machine_mode, tree, int); +extern tree reconstruct_complex_type (tree, tree); extern int real_onep (tree); extern int real_twop (tree);