diff --git a/BUILD b/BUILD
index e1114a5fa6..5d66e34072 100644
--- a/BUILD
+++ b/BUILD
@@ -42,6 +42,7 @@ COPTS = CPPOPTS + [
     # copybara:strip_for_google3_begin
     #"-pedantic",
     #"-Werror=pedantic",
+    "-std=gnu11",
     "-Wstrict-prototypes",
     # copybara:strip_end
 ]
diff --git a/generated_for_cmake/google/protobuf/descriptor.upb.c b/generated_for_cmake/google/protobuf/descriptor.upb.c
index 4b5c92c6b0..471d12d327 100644
--- a/generated_for_cmake/google/protobuf/descriptor.upb.c
+++ b/generated_for_cmake/google/protobuf/descriptor.upb.c
@@ -21,77 +21,14 @@ static const upb_msglayout_field google_protobuf_FileDescriptorSet__fields[1] =
 };
 
 const upb_msglayout google_protobuf_FileDescriptorSet_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_prm_1bt_max192b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(10, 10),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_FileDescriptorSet_submsgs[0],
   &google_protobuf_FileDescriptorSet__fields[0],
+  8,
   UPB_SIZE(8, 8), 1, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_prm_1bt_max192b, UPB_SIZE(10, 10)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_FileDescriptorProto_submsgs[6] = {
@@ -119,77 +56,28 @@ static const upb_msglayout_field google_protobuf_FileDescriptorProto__fields[12]
 };
 
 const upb_msglayout google_protobuf_FileDescriptorProto_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_pss_1bt,
-    &fastdecode_generic,
-    &upb_prm_1bt_max128b,
-    &upb_prm_1bt_max128b,
-    &upb_prm_1bt_max64b,
-    &upb_prm_1bt_max192b,
-    &upb_psm_1bt_max256b,
-    &upb_psm_1bt_max64b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973706, 2251799813816330),
-    UPB_SIZE(3377699720790034, 6755399441317906),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(11258999068426274, 22517998136852514),
-    UPB_SIZE(12384898975334442, 24769797950603306),
-    UPB_SIZE(13510798882373682, 27021597764485170),
-    UPB_SIZE(14636698789085242, 29273397578039354),
-    UPB_SIZE(7881385247440962, 15762684595339330),
-    UPB_SIZE(9007289449381962, 18014488704122954),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(5629499534737506, 11258999068950626),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_FileDescriptorProto_submsgs[0],
   &google_protobuf_FileDescriptorProto__fields[0],
+  120,
   UPB_SIZE(64, 128), 12, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(1125899906973706, 2251799813816330)},
+    {&upb_pss_1bt, UPB_SIZE(3377699720790034, 6755399441317906)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_prm_1bt_max128b, UPB_SIZE(11258999068426274, 22517998136852514)},
+    {&upb_prm_1bt_max128b, UPB_SIZE(12384898975334442, 24769797950603306)},
+    {&upb_prm_1bt_max64b, UPB_SIZE(13510798882373682, 27021597764485170)},
+    {&upb_prm_1bt_max192b, UPB_SIZE(14636698789085242, 29273397578039354)},
+    {&upb_psm_1bt_max256b, UPB_SIZE(7881385247440962, 15762684595339330)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(9007289449381962, 18014488704122954)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(5629499534737506, 11258999068950626)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_DescriptorProto_submsgs[7] = {
@@ -216,77 +104,28 @@ static const upb_msglayout_field google_protobuf_DescriptorProto__fields[10] = {
 };
 
 const upb_msglayout google_protobuf_DescriptorProto_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_prm_1bt_max192b,
-    &upb_prm_1bt_max128b,
-    &upb_prm_1bt_max128b,
-    &upb_prm_1bt_max64b,
-    &upb_prm_1bt_max192b,
-    &upb_psm_1bt_max64b,
-    &upb_prm_1bt_max64b,
-    &upb_prm_1bt_max64b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973706, 2251799813816330),
-    UPB_SIZE(4503599627632658, 9007199255003154),
-    UPB_SIZE(5629499534213146, 11258999068426266),
-    UPB_SIZE(6755399441252386, 13510798882308130),
-    UPB_SIZE(7881299347963946, 15762598695862314),
-    UPB_SIZE(9007199255003186, 18014398509744178),
-    UPB_SIZE(3377777030266938, 6755476750794810),
-    UPB_SIZE(10133099161976898, 20266198323560514),
-    UPB_SIZE(11258999068557386, 22517998136983626),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_DescriptorProto_submsgs[0],
   &google_protobuf_DescriptorProto__fields[0],
+  120,
   UPB_SIZE(48, 96), 10, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(1125899906973706, 2251799813816330)},
