runtime: add padding to FFI type of struct ending with zero-sized field
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 15 Jan 2019 23:21:24 +0000 (23:21 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 15 Jan 2019 23:21:24 +0000 (23:21 +0000)
    CL 157557 changes the compiler to add one byte padding to
    non-empty struct ending with a zero-sized field. Add the same
    padding to the FFI type, so reflect.Call works.

    This fixes test/fixedbugs/issue26335.go in the main repo.

    Reviewed-on: https://go-review.googlesource.com/c/158018

From-SVN: r267956

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

index 4d76c547bdce5955a19a34a8d8d81ec20f2efa73..b13915110b9685135adfcf2d0601e82c4946b05f 100644 (file)
@@ -1,4 +1,4 @@
-87005025fcd0d7e7908b3aae7062b52cb80eb0f3
+9a79c333e896ea49f6a708d459148074d29a2af6
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 00858f19ab43e89b2f39a70661a8cfc7e02e5206..e8088ec394723de24bdb8d9bf0c63b495e22297a 100644 (file)
@@ -227,6 +227,7 @@ func structToFFI(typ *structtype) *__ffi_type {
 
        fields := make([]*__ffi_type, 0, c+1)
        checkPad := false
+       lastzero := false
        for i, v := range typ.fields {
                // Skip zero-sized fields; they confuse libffi,
                // and there is no value to pass in any case.
@@ -235,8 +236,10 @@ func structToFFI(typ *structtype) *__ffi_type {
                // next field.
                if v.typ.size == 0 {
                        checkPad = true
+                       lastzero = true
                        continue
                }
+               lastzero = false
 
                if checkPad {
                        off := uintptr(0)
@@ -257,6 +260,13 @@ func structToFFI(typ *structtype) *__ffi_type {
                fields = append(fields, typeToFFI(v.typ))
        }
 
+       if lastzero {
+               // The compiler adds one byte padding to non-empty struct ending
+               // with a zero-sized field (types.cc:get_backend_struct_fields).
+               // Add this padding to the FFI type.
+               fields = append(fields, ffi_type_uint8())
+       }
+
        fields = append(fields, nil)
 
        return &__ffi_type{