libgo patch committed: for libffi, treat direct-iface types as pointers

Message ID CAOyqgcWCn8NENoTz8Y0oH13h+bvx06zhZAv+iS_=t5jgLMtOzg@mail.gmail.com
State New
Headers show
Series
  • libgo patch committed: for libffi, treat direct-iface types as pointers
Related show

Commit Message

Ian Lance Taylor Sept. 17, 2019, 8:26 p.m.
This libgo patch tweaks the libffi interface to treat direct-iface
types as pointers.  This only matters on systems that pass a struct
with a single pointer field differently than passing a single pointer.
I noticed it on 32-bit PPC, where the reflect package
TestDirectIfaceMethod failed.  Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu.  Bootstrapped and ran some Go tests on
sparc-sun-solaris2.11 and powerpc64-linux-gnu.  Committed to mainline.

Ian

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 275813)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-7aabaf8623cf88e2378057476a034093abbe5aab
+09ca3c1ea8a52b5d3d6c4331c59d44e0b6bfab57
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/go/runtime/ffi.go
===================================================================
--- libgo/go/runtime/ffi.go	(revision 275698)
+++ libgo/go/runtime/ffi.go	(working copy)
@@ -224,6 +224,9 @@  func structToFFI(typ *structtype) *__ffi
 	if c == 0 {
 		return emptyStructToFFI()
 	}
+	if typ.typ.kind&kindDirectIface != 0 {
+		return ffi_type_pointer()
+	}
 
 	fields := make([]*__ffi_type, 0, c+1)
 	checkPad := false
@@ -307,6 +310,9 @@  func arrayToFFI(typ *arraytype) *__ffi_t
 	if typ.len == 0 {
 		return emptyStructToFFI()
 	}
+	if typ.typ.kind&kindDirectIface != 0 {
+		return ffi_type_pointer()
+	}
 	elements := make([]*__ffi_type, typ.len+1)
 	et := typeToFFI(typ.elem)
 	for i := uintptr(0); i < typ.len; i++ {