+    {&upb_prm_1bt_max192b, UPB_SIZE(4503599627632658, 9007199255003154)},
+    {&upb_prm_1bt_max128b, UPB_SIZE(5629499534213146, 11258999068426266)},
+    {&upb_prm_1bt_max128b, UPB_SIZE(6755399441252386, 13510798882308130)},
+    {&upb_prm_1bt_max64b, UPB_SIZE(7881299347963946, 15762598695862314)},
+    {&upb_prm_1bt_max192b, UPB_SIZE(9007199255003186, 18014398509744178)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(3377777030266938, 6755476750794810)},
+    {&upb_prm_1bt_max64b, UPB_SIZE(10133099161976898, 20266198323560514)},
+    {&upb_prm_1bt_max64b, UPB_SIZE(11258999068557386, 22517998136983626)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_DescriptorProto_ExtensionRange_submsgs[1] = {
@@ -300,77 +139,16 @@ static const upb_msglayout_field google_protobuf_DescriptorProto_ExtensionRange_
 };
 
 const upb_msglayout google_protobuf_DescriptorProto_ExtensionRange_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_psv4_1bt,
-    &upb_psv4_1bt,
-    &upb_psm_1bt_max64b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973704, 1125899906973704),
-    UPB_SIZE(2251799813947408, 2251799813947408),
-    UPB_SIZE(3377781324906522, 4503681231749146),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_DescriptorProto_ExtensionRange_submsgs[0],
   &google_protobuf_DescriptorProto_ExtensionRange__fields[0],
+  24,
   UPB_SIZE(16, 24), 3, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psv4_1bt, UPB_SIZE(1125899906973704, 1125899906973704)},
+    {&upb_psv4_1bt, UPB_SIZE(2251799813947408, 2251799813947408)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(3377781324906522, 4503681231749146)},
+  },
 };
 
 static const upb_msglayout_field google_protobuf_DescriptorProto_ReservedRange__fields[2] = {
@@ -379,77 +157,16 @@ static const upb_msglayout_field google_protobuf_DescriptorProto_ReservedRange__
 };
 
 const upb_msglayout google_protobuf_DescriptorProto_ReservedRange_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_psv4_1bt,
-    &upb_psv4_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973704, 1125899906973704),
-    UPB_SIZE(2251799813947408, 2251799813947408),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   NULL,
   &google_protobuf_DescriptorProto_ReservedRange__fields[0],
+  24,
   UPB_SIZE(16, 16), 2, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psv4_1bt, UPB_SIZE(1125899906973704, 1125899906973704)},
