aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2019-09-17 20:26:21 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2019-09-17 20:26:21 +0000
commit7e6fecf5008038b466d350a0d7676f8d8ba59ff1 (patch)
treea3536079b339f8dd68bb024a5a888f82bee3b328
parent033425d0ed0092748fc919e5c40dc47421dcdd89 (diff)
downloadgcc-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
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--libgo/go/runtime/ffi.go6
2 files changed, 7 insertions, 1 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index 4a81caa..4b7a4b3 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 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++ {