runtime: for FFI, treat directIface types as pointers
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 17 Sep 2019 20:26:21 +0000 (20:26 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 17 Sep 2019 20:26:21 +0000 (20:26 +0000)
    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.

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/195878

From-SVN: r275814

gcc/go/gofrontend/MERGE
libgo/go/runtime/ffi.go

index 4a81caa228dd00acf880ca17255c25deed5f2cbc..4b7a4b3073b45b3461d9ef1ca7428f8f29789e7c 100644 (file)
@@ -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 be79224a4fb7ff35183c62d774dc1af2e2f8f494..cd8479ef55145bee54e718483fa437a08af58507 100644 (file)
@@ -224,6 +224,9 @@ func structToFFI(typ *structtype) *__ffi_type {
        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_type {
        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++ {