Commit 5b735706 by Ian Lance Taylor

Use backend types for all type conversions.

From-SVN: r173520
parent c47d0034
...@@ -909,10 +909,13 @@ Named_object::get_tree(Gogo* gogo, Named_object* function) ...@@ -909,10 +909,13 @@ Named_object::get_tree(Gogo* gogo, Named_object* function)
Type* type = named_constant->type(); Type* type = named_constant->type();
if (type != NULL && !type->is_abstract()) if (type != NULL && !type->is_abstract())
{ {
if (!type->is_error()) if (type->is_error())
expr_tree = fold_convert(type->get_tree(gogo), expr_tree);
else
expr_tree = error_mark_node; expr_tree = error_mark_node;
else
{
Btype* btype = type->get_backend(gogo);
expr_tree = fold_convert(type_to_tree(btype), expr_tree);
}
} }
if (expr_tree == error_mark_node) if (expr_tree == error_mark_node)
decl = error_mark_node; decl = error_mark_node;
...@@ -939,7 +942,7 @@ Named_object::get_tree(Gogo* gogo, Named_object* function) ...@@ -939,7 +942,7 @@ Named_object::get_tree(Gogo* gogo, Named_object* function)
case NAMED_OBJECT_TYPE: case NAMED_OBJECT_TYPE:
{ {
Named_type* named_type = this->u_.type_value; Named_type* named_type = this->u_.type_value;
tree type_tree = named_type->get_tree(gogo); tree type_tree = type_to_tree(named_type->get_backend(gogo));
if (type_tree == error_mark_node) if (type_tree == error_mark_node)
decl = error_mark_node; decl = error_mark_node;
else else
...@@ -1104,7 +1107,7 @@ Function::get_or_make_decl(Gogo* gogo, Named_object* no, tree id) ...@@ -1104,7 +1107,7 @@ Function::get_or_make_decl(Gogo* gogo, Named_object* no, tree id)
{ {
if (this->fndecl_ == NULL_TREE) if (this->fndecl_ == NULL_TREE)
{ {
tree functype = this->type_->get_tree(gogo); tree functype = type_to_tree(this->type_->get_backend(gogo));
if (functype == error_mark_node) if (functype == error_mark_node)
this->fndecl_ = error_mark_node; this->fndecl_ = error_mark_node;
else else
...@@ -1217,7 +1220,7 @@ Function_declaration::get_or_make_decl(Gogo* gogo, Named_object* no, tree id) ...@@ -1217,7 +1220,7 @@ Function_declaration::get_or_make_decl(Gogo* gogo, Named_object* no, tree id)
} }
} }
tree functype = this->fntype_->get_tree(gogo); tree functype = type_to_tree(this->fntype_->get_backend(gogo));
tree decl; tree decl;
if (functype == error_mark_node) if (functype == error_mark_node)
decl = error_mark_node; decl = error_mark_node;
...@@ -1424,7 +1427,7 @@ Function::build_tree(Gogo* gogo, Named_object* named_function) ...@@ -1424,7 +1427,7 @@ Function::build_tree(Gogo* gogo, Named_object* named_function)
else else
{ {
source_location loc = (*p)->location(); source_location loc = (*p)->location();
tree type_tree = type->get_tree(gogo); tree type_tree = type_to_tree(type->get_backend(gogo));
tree space = gogo->allocate_memory(type, tree space = gogo->allocate_memory(type,
TYPE_SIZE_UNIT(type_tree), TYPE_SIZE_UNIT(type_tree),
loc); loc);
...@@ -1712,7 +1715,7 @@ go_type_for_size(unsigned int bits, int unsignedp) ...@@ -1712,7 +1715,7 @@ go_type_for_size(unsigned int bits, int unsignedp)
return NULL_TREE; return NULL_TREE;
} }
Type* type = Type::lookup_integer_type(name); Type* type = Type::lookup_integer_type(name);
return type->get_tree(go_get_gogo()); return type_to_tree(type->get_backend(go_get_gogo()));
} }
// Return the type to use for a mode. // Return the type to use for a mode.
...@@ -1743,7 +1746,7 @@ go_type_for_mode(enum machine_mode mode, int unsignedp) ...@@ -1743,7 +1746,7 @@ go_type_for_mode(enum machine_mode mode, int unsignedp)
return long_double_type_node; return long_double_type_node;
return NULL_TREE; return NULL_TREE;
} }
return type->get_tree(go_get_gogo()); return type_to_tree(type->get_backend(go_get_gogo()));
} }
else if (mc == MODE_COMPLEX_FLOAT) else if (mc == MODE_COMPLEX_FLOAT)
{ {
...@@ -1763,7 +1766,7 @@ go_type_for_mode(enum machine_mode mode, int unsignedp) ...@@ -1763,7 +1766,7 @@ go_type_for_mode(enum machine_mode mode, int unsignedp)
return complex_long_double_type_node; return complex_long_double_type_node;
return NULL_TREE; return NULL_TREE;
} }
return type->get_tree(go_get_gogo()); return type_to_tree(type->get_backend(go_get_gogo()));
} }
else else
return NULL_TREE; return NULL_TREE;
...@@ -1887,7 +1890,7 @@ Gogo::string_constant_tree(const std::string& val) ...@@ -1887,7 +1890,7 @@ Gogo::string_constant_tree(const std::string& val)
tree tree
Gogo::go_string_constant_tree(const std::string& val) Gogo::go_string_constant_tree(const std::string& val)
{ {
tree string_type = Type::make_string_type()->get_tree(this); tree string_type = type_to_tree(Type::make_string_type()->get_backend(this));
VEC(constructor_elt, gc)* init = VEC_alloc(constructor_elt, gc, 2); VEC(constructor_elt, gc)* init = VEC_alloc(constructor_elt, gc, 2);
...@@ -2016,13 +2019,15 @@ Gogo::map_descriptor(Map_type* maptype) ...@@ -2016,13 +2019,15 @@ Gogo::map_descriptor(Map_type* maptype)
tree map_entry_type = make_node(RECORD_TYPE); tree map_entry_type = make_node(RECORD_TYPE);
Btype* bkey_type = keytype->get_backend(this);
Btype* bval_type = valtype->get_backend(this);
map_entry_type = Gogo::builtin_struct(NULL, "__map", map_entry_type, 3, map_entry_type = Gogo::builtin_struct(NULL, "__map", map_entry_type, 3,
"__next", "__next",
build_pointer_type(map_entry_type), build_pointer_type(map_entry_type),
"__key", "__key",
keytype->get_tree(this), type_to_tree(bkey_type),
"__val", "__val",
valtype->get_tree(this)); type_to_tree(bval_type));
if (map_entry_type == error_mark_node) if (map_entry_type == error_mark_node)
{ {
p->second = error_mark_node; p->second = error_mark_node;
...@@ -2097,7 +2102,8 @@ tree ...@@ -2097,7 +2102,8 @@ tree
Gogo::map_descriptor_type() Gogo::map_descriptor_type()
{ {
static tree struct_type; static tree struct_type;
tree dtype = Type::make_type_descriptor_type()->get_tree(this); Type* tdt = Type::make_type_descriptor_type();
tree dtype = type_to_tree(tdt->get_backend(this));
dtype = build_qualified_type(dtype, TYPE_QUAL_CONST); dtype = build_qualified_type(dtype, TYPE_QUAL_CONST);
return Gogo::builtin_struct(&struct_type, "__go_map_descriptor", NULL_TREE, return Gogo::builtin_struct(&struct_type, "__go_map_descriptor", NULL_TREE,
4, 4,
...@@ -2238,7 +2244,8 @@ Gogo::build_type_descriptor_decl(const Type* type, Expression* initializer, ...@@ -2238,7 +2244,8 @@ Gogo::build_type_descriptor_decl(const Type* type, Expression* initializer,
decl_name = this->type_descriptor_decl_name(name->named_object(), decl_name = this->type_descriptor_decl_name(name->named_object(),
name->in_function()); name->in_function());
tree id = get_identifier_from_string(decl_name); tree id = get_identifier_from_string(decl_name);
tree descriptor_type_tree = initializer->type()->get_tree(this); Type* init_type = initializer->type();
tree descriptor_type_tree = type_to_tree(init_type->get_backend(this));
if (descriptor_type_tree == error_mark_node) if (descriptor_type_tree == error_mark_node)
{ {
*pdecl = error_mark_node; *pdecl = error_mark_node;
......
...@@ -3703,7 +3703,7 @@ Variable::get_backend_variable(Gogo* gogo, Named_object* function, ...@@ -3703,7 +3703,7 @@ Variable::get_backend_variable(Gogo* gogo, Named_object* function,
} }
std::string n = Gogo::unpack_hidden_name(name); std::string n = Gogo::unpack_hidden_name(name);
Btype* btype = tree_to_type(type->get_tree(gogo)); Btype* btype = type->get_backend(gogo);
Bvariable* bvar; Bvariable* bvar;
if (this->is_global_) if (this->is_global_)
...@@ -3753,7 +3753,7 @@ Result_variable::get_backend_variable(Gogo* gogo, Named_object* function, ...@@ -3753,7 +3753,7 @@ Result_variable::get_backend_variable(Gogo* gogo, Named_object* function,
{ {
if (this->is_in_heap()) if (this->is_in_heap())
type = Type::make_pointer_type(type); type = Type::make_pointer_type(type);
Btype* btype = tree_to_type(type->get_tree(gogo)); Btype* btype = type->get_backend(gogo);
tree fndecl = function->func_value()->get_decl(); tree fndecl = function->func_value()->get_decl();
Bfunction* bfunction = tree_to_function(fndecl); Bfunction* bfunction = tree_to_function(fndecl);
std::string n = Gogo::unpack_hidden_name(name); std::string n = Gogo::unpack_hidden_name(name);
......
...@@ -375,7 +375,7 @@ Temporary_statement::do_get_backend(Translate_context* context) ...@@ -375,7 +375,7 @@ Temporary_statement::do_get_backend(Translate_context* context)
else else
bfunction = tree_to_function(function->func_value()->get_decl()); bfunction = tree_to_function(function->func_value()->get_decl());
Btype* btype = tree_to_type(this->type()->get_tree(context->gogo())); Btype* btype = this->type()->get_backend(context->gogo());
Bexpression* binit; Bexpression* binit;
if (this->init_ == NULL) if (this->init_ == NULL)
......
...@@ -821,9 +821,9 @@ class Type ...@@ -821,9 +821,9 @@ class Type
static void static void
convert_builtin_named_types(Gogo*); convert_builtin_named_types(Gogo*);
// Return a tree representing this type. // Return the backend representation of this type.
tree Btype*
get_tree(Gogo*); get_backend(Gogo*);
// Return a tree representing a zero initialization for this type. // Return a tree representing a zero initialization for this type.
// This will be something like an INTEGER_CST or a CONSTRUCTOR. If // This will be something like an INTEGER_CST or a CONSTRUCTOR. If
...@@ -892,9 +892,8 @@ class Type ...@@ -892,9 +892,8 @@ class Type
virtual bool virtual bool
do_check_make_expression(Expression_list* args, source_location); do_check_make_expression(Expression_list* args, source_location);
virtual Btype*
virtual tree do_get_backend(Gogo*) = 0;
do_get_tree(Gogo*) = 0;
virtual tree virtual tree
do_get_init_tree(Gogo*, tree, bool) = 0; do_get_init_tree(Gogo*, tree, bool) = 0;
...@@ -1103,20 +1102,21 @@ class Type ...@@ -1103,20 +1102,21 @@ class Type
Btype* Btype*
get_btype_without_hash(Gogo*); get_btype_without_hash(Gogo*);
// A mapping from Type to tree, used to ensure that the GIMPLE // A mapping from Type to Btype*, used to ensure that the backend
// representation of identical types is identical. // representation of identical types is identical.
typedef Unordered_map_hash(const Type*, tree, Type_hash_identical, typedef Unordered_map_hash(const Type*, Btype*, Type_hash_identical,
Type_identical) Type_trees; Type_identical) Type_btypes;
static Type_trees type_trees; static Type_btypes type_btypes;
// A list of builtin named types. // A list of builtin named types.
static std::vector<Named_type*> named_builtin_types; static std::vector<Named_type*> named_builtin_types;
// The type classification. // The type classification.
Type_classification classification_; Type_classification classification_;
// The tree representation of the type, once it has been determined. // The backend representation of the type, once it has been
tree tree_; // determined.
Btype* btype_;
// The decl for the type descriptor for this type. This starts out // The decl for the type descriptor for this type. This starts out
// as NULL and is filled in as needed. // as NULL and is filled in as needed.
tree type_descriptor_decl_; tree type_descriptor_decl_;
...@@ -1331,8 +1331,8 @@ class Integer_type : public Type ...@@ -1331,8 +1331,8 @@ class Integer_type : public Type
unsigned int unsigned int
do_hash_for_method(Gogo*) const; do_hash_for_method(Gogo*) const;
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -1403,8 +1403,8 @@ class Float_type : public Type ...@@ -1403,8 +1403,8 @@ class Float_type : public Type
unsigned int unsigned int
do_hash_for_method(Gogo*) const; do_hash_for_method(Gogo*) const;
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -1471,8 +1471,8 @@ class Complex_type : public Type ...@@ -1471,8 +1471,8 @@ class Complex_type : public Type
unsigned int unsigned int
do_hash_for_method(Gogo*) const; do_hash_for_method(Gogo*) const;
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -1527,8 +1527,8 @@ class String_type : public Type ...@@ -1527,8 +1527,8 @@ class String_type : public Type
do_has_pointer() const do_has_pointer() const
{ return true; } { return true; }
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo* gogo, tree, bool); do_get_init_tree(Gogo* gogo, tree, bool);
...@@ -1643,8 +1643,8 @@ class Function_type : public Type ...@@ -1643,8 +1643,8 @@ class Function_type : public Type
unsigned int unsigned int
do_hash_for_method(Gogo*) const; do_hash_for_method(Gogo*) const;
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -1717,8 +1717,8 @@ class Pointer_type : public Type ...@@ -1717,8 +1717,8 @@ class Pointer_type : public Type
unsigned int unsigned int
do_hash_for_method(Gogo*) const; do_hash_for_method(Gogo*) const;
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -1971,8 +1971,8 @@ class Struct_type : public Type ...@@ -1971,8 +1971,8 @@ class Struct_type : public Type
unsigned int unsigned int
do_hash_for_method(Gogo*) const; do_hash_for_method(Gogo*) const;
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -2088,8 +2088,8 @@ class Array_type : public Type ...@@ -2088,8 +2088,8 @@ class Array_type : public Type
bool bool
do_check_make_expression(Expression_list*, source_location); do_check_make_expression(Expression_list*, source_location);
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -2179,8 +2179,8 @@ class Map_type : public Type ...@@ -2179,8 +2179,8 @@ class Map_type : public Type
bool bool
do_check_make_expression(Expression_list*, source_location); do_check_make_expression(Expression_list*, source_location);
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -2263,8 +2263,8 @@ class Channel_type : public Type ...@@ -2263,8 +2263,8 @@ class Channel_type : public Type
bool bool
do_check_make_expression(Expression_list*, source_location); do_check_make_expression(Expression_list*, source_location);
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo*, tree, bool); do_get_init_tree(Gogo*, tree, bool);
...@@ -2381,8 +2381,8 @@ class Interface_type : public Type ...@@ -2381,8 +2381,8 @@ class Interface_type : public Type
unsigned int unsigned int
do_hash_for_method(Gogo*) const; do_hash_for_method(Gogo*) const;
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo* gogo, tree, bool); do_get_init_tree(Gogo* gogo, tree, bool);
...@@ -2612,8 +2612,8 @@ class Named_type : public Type ...@@ -2612,8 +2612,8 @@ class Named_type : public Type
do_check_make_expression(Expression_list* args, source_location location) do_check_make_expression(Expression_list* args, source_location location)
{ return this->type_->check_make_expression(args, location); } { return this->type_->check_make_expression(args, location); }
tree Btype*
do_get_tree(Gogo*); do_get_backend(Gogo*);
tree tree
do_get_init_tree(Gogo* gogo, tree type_tree, bool is_clear) do_get_init_tree(Gogo* gogo, tree type_tree, bool is_clear)
...@@ -2756,8 +2756,8 @@ class Forward_declaration_type : public Type ...@@ -2756,8 +2756,8 @@ class Forward_declaration_type : public Type
do_check_make_expression(Expression_list* args, source_location location) do_check_make_expression(Expression_list* args, source_location location)
{ return this->base()->check_make_expression(args, location); } { return this->base()->check_make_expression(args, location); }
tree Btype*
do_get_tree(Gogo* gogo); do_get_backend(Gogo* gogo);
tree tree
do_get_init_tree(Gogo* gogo, tree type_tree, bool is_clear) do_get_init_tree(Gogo* gogo, tree type_tree, bool is_clear)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment