c-common.c (vector_size_helper): Remove; call reconstruct_complex_type() instead.

2004-02-10  Ziemowit Laski  <zlaski@apple.com>

	* 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
This commit is contained in:
Ziemowit Laski 2004-02-11 01:55:29 +00:00 committed by Ziemowit Laski
parent 3d2dbfbb30
commit b34417a407
4 changed files with 59 additions and 50 deletions

View File

@ -1,3 +1,12 @@
2004-02-10 Ziemowit Laski <zlaski@apple.com>
* 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 <kazu@cs.umass.edu>
* config/h8300/h8300-protos.h: Add a prototype for

View File

@ -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,

View File

@ -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;

View File

@ -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);