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.

Change-Id: Idfb6b67c2cb6f3d00be5ac48492e55e4d8995cc3
Reviewed-on: https://go-review.googlesource.com/c/158018
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/go/runtime/ffi.go b/libgo/go/runtime/ffi.go
index 00858f1..e8088ec 100644
--- a/libgo/go/runtime/ffi.go
+++ b/libgo/go/runtime/ffi.go
@@ -227,6 +227,7 @@
 
 	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 @@
 		// next field.
 		if v.typ.size == 0 {
 			checkPad = true
+			lastzero = true
 			continue
 		}
+		lastzero = false
 
 		if checkPad {
 			off := uintptr(0)
@@ -257,6 +260,13 @@
 		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{