Commit b7ec44e8 by Ian Lance Taylor

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
parent 5e95646e
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.
...@@ -227,6 +227,7 @@ func structToFFI(typ *structtype) *__ffi_type { ...@@ -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 { ...@@ -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 { ...@@ -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{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment