[fidl] Make xunion ordinals 64 bits

Instead of 32 bits of xunion ordinal followed by 32 bits
of padding, we designate the entire 64 bits as the xunion
ordinal.

Bug: 39578

Test: fx run-test go_fidl_tests
Change-Id: I7ff024ef6da311e4067a5cad49431b9a7aff8c04
diff --git a/src/syscall/zx/fidl/bindingstest/impl.go b/src/syscall/zx/fidl/bindingstest/impl.go
index a879f3b..6b89cc0 100644
--- a/src/syscall/zx/fidl/bindingstest/impl.go
+++ b/src/syscall/zx/fidl/bindingstest/impl.go
@@ -826,7 +826,7 @@
 	return _u
 }
 
-type I_xUnion1Tag uint32
+type I_xUnion1Tag uint64
 
 const (
 	XUnion1_unknownData = 0 // 0x00000000
@@ -856,8 +856,8 @@
 	}
 }
 
-func (_m *XUnion1) Ordinal() uint32 {
-	return uint32(_m.I_xUnion1Tag)
+func (_m *XUnion1) Ordinal() uint64 {
+	return uint64(_m.I_xUnion1Tag)
 }
 
 func (_m *XUnion1) SetA(a [3]int8) {
@@ -893,7 +893,7 @@
 	return _u
 }
 
-type I_xUnionInsideXUnionTag uint32
+type I_xUnionInsideXUnionTag uint64
 
 const (
 	XUnionInsideXUnion_unknownData = 0 // 0x00000000
@@ -919,8 +919,8 @@
 	}
 }
 
