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
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); }