runtime: add padding to FFI type of struct ending with zero-sized field

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
This commit is contained in:
Ian Lance Taylor 2019-01-15 23:21:24 +00:00
parent 5e95646e73
commit b7ec44e82b
2 changed files with 11 additions and 1 deletions

View File

@ -1,4 +1,4 @@
87005025fcd0d7e7908b3aae7062b52cb80eb0f3 9a79c333e896ea49f6a708d459148074d29a2af6
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.

View File

@ -227,6 +227,7 @@ func structToFFI(typ *structtype) *__ffi_type {
fields := make([]*__ffi_type, 0, c+1) fields := make([]*__ffi_type, 0, c+1)
checkPad := false checkPad := false
lastzero := false
for i, v := range typ.fields { for i, v := range typ.fields {
// Skip zero-sized fields; they confuse libffi, // Skip zero-sized fields; they confuse libffi,
// and there is no value to pass in any case. // and there is no value to pass in any case.
@ -235,8 +236,10 @@ func structToFFI(typ *structtype) *__ffi_type {
// next field. // next field.
if v.typ.size == 0 { if v.typ.size == 0 {
checkPad = true checkPad = true
lastzero = true
continue continue
} }
lastzero = false
if checkPad { if checkPad {
off := uintptr(0) off := uintptr(0)
@ -257,6 +260,13 @@ func structToFFI(typ *structtype) *__ffi_type {
fields = append(fields, typeToFFI(v.typ)) 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) fields = append(fields, nil)
return &__ffi_type{ return &__ffi_type{