+    {&upb_psv4_1bt, UPB_SIZE(2251799813947408, 2251799813947408)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_ExtensionRangeOptions_submsgs[1] = {
@@ -461,77 +178,13 @@ static const upb_msglayout_field google_protobuf_ExtensionRangeOptions__fields[1
 };
 
 const upb_msglayout google_protobuf_ExtensionRangeOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_ExtensionRangeOptions_submsgs[0],
   &google_protobuf_ExtensionRangeOptions__fields[0],
+  0,
   UPB_SIZE(8, 8), 1, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_FieldDescriptorProto_submsgs[1] = {
@@ -553,77 +206,44 @@ static const upb_msglayout_field google_protobuf_FieldDescriptorProto__fields[11
 };
 
 const upb_msglayout google_protobuf_FieldDescriptorProto_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_pss_1bt,
-    &upb_psv4_1bt,
-    &upb_psv4_1bt,
-    &upb_psv4_1bt,
-    &upb_pss_1bt,
-    &upb_pss_1bt,
-    &upb_psm_1bt_max64b,
-    &upb_psv4_1bt,
-    &upb_pss_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_psb1_2bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(10133099165777930, 11258999072620554),
-    UPB_SIZE(12384898983657490, 15762598704185362),
-    UPB_SIZE(6755399441580056, 6755399441580056),
-    UPB_SIZE(2251799813816352, 2251799813816352),
-    UPB_SIZE(4503599627632680, 4503599627632680),
-    UPB_SIZE(14636698805731378, 20266198339944498),
-    UPB_SIZE(16888498636193850, 24769797984092218),
-    UPB_SIZE(21392214194126914, 33777113169395778),
-    UPB_SIZE(7881299348947016, 7881299348947016),
-    UPB_SIZE(19140298483433554, 29273397645017170),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(9007199256838536, 9007199256838536),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_FieldDescriptorProto_submsgs[0],
   &google_protobuf_FieldDescriptorProto__fields[0],
+  248,
   UPB_SIZE(80, 128), 11, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(10133099165777930, 11258999072620554)},
+    {&upb_pss_1bt, UPB_SIZE(12384898983657490, 15762598704185362)},
+    {&upb_psv4_1bt, UPB_SIZE(6755399441580056, 6755399441580056)},
+    {&upb_psv4_1bt, UPB_SIZE(2251799813816352, 2251799813816352)},
+    {&upb_psv4_1bt, UPB_SIZE(4503599627632680, 4503599627632680)},
+    {&upb_pss_1bt, UPB_SIZE(14636698805731378, 20266198339944498)},
+    {&upb_pss_1bt, UPB_SIZE(16888498636193850, 24769797984092218)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(21392214194126914, 33777113169395778)},
+    {&upb_psv4_1bt, UPB_SIZE(7881299348947016, 7881299348947016)},
+    {&upb_pss_1bt, UPB_SIZE(19140298483433554, 29273397645017170)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_2bt, UPB_SIZE(9007199256838536, 9007199256838536)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_OneofDescriptorProto_submsgs[1] = {
@@ -636,77 +256,16 @@ static const upb_msglayout_field google_protobuf_OneofDescriptorProto__fields[2]
 };
 
 const upb_msglayout google_protobuf_OneofDescriptorProto_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_psm_1bt_max64b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973706, 2251799813816330),
-    UPB_SIZE(3377777029939218, 6755476750467090),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_OneofDescriptorProto_submsgs[0],
   &google_protobuf_OneofDescriptorProto__fields[0],
+  24,
   UPB_SIZE(16, 32), 2, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(1125899906973706, 2251799813816330)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(3377777029939218, 6755476750467090)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_EnumDescriptorProto_submsgs[3] = {
@@ -724,77 +283,20 @@ static const upb_msglayout_field google_protobuf_EnumDescriptorProto__fields[5]
 };
 
 const upb_msglayout google_protobuf_EnumDescriptorProto_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_prm_1bt_max64b,
-    &upb_psm_1bt_max64b,
-    &upb_prm_1bt_max64b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973706, 2251799813816330),
-    UPB_SIZE(4503599627501586, 9007199254872082),
-    UPB_SIZE(3377777030004762, 6755476750532634),
-    UPB_SIZE(5629499534213154, 11258999068426274),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_EnumDescriptorProto_submsgs[0],
   &google_protobuf_EnumDescriptorProto__fields[0],
+  56,
   UPB_SIZE(32, 64), 5, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(1125899906973706, 2251799813816330)},
+    {&upb_prm_1bt_max64b, UPB_SIZE(4503599627501586, 9007199254872082)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(3377777030004762, 6755476750532634)},
+    {&upb_prm_1bt_max64b, UPB_SIZE(5629499534213154, 11258999068426274)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout_field google_protobuf_EnumDescriptorProto_EnumReservedRange__fields[2] = {
@@ -803,77 +305,16 @@ static const upb_msglayout_field google_protobuf_EnumDescriptorProto_EnumReserve
 };
 
 const upb_msglayout google_protobuf_EnumDescriptorProto_EnumReservedRange_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_psv4_1bt,
-    &upb_psv4_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973704, 1125899906973704),
-    UPB_SIZE(2251799813947408, 2251799813947408),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   NULL,
   &google_protobuf_EnumDescriptorProto_EnumReservedRange__fields[0],
+  24,
   UPB_SIZE(16, 16), 2, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psv4_1bt, UPB_SIZE(1125899906973704, 1125899906973704)},
+    {&upb_psv4_1bt, UPB_SIZE(2251799813947408, 2251799813947408)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_EnumValueDescriptorProto_submsgs[1] = {
@@ -887,77 +328,16 @@ static const upb_msglayout_field google_protobuf_EnumValueDescriptorProto__field
 };
 
 const upb_msglayout google_protobuf_EnumValueDescriptorProto_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_psv4_1bt,
-    &upb_psm_1bt_max64b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(2251799813947402, 2251799813947402),
-    UPB_SIZE(1125899906973712, 1125899906973712),
-    UPB_SIZE(4503681231749146, 6755481045434394),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_EnumValueDescriptorProto_submsgs[0],
   &google_protobuf_EnumValueDescriptorProto__fields[0],
+  24,
   UPB_SIZE(24, 32), 3, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(2251799813947402, 2251799813947402)},
