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
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)
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{