-func (_m *XUnionInsideXUnion) Ordinal() uint32 {
-	return uint32(_m.I_xUnionInsideXUnionTag)
+func (_m *XUnionInsideXUnion) Ordinal() uint64 {
+	return uint64(_m.I_xUnionInsideXUnionTag)
 }
 
 func (_m *XUnionInsideXUnion) SetA(a float32) {
@@ -945,7 +945,7 @@
 	return _u
 }
 
-type I_strictXUnion1Tag uint32
+type I_strictXUnion1Tag uint64
 
 const (
 	StrictXUnion1A = 1988029217 // 0x767eeb21
@@ -964,8 +964,8 @@
 	return _m.I_strictXUnion1Tag
 }
 
-func (_m *StrictXUnion1) Ordinal() uint32 {
-	return uint32(_m.I_strictXUnion1Tag)
+func (_m *StrictXUnion1) Ordinal() uint64 {
+	return uint64(_m.I_strictXUnion1Tag)
 }
 
 func (_m *StrictXUnion1) SetA(a [3]int8) {
diff --git a/src/syscall/zx/fidl/conformance/impl.go b/src/syscall/zx/fidl/conformance/impl.go
index 8b5291b..c68df97 100644
--- a/src/syscall/zx/fidl/conformance/impl.go
+++ b/src/syscall/zx/fidl/conformance/impl.go
@@ -1935,7 +1935,7 @@
 	return _u
 }
 
-type I_xUnionWithEmptyStructTag uint32
+type I_xUnionWithEmptyStructTag uint64
 
 const (
 	XUnionWithEmptyStruct_unknownData = 0          // 0x00000000
@@ -1957,8 +1957,8 @@
 	}
 }
 
-func (_m *XUnionWithEmptyStruct) Ordinal() uint32 {
-	return uint32(_m.I_xUnionWithEmptyStructTag)
+func (_m *XUnionWithEmptyStruct) Ordinal() uint64 {
+	return uint64(_m.I_xUnionWithEmptyStructTag)
 }
 
 func (_m *XUnionWithEmptyStruct) SetS(s EmptyStruct) {
@@ -1972,7 +1972,7 @@
 	return _u
 }
 
-type I_xUnionWithStructTag uint32
+type I_xUnionWithStructTag uint64
 
 const (
 	XUnionWithStruct_unknownData = 0         // 0x00000000
@@ -1994,8 +1994,8 @@
 	}
 }
 
-func (_m *XUnionWithStruct) Ordinal() uint32 {
-	return uint32(_m.I_xUnionWithStructTag)
+func (_m *XUnionWithStruct) Ordinal() uint64 {
+	return uint64(_m.I_xUnionWithStructTag)
 }
 
 func (_m *XUnionWithStruct) SetS(s StructSize3Align1) {
@@ -2009,7 +2009,7 @@
 	return _u
 }
 
-type I_xUnionWithXUnionTag uint32
+type I_xUnionWithXUnionTag uint64
 
 const (
 	XUnionWithXUnion_unknownData = 0          // 0x00000000
@@ -2031,8 +2031,8 @@
 	}
 }
 
-func (_m *XUnionWithXUnion) Ordinal() uint32 {
-	return uint32(_m.I_xUnionWithXUnionTag)
+func (_m *XUnionWithXUnion) Ordinal() uint64 {
+	return uint64(_m.I_xUnionWithXUnionTag)
 }
 
 func (_m *XUnionWithXUnion) SetXu(xu XUnionWithStruct) {
@@ -2046,7 +2046,7 @@
 	return _u
 }
 
-type I_xUnionWithUnionsTag uint32
+type I_xUnionWithUnionsTag uint64
 
 const (
 	XUnionWithUnions_unknownData = 0          // 0x00000000
@@ -2072,8 +2072,8 @@
 	}
 }
 
-func (_m *XUnionWithUnions) Ordinal() uint32 {
-	return uint32(_m.I_xUnionWithUnionsTag)
+func (_m *XUnionWithUnions) Ordinal() uint64 {
+	return uint64(_m.I_xUnionWithUnionsTag)
 }
 
 func (_m *XUnionWithUnions) SetU1(u1 UnionSize8Align4) {
@@ -2098,7 +2098,7 @@
 	return _u
 }
 
-type I_sampleXUnionTag uint32
+type I_sampleXUnionTag uint64
 
 const (
 	SampleXUnion_unknownData = 0          // 0x00000000
@@ -2128,8 +2128,8 @@
 	}
 }
 
-func (_m *SampleXUnion) Ordinal() uint32 {
-	return uint32(_m.I_sampleXUnionTag)
+func (_m *SampleXUnion) Ordinal() uint64 {
+	return uint64(_m.I_sampleXUnionTag)
 }
 
 func (_m *SampleXUnion) SetU(u uint32) {
@@ -2165,7 +2165,7 @@
 	return _u
 }
 
-type I_sampleStrictXUnionTag uint32
+type I_sampleStrictXUnionTag uint64
 
 const (
 	SampleStrictXUnionU  = 149088882 // 0x08e2ea72
@@ -2184,8 +2184,8 @@
 	return _m.I_sampleStrictXUnionTag
 }
 
-func (_m *SampleStrictXUnion) Ordinal() uint32 {
-	return uint32(_m.I_sampleStrictXUnionTag)
+func (_m *SampleStrictXUnion) Ordinal() uint64 {
+	return uint64(_m.I_sampleStrictXUnionTag)
 }
 
 func (_m *SampleStrictXUnion) SetU(u uint32) {
diff --git a/src/syscall/zx/fidl/encoding_new.go b/src/syscall/zx/fidl/encoding_new.go
index 058c5a7..73df212 100644
--- a/src/syscall/zx/fidl/encoding_new.go
+++ b/src/syscall/zx/fidl/encoding_new.go
@@ -191,7 +191,7 @@
 		sizeOld      = marshalerBounds[0]
 		alignmentOld = marshalerBounds[1]
 		fields       []mField
-		ordinals     []int
+		ordinals     []uint64
 		offsetsOld   []int
 		offsetsV1    []int
 	)
@@ -213,7 +213,7 @@
 			fieldBounds = actualBounds
 		case unionTag, xunionTag, strictXunionTag, tableTag:
 			ordinal, actualBounds := fieldBounds.pop()
-			ordinals = append(ordinals, ordinal)
+			ordinals = append(ordinals, uint64(ordinal))
 			fieldBounds = actualBounds
 		default:
 		}
@@ -274,7 +274,7 @@
 	case xunionTag, strictXunionTag:
 		strictness := strictness(kind == strictXunionTag)
 
-		ordinalToFields := make(map[int]mField)
+		ordinalToFields := make(map[uint64]mField)
 		for i := 0; i < len(fields); i++ {
 			ordinalToFields[ordinals[i]] = fields[i]
 		}
@@ -302,7 +302,7 @@
 }
 
 func mUnionToMXUnion(m mUnion) mXUnion {
-	ordinalToFields := make(map[int]mField)
+	ordinalToFields := make(map[uint64]mField)
 	for i := 0; i < len(m.fields); i++ {
 		ordinalToFields[m.ordinals[i]] = m.fields[i]
 	}
@@ -650,7 +650,7 @@
 
 type mUnion struct {
 	fields                []mField
-	ordinals              []int
+	ordinals              []uint64
 	sizeOld, alignmentOld int
 	sizeV1, alignmentV1   int
 
@@ -748,8 +748,8 @@
 }
 
 type mXUnion struct {
-	fields                map[int]mField
-	ordinals              []int
+	fields                map[uint64]mField
+	ordinals              []uint64
 	unionToXunion         bool
 	sizeOld, alignmentOld int
 	sizeV1, alignmentV1   int
@@ -771,7 +771,7 @@
 }
 
 func (m mXUnion) marshal(ctx MarshalerContext, v reflect.Value, out *encoder) error {
-	var ordinal int
+	var ordinal uint64
 	if m.unionToXunion {
 		// Unions store the active field index in Field(0), which could be
 		// different from the xunion ordinal if there are reserved variants.
@@ -781,13 +781,13 @@
 		}
 		ordinal = m.ordinals[fieldIndex-1]
 	} else {
-		ordinal = int(v.Field(0).Uint())
+		ordinal = v.Field(0).Uint()
 	}
 	field, ok := m.fields[ordinal]
 	if !ok {
 		return newValueError(ErrInvalidXUnionTag, ordinal)
 	}
-	out.writeUint(uint64(ordinal), 8)
+	out.writeUint(ordinal, 8)
 
 	// Field.
 	if err := marshalEnvelopePresent(ctx, field, v.Field(field.index), out); err != nil {
@@ -806,19 +806,11 @@
 	// in order to reflectively create a pointer container.
 	optAllowed := typ != nil
 
-	ordinal, err := in.readUint(4)
+	ordinal, err := in.readUint(8)
 	if err != nil {
 		return err
 	}
 
-	padding, err := in.readUint(4)
-	if err != nil {
-		return err
-	}
-	if padding != 0 {
-		return newValueError(ErrNonZeroPadding, padding)
-	}
-
 	// ordinal=0 indicates that there MUST be no envelope.
 	if ordinal == 0 && !optAllowed {
 		return newValueError(ErrInvalidXUnionTag, ordinal)
@@ -837,7 +829,7 @@
 
 	// If we reach here, ordinal != 0.
 
-	field, ok := m.fields[int(ordinal)]
+	field, ok := m.fields[ordinal]
 	if !ok {
 		if m.strictness == isStrict {
 			return newValueError(ErrInvalidXUnionTag, ordinal)
@@ -926,7 +918,7 @@
 
 type mTable struct {
 	fields                []mField
-	ordinals              []int
+	ordinals              []uint64
 	sizeOld, alignmentOld int
 	sizeV1, alignmentV1   int
 }
@@ -1095,7 +1087,7 @@
 func (m mTable) marshal(ctx MarshalerContext, v reflect.Value, out *encoder) error {
 	// Determining max ordinal.
 	var (
-		maxOrdinal   int
+		maxOrdinal   uint64
 		numKnown     = len(m.ordinals)
 		fieldPresent = make([]bool, numKnown)
 	)
@@ -1110,7 +1102,7 @@
 	}
 
 	// Vector of envelopes header.
-	out.writeUint(uint64(maxOrdinal), 8)
+	out.writeUint(maxOrdinal, 8)
 	out.writeUint(allocPresent, 8)
 
 	// Early exit on empty table.
@@ -1120,12 +1112,12 @@
 
 	// Encode in the out-of-line object.
 	oldHead := out.head
-	out.head = out.newObject(maxOrdinal * envelopeSize)
+	out.head = out.newObject(int(maxOrdinal) * envelopeSize)
 
 	// Envelopes.
 	var (
-		ordinal                          = 1
-		index, fieldIndex, presenceIndex = 0, 1, 2
+		ordinal                          uint64 = 1
+		index, fieldIndex, presenceIndex        = 0, 1, 2
 	)
 	for ordinal <= maxOrdinal {
 		fieldKnown := index < numKnown && ordinal == m.ordinals[index]
@@ -1162,7 +1154,7 @@
 	if mou > uint64(^uint(0)) {
 		return newValueError(ErrUnexpectedOrdinal, v)
 	}
-	maxOrdinal := int(mou)
+	maxOrdinal := mou
 
 	allocPtr, err := in.readUint(8)
 	if err != nil {
@@ -1184,12 +1176,12 @@
 
 	// Envelopes.
 	var (
-		numKnown                         = len(m.ordinals)
-		ordinal                          = 1
-		index, fieldIndex, presenceIndex = 0, 1, 2
+		numKnown                                = len(m.ordinals)
+		ordinal                          uint64 = 1
+		index, fieldIndex, presenceIndex        = 0, 1, 2
 	)
 	tableBodyHead := in.nextObject
-	in.nextObject += maxOrdinal * envelopeSize
+	in.nextObject += int(maxOrdinal) * envelopeSize
 	oldHead := in.head
 	in.head = tableBodyHead
 	for ordinal <= maxOrdinal {
diff --git a/src/syscall/zx/fidl/fidl_test/encoding_new_test.go b/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
index 310982c..fad3f77 100644
--- a/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
+++ b/src/syscall/zx/fidl/fidl_test/encoding_new_test.go
@@ -87,9 +87,9 @@
 	}
 }
 
-func TestEnvelopeBadPadding(t *testing.T) {
+func Test64bitOrdinal(t *testing.T) {
 	input := []byte{
-		0x21, 0xEB, 0x7E, 0x76, 0x55, 0x55, 0x55, 0x55, // ordinal + invalid padding
+		0x21, 0xEB, 0x7E, 0x76, 0x55, 0x55, 0x55, 0x55, // 64bit ordinal
 		0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // byte + handle count
 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // envelope present
 		0xef, 0xbe, 0xad, 0xde, 0x11, 0xba, 0x5e, 0xba, // data
@@ -97,13 +97,8 @@
 
 	var message XUnion1Struct
 	_, _, err := Unmarshal(input, nil, &message)
-	if err == nil {
-		t.Fatalf("Unmarshal() returned nil error")
-	}
-
-	errCode := err.(ValidationError).Code()
-	if errCode != ErrNonZeroPadding {
-		t.Fatalf("Unmarshal() returned %d", errCode)
+	if err != nil {
+		t.Fatalf("Unmarshal() failed: %s", err)
 	}
 }
 
diff --git a/src/syscall/zx/mem/impl.go b/src/syscall/zx/mem/impl.go
index fdbdb20..1d0cdbe 100644
--- a/src/syscall/zx/mem/impl.go
+++ b/src/syscall/zx/mem/impl.go
@@ -69,7 +69,7 @@
 	return _mRange
 }
 
-type I_dataTag uint32
+type I_dataTag uint64
 
 const (
 	Data_unknownData = 0          // 0x00000000
@@ -103,8 +103,8 @@
 	}
 }
 
-func (_m *Data) Ordinal() uint32 {
-	return uint32(_m.I_dataTag)
+func (_m *Data) Ordinal() uint64 {
+	return uint64(_m.I_dataTag)
 }
 
 func (_m *Data) SetBytes(bytes []uint8) {