+    {&upb_psv4_1bt, UPB_SIZE(1125899906973712, 1125899906973712)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(4503681231749146, 6755481045434394)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_ServiceDescriptorProto_submsgs[2] = {
@@ -972,77 +352,16 @@ static const upb_msglayout_field google_protobuf_ServiceDescriptorProto__fields[
 };
 
 const upb_msglayout google_protobuf_ServiceDescriptorProto_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_prm_1bt_max128b,
-    &upb_psm_1bt_max64b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973706, 2251799813816330),
-    UPB_SIZE(4503599627370514, 9007199254741010),
-    UPB_SIZE(3377777030004762, 6755476750532634),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_ServiceDescriptorProto_submsgs[0],
   &google_protobuf_ServiceDescriptorProto__fields[0],
+  24,
   UPB_SIZE(24, 48), 3, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(1125899906973706, 2251799813816330)},
+    {&upb_prm_1bt_max128b, UPB_SIZE(4503599627370514, 9007199254741010)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(3377777030004762, 6755476750532634)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_MethodDescriptorProto_submsgs[1] = {
@@ -1059,77 +378,20 @@ static const upb_msglayout_field google_protobuf_MethodDescriptorProto__fields[6
 };
 
 const upb_msglayout google_protobuf_MethodDescriptorProto_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_pss_1bt,
-    &upb_pss_1bt,
-    &upb_psm_1bt_max64b,
-    &upb_psb1_1bt,
-    &upb_psb1_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899907366922, 2251799814209546),
-    UPB_SIZE(3377699721576466, 6755399442104338),
-    UPB_SIZE(5629499536310298, 11258999070523418),
-    UPB_SIZE(7881393837178914, 15762693185077282),
-    UPB_SIZE(281474976841768, 281474976841768),
-    UPB_SIZE(562949953683504, 562949953683504),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_MethodDescriptorProto_submsgs[0],
   &google_protobuf_MethodDescriptorProto__fields[0],
+  56,
   UPB_SIZE(32, 64), 6, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(1125899907366922, 2251799814209546)},
+    {&upb_pss_1bt, UPB_SIZE(3377699721576466, 6755399442104338)},
+    {&upb_pss_1bt, UPB_SIZE(5629499536310298, 11258999070523418)},
+    {&upb_psm_1bt_max64b, UPB_SIZE(7881393837178914, 15762693185077282)},
+    {&upb_psb1_1bt, UPB_SIZE(281474976841768, 281474976841768)},
+    {&upb_psb1_1bt, UPB_SIZE(562949953683504, 562949953683504)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_FileOptions_submsgs[1] = {
@@ -1161,77 +423,44 @@ static const upb_msglayout_field google_protobuf_FileOptions__fields[21] = {
 };
 
 const upb_msglayout google_protobuf_FileOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_psv4_1bt,
-    &upb_psb1_1bt,
-    &upb_pss_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_psb1_2bt,
-    &upb_psb1_2bt,
-    &upb_psb1_2bt,
-    &fastdecode_generic,
-    &upb_psb1_2bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_psb1_2bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_psb1_2bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_psb1_2bt,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(7881299482116106, 9007199388958730),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(10133099430019138, 13510799150547010),
-    UPB_SIZE(2251799813816392, 2251799813816392),
-    UPB_SIZE(4503599627632720, 4503599627632720),
-    UPB_SIZE(12384899512139866, 18014399046352986),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(4785074604605824, 4785074604605824),
-    UPB_SIZE(5066549581840776, 5066549581840776),
-    UPB_SIZE(5348024559600016, 5348024559600016),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(5629499538407840, 5629499538407840),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(5910974519312824, 5910974519312824),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(6192449504412120, 6192449504412120),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(6473924497900024, 6473924497900024),
-  },
   &google_protobuf_FileOptions_submsgs[0],
   &google_protobuf_FileOptions__fields[0],
+  248,
   UPB_SIZE(112, 208), 21, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(7881299482116106, 9007199388958730)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(10133099430019138, 13510799150547010)},
