aboutsummaryrefslogtreecommitdiff
path: root/gcc/go
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2013-12-17 20:27:52 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2013-12-17 20:27:52 +0000
commit5aac5cb24bdf2c868e1f22d83afaef66e2f00d8d (patch)
tree453df6b0c904bc37b113f20f51076b07e4b2c9f4 /gcc/go
parentbd925c509a3e8ef65c6b459c93e2d4bc22ecaa3f (diff)
downloadgcc-5aac5cb24bdf2c868e1f22d83afaef66e2f00d8d.zip
gcc-5aac5cb24bdf2c868e1f22d83afaef66e2f00d8d.tar.gz
gcc-5aac5cb24bdf2c868e1f22d83afaef66e2f00d8d.tar.bz2
compiler: Use backend interface for runtime errors.
From-SVN: r206067
Diffstat (limited to 'gcc/go')
-rw-r--r--gcc/go/gofrontend/expressions.cc21
-rw-r--r--gcc/go/gofrontend/gogo-tree.cc24
-rw-r--r--gcc/go/gofrontend/gogo.cc13
-rw-r--r--gcc/go/gofrontend/gogo.h2
4 files changed, 26 insertions, 34 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 81d18ca..2f1c026 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -4305,8 +4305,9 @@ Unary_expression::do_get_tree(Translate_context* context)
expr,
fold_convert(TREE_TYPE(expr),
null_pointer_node));
- tree crash = gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE,
- loc);
+ Expression* crash_expr =
+ gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc);
+ tree crash = crash_expr->get_tree(context);
expr = fold_build2_loc(loc.gcc_location(), COMPOUND_EXPR,
TREE_TYPE(expr), build3(COND_EXPR,
void_type_node,
@@ -6183,9 +6184,9 @@ Binary_expression::do_get_tree(Translate_context* context)
// __go_runtime_error(RUNTIME_ERROR_DIVISION_BY_ZERO), 0
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),
- gogo->runtime_error(errcode,
- this->location()),
+ crash->get_tree(context),
fold_convert_loc(gccloc, TREE_TYPE(ret),
integer_zero_node));
@@ -6975,8 +6976,9 @@ Bound_method_expression::do_get_tree(Translate_context* context)
if (nil_check != NULL)
{
tree nil_check_tree = nil_check->get_tree(context);
- tree crash =
+ Expression* crash_expr =
context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc);
+ tree crash = crash_expr->get_tree(context);
if (ret_tree == error_mark_node
|| nil_check_tree == error_mark_node
|| crash == error_mark_node)
@@ -10715,7 +10717,7 @@ Array_index_expression::do_get_tree(Translate_context* context)
: (this->end_ == NULL
? RUNTIME_ERROR_SLICE_INDEX_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)
{
@@ -11089,7 +11091,7 @@ String_index_expression::do_get_tree(Translate_context* context)
int code = (this->end_ == NULL
? RUNTIME_ERROR_STRING_INDEX_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)
{
@@ -11879,8 +11881,9 @@ Interface_field_reference_expression::do_get_tree(Translate_context* context)
this->expr_,
Expression::make_nil(loc),
loc);
- tree crash = context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE,
- loc);
+ Expression* crash_expr =
+ context->gogo()->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, loc);
+ tree crash = crash_expr->get_tree(context);
if (closure_tree == error_mark_node
|| nil_check_tree == error_mark_node
|| crash == error_mark_node)
diff --git a/gcc/go/gofrontend/gogo-tree.cc b/gcc/go/gofrontend/gogo-tree.cc
index fcceffb..b04e660 100644
--- a/gcc/go/gofrontend/gogo-tree.cc
+++ b/gcc/go/gofrontend/gogo-tree.cc
@@ -2252,30 +2252,6 @@ Gogo::call_builtin(tree* pdecl, Location location, const char* name,
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.
// TYPE_DESCRIPTOR_TREE is the channel's type descriptor. This does a
// blocking receive and returns the value read from the channel.
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index 045763c..e46bf9c 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -3060,6 +3060,19 @@ Gogo::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
// method table.
diff --git a/gcc/go/gofrontend/gogo.h b/gcc/go/gofrontend/gogo.h
index 31b258d..a9a5681 100644
--- a/gcc/go/gofrontend/gogo.h
+++ b/gcc/go/gofrontend/gogo.h
@@ -576,7 +576,7 @@ class Gogo
tree rettype, ...);
// Build a call to the runtime error function.
- tree
+ Expression*
runtime_error(int code, Location);
// Build a builtin struct with a list of fields.