Commit 5aac5cb2 by Ian Lance Taylor

compiler: Use backend interface for runtime errors.

From-SVN: r206067
parent bd925c50
...@@ -4305,8 +4305,9 @@ Unary_expression::do_get_tree(Translate_context* context) ...@@ -4305,8 +4305,9 @@ Unary_expression::do_get_tree(Translate_context* context)
expr, expr,
fold_convert(TREE_TYPE(expr), fold_convert(TREE_TYPE(expr),
null_pointer_node)); null_pointer_node));
tree crash = gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, Expression* crash_expr =
loc); gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc);
tree crash = crash_expr->get_tree(context);
expr = fold_build2_loc(loc.gcc_location(), COMPOUND_EXPR, expr = fold_build2_loc(loc.gcc_location(), COMPOUND_EXPR,
TREE_TYPE(expr), build3(COND_EXPR, TREE_TYPE(expr), build3(COND_EXPR,
void_type_node, void_type_node,
...@@ -6183,9 +6184,9 @@ Binary_expression::do_get_tree(Translate_context* context) ...@@ -6183,9 +6184,9 @@ Binary_expression::do_get_tree(Translate_context* context)
// __go_runtime_error(RUNTIME_ERROR_DIVISION_BY_ZERO), 0 // __go_runtime_error(RUNTIME_ERROR_DIVISION_BY_ZERO), 0
int errcode = RUNTIME_ERROR_DIVISION_BY_ZERO; int errcode = RUNTIME_ERROR_DIVISION_BY_ZERO;
Expression* crash = gogo->runtime_error(errcode, this->location());
tree panic = fold_build2_loc(gccloc, COMPOUND_EXPR, TREE_TYPE(ret), tree panic = fold_build2_loc(gccloc, COMPOUND_EXPR, TREE_TYPE(ret),
gogo->runtime_error(errcode, crash->get_tree(context),
this->location()),
fold_convert_loc(gccloc, TREE_TYPE(ret), fold_convert_loc(gccloc, TREE_TYPE(ret),
integer_zero_node)); integer_zero_node));
...@@ -6975,8 +6976,9 @@ Bound_method_expression::do_get_tree(Translate_context* context) ...@@ -6975,8 +6976,9 @@ Bound_method_expression::do_get_tree(Translate_context* context)
if (nil_check != NULL) if (nil_check != NULL)
{ {
tree nil_check_tree = nil_check->get_tree(context); tree nil_check_tree = nil_check->get_tree(context);
tree crash = Expression* crash_expr =
context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc); context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc);
tree crash = crash_expr->get_tree(context);
if (ret_tree == error_mark_node if (ret_tree == error_mark_node
|| nil_check_tree == error_mark_node || nil_check_tree == error_mark_node
|| crash == error_mark_node) || crash == error_mark_node)
...@@ -10715,7 +10717,7 @@ Array_index_expression::do_get_tree(Translate_context* context) ...@@ -10715,7 +10717,7 @@ Array_index_expression::do_get_tree(Translate_context* context)
: (this->end_ == NULL : (this->end_ == NULL
? RUNTIME_ERROR_SLICE_INDEX_OUT_OF_BOUNDS ? RUNTIME_ERROR_SLICE_INDEX_OUT_OF_BOUNDS
: RUNTIME_ERROR_SLICE_SLICE_OUT_OF_BOUNDS)); : RUNTIME_ERROR_SLICE_SLICE_OUT_OF_BOUNDS));
tree crash = gogo->runtime_error(code, loc); tree crash = gogo->runtime_error(code, loc)->get_tree(context);
if (this->end_ == NULL) if (this->end_ == NULL)
{ {
...@@ -11089,7 +11091,7 @@ String_index_expression::do_get_tree(Translate_context* context) ...@@ -11089,7 +11091,7 @@ String_index_expression::do_get_tree(Translate_context* context)
int code = (this->end_ == NULL int code = (this->end_ == NULL
? RUNTIME_ERROR_STRING_INDEX_OUT_OF_BOUNDS ? RUNTIME_ERROR_STRING_INDEX_OUT_OF_BOUNDS
: RUNTIME_ERROR_STRING_SLICE_OUT_OF_BOUNDS); : RUNTIME_ERROR_STRING_SLICE_OUT_OF_BOUNDS);
tree crash = context->gogo()->runtime_error(code, loc); tree crash = context->gogo()->runtime_error(code, loc)->get_tree(context);
if (this->end_ == NULL) if (this->end_ == NULL)
{ {
...@@ -11879,8 +11881,9 @@ Interface_field_reference_expression::do_get_tree(Translate_context* context) ...@@ -11879,8 +11881,9 @@ Interface_field_reference_expression::do_get_tree(Translate_context* context)
this->expr_, this->expr_,
Expression::make_nil(loc), Expression::make_nil(loc),
loc); loc);
tree crash = context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, Expression* crash_expr =
loc); context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc);
tree crash = crash_expr->get_tree(context);
if (closure_tree == error_mark_node if (closure_tree == error_mark_node
|| nil_check_tree == error_mark_node || nil_check_tree == error_mark_node
|| crash == error_mark_node) || crash == error_mark_node)
......
...@@ -2252,30 +2252,6 @@ Gogo::call_builtin(tree* pdecl, Location location, const char* name, ...@@ -2252,30 +2252,6 @@ Gogo::call_builtin(tree* pdecl, Location location, const char* name,
return ret; return ret;
} }
// Build a call to the runtime error function.
tree
Gogo::runtime_error(int code, Location location)
{
Type* int32_type = Type::lookup_integer_type("int32");
tree int32_type_tree = type_to_tree(int32_type->get_backend(this));
static tree runtime_error_fndecl;
tree ret = Gogo::call_builtin(&runtime_error_fndecl,
location,
"__go_runtime_error",
1,
void_type_node,
int32_type_tree,
build_int_cst(int32_type_tree, code));
if (ret == error_mark_node)
return error_mark_node;
// The runtime error function panics and does not return.
TREE_NOTHROW(runtime_error_fndecl) = 0;
TREE_THIS_VOLATILE(runtime_error_fndecl) = 1;
return ret;
}
// Return a tree for receiving a value of type TYPE_TREE on CHANNEL. // Return a tree for receiving a value of type TYPE_TREE on CHANNEL.
// TYPE_DESCRIPTOR_TREE is the channel's type descriptor. This does a // TYPE_DESCRIPTOR_TREE is the channel's type descriptor. This does a
// blocking receive and returns the value read from the channel. // blocking receive and returns the value read from the channel.
......
...@@ -3060,6 +3060,19 @@ Gogo::build_recover_thunks() ...@@ -3060,6 +3060,19 @@ Gogo::build_recover_thunks()
this->traverse(&build_recover_thunks); this->traverse(&build_recover_thunks);
} }
// Build a call to the runtime error function.
Expression*
Gogo::runtime_error(int code, Location location)
{
Type* int32_type = Type::lookup_integer_type("int32");
mpz_t val;
mpz_init_set_ui(val, code);
Expression* code_expr = Expression::make_integer(&val, int32_type, location);
mpz_clear(val);
return Runtime::make_call(Runtime::RUNTIME_ERROR, location, 1, code_expr);
}
// Look for named types to see whether we need to create an interface // Look for named types to see whether we need to create an interface
// method table. // method table.
......
...@@ -576,7 +576,7 @@ class Gogo ...@@ -576,7 +576,7 @@ class Gogo
tree rettype, ...); tree rettype, ...);
// Build a call to the runtime error function. // Build a call to the runtime error function.
tree Expression*
runtime_error(int code, Location); runtime_error(int code, Location);
// Build a builtin struct with a list of fields. // Build a builtin struct with a list of fields.
......
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