This patch from Chris Manghane uses the backend interface to call the runtime error function. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r 4108b7cd8ca9 go/expressions.cc --- a/go/expressions.cc Mon Dec 16 11:55:05 2013 -0800 +++ b/go/expressions.cc Tue Dec 17 12:25:44 2013 -0800 @@ -4305,8 +4305,9 @@ 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 @@ // __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 @@ 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 @@ : (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 @@ 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 @@ 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 -r 4108b7cd8ca9 go/gogo-tree.cc --- a/go/gogo-tree.cc Mon Dec 16 11:55:05 2013 -0800 +++ b/go/gogo-tree.cc Tue Dec 17 12:25:44 2013 -0800 @@ -2252,30 +2252,6 @@ 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 -r 4108b7cd8ca9 go/gogo.cc --- a/go/gogo.cc Mon Dec 16 11:55:05 2013 -0800 +++ b/go/gogo.cc Tue Dec 17 12:25:44 2013 -0800 @@ -3060,6 +3060,19 @@ 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 -r 4108b7cd8ca9 go/gogo.h --- a/go/gogo.h Mon Dec 16 11:55:05 2013 -0800 +++ b/go/gogo.h Tue Dec 17 12:25:44 2013 -0800 @@ -576,7 +576,7 @@ 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.