+    {&upb_psv4_1bt, UPB_SIZE(2251799813816392, 2251799813816392)},
+    {&upb_psb1_1bt, UPB_SIZE(4503599627632720, 4503599627632720)},
+    {&upb_pss_1bt, UPB_SIZE(12384899512139866, 18014399046352986)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_2bt, UPB_SIZE(4785074604605824, 4785074604605824)},
+    {&upb_psb1_2bt, UPB_SIZE(5066549581840776, 5066549581840776)},
+    {&upb_psb1_2bt, UPB_SIZE(5348024559600016, 5348024559600016)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_2bt, UPB_SIZE(5629499538407840, 5629499538407840)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_2bt, UPB_SIZE(5910974519312824, 5910974519312824)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_2bt, UPB_SIZE(6192449504412120, 6192449504412120)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_2bt, UPB_SIZE(6473924497900024, 6473924497900024)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_MessageOptions_submsgs[1] = {
@@ -1247,77 +476,20 @@ static const upb_msglayout_field google_protobuf_MessageOptions__fields[5] = {
 };
 
 const upb_msglayout google_protobuf_MessageOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_psb1_1bt,
-    &upb_psb1_1bt,
-    &upb_psb1_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_psb1_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(281474976841736, 281474976841736),
-    UPB_SIZE(562949953683472, 562949953683472),
-    UPB_SIZE(844424930656280, 844424930656280),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899907891256, 1125899907891256),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_MessageOptions_submsgs[0],
   &google_protobuf_MessageOptions__fields[0],
+  56,
   UPB_SIZE(16, 16), 5, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_1bt, UPB_SIZE(281474976841736, 281474976841736)},
