diff mbox

Go patch committed: Check for possible pointers at run time

Message ID CAOyqgcV4pndHK2+L2RtyjBtjSnhqXySCXuEKGTx6MtN6SbdmLA@mail.gmail.com
State New
Headers show

Commit Message

Ian Lance Taylor July 14, 2015, 1:22 a.m. UTC
This patch by Chris Manghane changes the Go frontend to check whether
a type contains pointers at run time, rather than using two different
functions, one with possible pointers, one not.  Bootstrapped and ran
Go testsuite on x86_64-unknown-linux-gnu.  Committed to mainline.

Ian
diff mbox

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 225756)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-83191e8e2cb9f47f7c1e6bcb9997f21163292612
+2c985e4781691fea3eb4171de85265bfbc4e4997
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/gogo.cc
===================================================================
--- gcc/go/gofrontend/gogo.cc	(revision 225756)
+++ gcc/go/gofrontend/gogo.cc	(working copy)
@@ -4391,15 +4391,7 @@  Gogo::allocate_memory(Type* type, Locati
   Expression* td = Expression::make_type_descriptor(type, location);
   Expression* size =
     Expression::make_type_info(type, Expression::TYPE_INFO_SIZE);
-
-  // If this package imports unsafe, then it may play games with
-  // pointers that look like integers.  We should be able to determine
-  // whether or not to use new pointers in libgo/go-new.c.  FIXME.
-  bool use_new_pointers = this->imported_unsafe_ || type->has_pointer();
-  return Runtime::make_call((use_new_pointers
-			     ? Runtime::NEW
-			     : Runtime::NEW_NOPOINTERS),
-			    location, 2, td, size);
+  return Runtime::make_call(Runtime::NEW, location, 2, td, size);
 }
 
 // Traversal class used to check for return statements.
Index: gcc/go/gofrontend/runtime.def
===================================================================
--- gcc/go/gofrontend/runtime.def	(revision 225750)
+++ gcc/go/gofrontend/runtime.def	(working copy)
@@ -223,10 +223,6 @@  DEF_GO_RUNTIME(REGISTER_GC_ROOTS, "__go_
 // Allocate memory.
 DEF_GO_RUNTIME(NEW, "__go_new", P2(TYPE, UINTPTR), R1(POINTER))
 
-// Allocate memory which can not contain pointers.
-DEF_GO_RUNTIME(NEW_NOPOINTERS, "__go_new_nopointers", P2(TYPE, UINTPTR), R1(POINTER))
-
-
 // Start a new goroutine.
 DEF_GO_RUNTIME(GO, "__go_go", P2(FUNC_PTR, POINTER), R0())
 
Index: libgo/runtime/go-new.c
===================================================================
--- libgo/runtime/go-new.c	(revision 225752)
+++ libgo/runtime/go-new.c	(working copy)
@@ -8,19 +8,12 @@ 
 #include "runtime.h"
 #include "arch.h"
 #include "malloc.h"
+#include "go-type.h"
 
 void *
 __go_new (const struct __go_type_descriptor *td, uintptr_t size)
 {
   return runtime_mallocgc (size,
 			   (uintptr) td | TypeInfo_SingleObject,
-			   0);
-}
-
-void *
-__go_new_nopointers (const struct __go_type_descriptor *td,  uintptr_t size)
-{
-  return runtime_mallocgc (size,
-			   (uintptr) td | TypeInfo_SingleObject,
-			   FlagNoScan);
+			   td->__code & GO_NO_POINTERS ? FlagNoScan : 0);
 }