From 7e6fecf5008038b466d350a0d7676f8d8ba59ff1 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 17 Sep 2019 20:26:21 +0000 Subject: [PATCH] runtime: for FFI, treat directIface 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. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/195878 From-SVN: r275814 --- gcc/go/gofrontend/MERGE | 2 +- libgo/go/runtime/ffi.go | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 4a81caa228d..4b7a4b3073b 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -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. diff --git a/libgo/go/runtime/ffi.go b/libgo/go/runtime/ffi.go index be79224a4fb..cd8479ef551 100644 --- a/libgo/go/runtime/ffi.go +++ b/libgo/go/runtime/ffi.go @@ -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++ { -- 2.30.2