diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2019-09-17 20:26:21 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2019-09-17 20:26:21 +0000 |
commit | 7e6fecf5008038b466d350a0d7676f8d8ba59ff1 (patch) | |
tree | a3536079b339f8dd68bb024a5a888f82bee3b328 /libgo | |
parent | 033425d0ed0092748fc919e5c40dc47421dcdd89 (diff) | |
download | gcc-7e6fecf5008038b466d350a0d7676f8d8ba59ff1.zip gcc-7e6fecf5008038b466d350a0d7676f8d8ba59ff1.tar.gz gcc-7e6fecf5008038b466d350a0d7676f8d8ba59ff1.tar.bz2 |
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
Diffstat (limited to 'libgo')
-rw-r--r-- | libgo/go/runtime/ffi.go | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/libgo/go/runtime/ffi.go b/libgo/go/runtime/ffi.go index be79224..cd8479e 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++ { |