diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-12-17 20:27:52 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2013-12-17 20:27:52 +0000 |
commit | 5aac5cb24bdf2c868e1f22d83afaef66e2f00d8d (patch) | |
tree | 453df6b0c904bc37b113f20f51076b07e4b2c9f4 /gcc/go | |
parent | bd925c509a3e8ef65c6b459c93e2d4bc22ecaa3f (diff) | |
download | gcc-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.cc | 21 | ||||
-rw-r--r-- | gcc/go/gofrontend/gogo-tree.cc | 24 | ||||
-rw-r--r-- | gcc/go/gofrontend/gogo.cc | 13 | ||||
-rw-r--r-- | gcc/go/gofrontend/gogo.h | 2 |
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. |