+    {&upb_psb1_1bt, UPB_SIZE(562949953683472, 562949953683472)},
+    {&upb_psb1_1bt, UPB_SIZE(844424930656280, 844424930656280)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_1bt, UPB_SIZE(1125899907891256, 1125899907891256)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_FieldOptions_submsgs[1] = {
@@ -1335,77 +507,28 @@ static const upb_msglayout_field google_protobuf_FieldOptions__fields[7] = {
 };
 
 const upb_msglayout google_protobuf_FieldOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_psv4_1bt,
-    &upb_psb1_1bt,
-    &upb_psb1_1bt,
-    &fastdecode_generic,
-    &upb_psb1_1bt,
-    &upb_psv4_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_psb1_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(2251799813816328, 2251799813816328),
-    UPB_SIZE(6755399441580048, 6755399441580048),
-    UPB_SIZE(7036874418815000, 7036874418815000),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(7318349396574248, 7318349396574248),
-    UPB_SIZE(4503599627632688, 4503599627632688),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(7599824375382096, 7599824375382096),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_FieldOptions_submsgs[0],
   &google_protobuf_FieldOptions__fields[0],
+  120,
   UPB_SIZE(32, 40), 7, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psv4_1bt, UPB_SIZE(2251799813816328, 2251799813816328)},
+    {&upb_psb1_1bt, UPB_SIZE(6755399441580048, 6755399441580048)},
+    {&upb_psb1_1bt, UPB_SIZE(7036874418815000, 7036874418815000)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_1bt, UPB_SIZE(7318349396574248, 7318349396574248)},
+    {&upb_psv4_1bt, UPB_SIZE(4503599627632688, 4503599627632688)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_1bt, UPB_SIZE(7599824375382096, 7599824375382096)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_OneofOptions_submsgs[1] = {
@@ -1417,77 +540,13 @@ static const upb_msglayout_field google_protobuf_OneofOptions__fields[1] = {
 };
 
 const upb_msglayout google_protobuf_OneofOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_OneofOptions_submsgs[0],
   &google_protobuf_OneofOptions__fields[0],
+  0,
   UPB_SIZE(8, 8), 1, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_EnumOptions_submsgs[1] = {
@@ -1501,77 +560,16 @@ static const upb_msglayout_field google_protobuf_EnumOptions__fields[3] = {
 };
 
 const upb_msglayout google_protobuf_EnumOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_psb1_1bt,
-    &upb_psb1_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(281474976841744, 281474976841744),
-    UPB_SIZE(562949953683480, 562949953683480),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_EnumOptions_submsgs[0],
   &google_protobuf_EnumOptions__fields[0],
+  24,
   UPB_SIZE(8, 16), 3, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_1bt, UPB_SIZE(281474976841744, 281474976841744)},
+    {&upb_psb1_1bt, UPB_SIZE(562949953683480, 562949953683480)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_EnumValueOptions_submsgs[1] = {
@@ -1584,77 +582,14 @@ static const upb_msglayout_field google_protobuf_EnumValueOptions__fields[2] = {
 };
 
 const upb_msglayout google_protobuf_EnumValueOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_psb1_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(281474976841736, 281474976841736),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_EnumValueOptions_submsgs[0],
   &google_protobuf_EnumValueOptions__fields[0],
+  8,
   UPB_SIZE(8, 16), 2, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_psb1_1bt, UPB_SIZE(281474976841736, 281474976841736)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_ServiceOptions_submsgs[1] = {
@@ -1667,77 +602,13 @@ static const upb_msglayout_field google_protobuf_ServiceOptions__fields[2] = {
 };
 
 const upb_msglayout google_protobuf_ServiceOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_ServiceOptions_submsgs[0],
   &google_protobuf_ServiceOptions__fields[0],
+  0,
   UPB_SIZE(8, 16), 2, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_MethodOptions_submsgs[1] = {
@@ -1751,77 +622,13 @@ static const upb_msglayout_field google_protobuf_MethodOptions__fields[3] = {
 };
 
 const upb_msglayout google_protobuf_MethodOptions_msginit = {
-  {
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_MethodOptions_submsgs[0],
   &google_protobuf_MethodOptions__fields[0],
+  0,
   UPB_SIZE(24, 32), 3, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_UninterpretedOption_submsgs[1] = {
@@ -1839,77 +646,28 @@ static const upb_msglayout_field google_protobuf_UninterpretedOption__fields[7]
 };
 
 const upb_msglayout google_protobuf_UninterpretedOption_msginit = {
-  {
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_prm_1bt_max64b,
-    &upb_pss_1bt,
-    &upb_psv8_1bt,
-    &upb_psv8_1bt,
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_pss_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(15762598695796754, 22517998136852498),
-    UPB_SIZE(9007199255789594, 9007199255789594),
-    UPB_SIZE(2251799813816352, 2251799813816352),
-    UPB_SIZE(4503599627632680, 4503599627632680),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(11258999070523450, 13510798884208698),
-    UPB_SIZE(13510798886305858, 18014398513676354),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_UninterpretedOption_submsgs[0],
   &google_protobuf_UninterpretedOption__fields[0],
+  120,
   UPB_SIZE(64, 96), 7, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_prm_1bt_max64b, UPB_SIZE(15762598695796754, 22517998136852498)},
+    {&upb_pss_1bt, UPB_SIZE(9007199255789594, 9007199255789594)},
+    {&upb_psv8_1bt, UPB_SIZE(2251799813816352, 2251799813816352)},
+    {&upb_psv8_1bt, UPB_SIZE(4503599627632680, 4503599627632680)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(11258999070523450, 13510798884208698)},
+    {&upb_pss_1bt, UPB_SIZE(13510798886305858, 18014398513676354)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout_field google_protobuf_UninterpretedOption_NamePart__fields[2] = {
@@ -1918,77 +676,16 @@ static const upb_msglayout_field google_protobuf_UninterpretedOption_NamePart__f
 };
 
 const upb_msglayout google_protobuf_UninterpretedOption_NamePart_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_psb1_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899907104778, 2251799813947402),
-    UPB_SIZE(281474976841744, 281474976841744),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   NULL,
   &google_protobuf_UninterpretedOption_NamePart__fields[0],
+  24,
   UPB_SIZE(16, 32), 2, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(1125899907104778, 2251799813947402)},
+    {&upb_psb1_1bt, UPB_SIZE(281474976841744, 281474976841744)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_SourceCodeInfo_submsgs[1] = {
@@ -2000,77 +697,14 @@ static const upb_msglayout_field google_protobuf_SourceCodeInfo__fields[1] = {
 };
 
 const upb_msglayout google_protobuf_SourceCodeInfo_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_prm_1bt_max128b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(10, 10),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_SourceCodeInfo_submsgs[0],
   &google_protobuf_SourceCodeInfo__fields[0],
+  8,
   UPB_SIZE(8, 8), 1, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_prm_1bt_max128b, UPB_SIZE(10, 10)},
+  },
 };
 
 static const upb_msglayout_field google_protobuf_SourceCodeInfo_Location__fields[5] = {
@@ -2082,77 +716,20 @@ static const upb_msglayout_field google_protobuf_SourceCodeInfo_Location__fields
 };
 
 const upb_msglayout google_protobuf_SourceCodeInfo_Location_msginit = {
-  {
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_pss_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(1125899906973722, 2251799813816346),
-    UPB_SIZE(3377699720790050, 6755399441317922),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   NULL,
   &google_protobuf_SourceCodeInfo_Location__fields[0],
+  56,
   UPB_SIZE(32, 64), 5, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(1125899906973722, 2251799813816346)},
+    {&upb_pss_1bt, UPB_SIZE(3377699720790050, 6755399441317922)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 static const upb_msglayout *const google_protobuf_GeneratedCodeInfo_submsgs[1] = {
@@ -2164,77 +741,14 @@ static const upb_msglayout_field google_protobuf_GeneratedCodeInfo__fields[1] =
 };
 
 const upb_msglayout google_protobuf_GeneratedCodeInfo_msginit = {
-  {
-    &fastdecode_generic,
-    &upb_prm_1bt_max64b,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(10, 10),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   &google_protobuf_GeneratedCodeInfo_submsgs[0],
   &google_protobuf_GeneratedCodeInfo__fields[0],
+  8,
   UPB_SIZE(8, 8), 1, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_prm_1bt_max64b, UPB_SIZE(10, 10)},
+  },
 };
 
 static const upb_msglayout_field google_protobuf_GeneratedCodeInfo_Annotation__fields[4] = {
@@ -2245,77 +759,20 @@ static const upb_msglayout_field google_protobuf_GeneratedCodeInfo_Annotation__f
 };
 
 const upb_msglayout google_protobuf_GeneratedCodeInfo_Annotation_msginit = {
-  {
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &upb_pss_1bt,
-    &upb_psv4_1bt,
-    &upb_psv4_1bt,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-    &fastdecode_generic,
-  },
-  {
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(3377699721052178, 4503599627894802),
-    UPB_SIZE(1125899906973720, 1125899906973720),
-    UPB_SIZE(2251799813947424, 2251799813947424),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-    UPB_SIZE(0, 0),
-  },
   NULL,
   &google_protobuf_GeneratedCodeInfo_Annotation__fields[0],
+  56,
   UPB_SIZE(24, 48), 4, false,
+  {
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&upb_pss_1bt, UPB_SIZE(3377699721052178, 4503599627894802)},
+    {&upb_psv4_1bt, UPB_SIZE(1125899906973720, 1125899906973720)},
+    {&upb_psv4_1bt, UPB_SIZE(2251799813947424, 2251799813947424)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+    {&fastdecode_generic, UPB_SIZE(0, 0)},
+  },
 };
 
 #include "upb/port_undef.inc"
diff --git a/upb/decode_fast.c b/upb/decode_fast.c
index e12b32a515..7db98eafec 100644
--- a/upb/decode_fast.c
+++ b/upb/decode_fast.c
@@ -28,9 +28,11 @@ const char *fastdecode_tag_dispatch(upb_decstate *d, const char *ptr, upb_msg *m
                                 const upb_msglayout *table, uint64_t hasbits, uint32_t tag) {
   uint64_t data;
   size_t idx;
-  idx = (tag & 0xf8) >> 3;
-  data = table->field_data[idx] ^ tag;
-  return table->field_parser[idx](UPB_PARSE_ARGS);
+  idx = (tag & table->table_mask);
+  __builtin_assume((idx & 7) == 0);
+  idx >>= 3;
+  data = table->fasttable[idx].field_data ^ tag;
+  return table->fasttable[idx].field_parser(UPB_PARSE_ARGS);
 }
 
 UPB_FORCEINLINE
@@ -40,7 +42,7 @@ uint32_t fastdecode_load_tag(const char* ptr) {
   return tag;
 }
 
-UPB_FORCEINLINE
+UPB_NOINLINE
 const char *fastdecode_dispatch(upb_decstate *d, const char *ptr, upb_msg *msg,
                                 const upb_msglayout *table, uint64_t hasbits) {
   if (UPB_UNLIKELY(ptr >= d->fastlimit)) {
diff --git a/upb/def.c b/upb/def.c
index 65c9e02d1a..5b5f9e4d04 100644
--- a/upb/def.c
+++ b/upb/def.c
@@ -940,9 +940,8 @@ static bool make_layout(const upb_symtab *symtab, const upb_msgdef *m) {
   const upb_msglayout **submsgs;
   upb_msglayout_field *fields;
   upb_alloc *alloc = upb_arena_alloc(symtab->arena);
-  size_t i;
 
-  memset(l, 0, sizeof(*l));
+  memset(l, 0, sizeof(*l) + sizeof(_upb_fasttable_entry));
 
   fields = upb_malloc(alloc, upb_msgdef_numfields(m) * sizeof(*fields));
   submsgs = upb_malloc(alloc, submsg_count * sizeof(*submsgs));
@@ -956,10 +955,10 @@ static bool make_layout(const upb_symtab *symtab, const upb_msgdef *m) {
   l->field_count = upb_msgdef_numfields(m);
   l->fields = fields;
   l->submsgs = submsgs;
+  l->table_mask = 0;
 
-  for (i = 0; i < 32; i++) {
-    l->field_parser[i] = &fastdecode_generic;
-  }
+  l->fasttable[0].field_parser = &fastdecode_generic;
+  l->fasttable[0].field_data = 0;
 
   if (upb_msgdef_mapentry(m)) {
     /* TODO(haberman): refactor this method so this special case is more
@@ -1722,7 +1721,8 @@ static bool create_msgdef(symtab_addctx *ctx, const char *prefix,
     ctx->layouts++;
   } else {
     /* Allocate now (to allow cross-linking), populate later. */
-    m->layout = upb_malloc(ctx->alloc, sizeof(*m->layout));
+    m->layout = upb_malloc(ctx->alloc,
+                           sizeof(*m->layout) + sizeof(_upb_fasttable_entry));
   }
 
   oneofs = google_protobuf_DescriptorProto_oneof_decl(msg_proto, &n);
diff --git a/upb/msg.h b/upb/msg.h
index 1bc934204a..55f523e98a 100644
--- a/upb/msg.h
+++ b/upb/msg.h
@@ -54,16 +54,21 @@ typedef const char *_upb_field_parser(struct upb_decstate *d, const char *ptr,
                                       const struct upb_msglayout *table,
                                       uint64_t hasbits, uint64_t data);
 
+typedef struct {
+  _upb_field_parser *field_parser;
+  uint64_t field_data;
+} _upb_fasttable_entry;
+
 typedef struct upb_msglayout {
-  _upb_field_parser *field_parser[32];
-  uint64_t field_data[32];
   const struct upb_msglayout *const* submsgs;
   const upb_msglayout_field *fields;
+  uint32_t table_mask;
   /* Must be aligned to sizeof(void*).  Doesn't include internal members like
    * unknown fields, extension dict, pointer to msglayout, etc. */
   uint16_t size;
   uint16_t field_count;
   bool extendable;
+  _upb_fasttable_entry fasttable[];
 } upb_msglayout;
 
 /** upb_msg *******************************************************************/
diff --git a/upbc/generator.cc b/upbc/generator.cc
index 1409ee3c79..0bd474cd41 100644
--- a/upbc/generator.cc
+++ b/upbc/generator.cc
@@ -857,11 +857,19 @@ void TryFillTableEntry(const protobuf::Descriptor* message,
 
 std::vector<TableEntry> FastDecodeTable(const protobuf::Descriptor* message,
                                         const MessageLayout& layout) {
+  int table_size = 1;
+  for (int i = 0; i < message->field_count(); i++) {
+    int num = message->field(i)->number();
+    while (num >= table_size && num < 32) {
+      table_size *= 2;
+    }
+  }
+
   std::vector<TableEntry> table;
   MessageLayout::Size empty_size;
   empty_size.size32 = 0;
   empty_size.size64 = 0;
-  for (int i = 0; i < 32; i++) {
+  for (int i = 0; i < table_size; i++) {
     table.emplace_back(TableEntry{"fastdecode_generic", empty_size});
     TryFillTableEntry(message, layout, i, table.back());
   }
@@ -963,22 +971,18 @@ void WriteSource(const protobuf::FileDescriptor* file, Output& output) {
     std::vector<TableEntry> table = FastDecodeTable(message, layout);
 
     output("const upb_msglayout $0 = {\n", MessageInit(message));
-    output("  {\n");
-    for (const auto& ent : table) {
-      output("    &$0,\n", ent.first);
-    }
-    output("  },\n");
-    output("  {\n");
-    for (const auto& ent : table) {
-      output("    $0,\n", GetSizeInit(ent.second));
-    }
-    output("  },\n");
     output("  $0,\n", submsgs_array_ref);
     output("  $0,\n", fields_array_ref);
+    output("  $0,\n", (table.size() - 1) << 3);
     output("  $0, $1, $2,\n", GetSizeInit(layout.message_size()),
            field_number_order.size(),
            "false"  // TODO: extendable
     );
+    output("  {\n");
+    for (const auto& ent : table) {
+      output("    {&$0, $1},\n", ent.first, GetSizeInit(ent.second));
+    }
+    output("  },\n");
 
     output("};\n\n");
   }