diff mbox

Go patch committed: Use backend interface for runtime errors

Message ID mcr38lri5o6.fsf@iant-glaptop.roam.corp.google.com
State New
Headers show

Commit Message

Ian Lance Taylor Dec. 17, 2013, 8:27 p.m. UTC
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 mbox

Patch

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.