Merge pull request #1325 from thomasvl/shrink_overhead

Shrink ObjC overhead (generated size and some runtime sizes)
diff --git a/Makefile.am b/Makefile.am
index 064efdf..4b5a44f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -381,13 +381,11 @@
   objectivec/DevTools/full_mac_build.sh                                      \
   objectivec/DevTools/pddm.py                                                \
   objectivec/DevTools/pddm_tests.py                                          \
-  objectivec/generate_descriptors_proto.sh                                   \
+  objectivec/generate_well_known_types.sh                                    \
   objectivec/google/protobuf/Any.pbobjc.h                                    \
   objectivec/google/protobuf/Any.pbobjc.m                                    \
   objectivec/google/protobuf/Api.pbobjc.h                                    \
   objectivec/google/protobuf/Api.pbobjc.m                                    \
-  objectivec/google/protobuf/Descriptor.pbobjc.h                             \
-  objectivec/google/protobuf/Descriptor.pbobjc.m                             \
   objectivec/google/protobuf/Duration.pbobjc.h                               \
   objectivec/google/protobuf/Duration.pbobjc.m                               \
   objectivec/google/protobuf/Empty.pbobjc.h                                  \
diff --git a/Protobuf.podspec b/Protobuf.podspec
index 02c8372..0bbd06d 100644
--- a/Protobuf.podspec
+++ b/Protobuf.podspec
@@ -17,7 +17,6 @@
   s.source_files = 'objectivec/*.{h,m}',
                    'objectivec/google/protobuf/Any.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Api.pbobjc.{h,m}',
-                   'objectivec/google/protobuf/Descriptor.pbobjc.{h,m}',
                    'objectivec/google/protobuf/Duration.pbobjc.h',
                    'objectivec/google/protobuf/Empty.pbobjc.{h,m}',
                    'objectivec/google/protobuf/FieldMask.pbobjc.{h,m}',
diff --git a/generate_descriptor_proto.sh b/generate_descriptor_proto.sh
index 81b8a0d..1690d0d 100755
--- a/generate_descriptor_proto.sh
+++ b/generate_descriptor_proto.sh
@@ -92,9 +92,9 @@
 done
 cd ..
 
-if test -x objectivec/generate_descriptors_proto.sh; then
+if test -x objectivec/generate_well_known_types.sh; then
   echo "Generating messages for objc."
-  objectivec/generate_descriptors_proto.sh $@
+  objectivec/generate_well_known_types.sh $@
 fi
 
 if test -x csharp/generate_protos.sh; then
diff --git a/objectivec/DevTools/compile_testing_protos.sh b/objectivec/DevTools/compile_testing_protos.sh
index e9c5fe6..8295313 100755
--- a/objectivec/DevTools/compile_testing_protos.sh
+++ b/objectivec/DevTools/compile_testing_protos.sh
@@ -67,29 +67,36 @@
 # Ensure the output dir exists
 mkdir -p "${OUTPUT_DIR}/google/protobuf"
 
-CORE_PROTO_FILES=(                                         \
-  src/google/protobuf/unittest_arena.proto                 \
-  src/google/protobuf/unittest_custom_options.proto        \
-  src/google/protobuf/unittest_enormous_descriptor.proto   \
-  src/google/protobuf/unittest_embed_optimize_for.proto    \
-  src/google/protobuf/unittest_empty.proto                 \
-  src/google/protobuf/unittest_import.proto                \
-  src/google/protobuf/unittest_import_lite.proto           \
-  src/google/protobuf/unittest_lite.proto                  \
-  src/google/protobuf/unittest_mset.proto                  \
-  src/google/protobuf/unittest_mset_wire_format.proto      \
-  src/google/protobuf/unittest_no_arena.proto              \
-  src/google/protobuf/unittest_no_arena_import.proto       \
-  src/google/protobuf/unittest_no_generic_services.proto   \
-  src/google/protobuf/unittest_optimize_for.proto          \
-  src/google/protobuf/unittest.proto                       \
-  src/google/protobuf/unittest_import_public.proto         \
-  src/google/protobuf/unittest_import_public_lite.proto    \
-  src/google/protobuf/unittest_drop_unknown_fields.proto   \
-  src/google/protobuf/unittest_preserve_unknown_enum.proto \
-  src/google/protobuf/map_lite_unittest.proto              \
-  src/google/protobuf/map_proto2_unittest.proto            \
-  src/google/protobuf/map_unittest.proto                   \
+CORE_PROTO_FILES=(
+  src/google/protobuf/unittest_arena.proto
+  src/google/protobuf/unittest_custom_options.proto
+  src/google/protobuf/unittest_enormous_descriptor.proto
+  src/google/protobuf/unittest_embed_optimize_for.proto
+  src/google/protobuf/unittest_empty.proto
+  src/google/protobuf/unittest_import.proto
+  src/google/protobuf/unittest_import_lite.proto
+  src/google/protobuf/unittest_lite.proto
+  src/google/protobuf/unittest_mset.proto
+  src/google/protobuf/unittest_mset_wire_format.proto
+  src/google/protobuf/unittest_no_arena.proto
+  src/google/protobuf/unittest_no_arena_import.proto
+  src/google/protobuf/unittest_no_generic_services.proto
+  src/google/protobuf/unittest_optimize_for.proto
+  src/google/protobuf/unittest.proto
+  src/google/protobuf/unittest_import_public.proto
+  src/google/protobuf/unittest_import_public_lite.proto
+  src/google/protobuf/unittest_drop_unknown_fields.proto
+  src/google/protobuf/unittest_preserve_unknown_enum.proto
+  src/google/protobuf/map_lite_unittest.proto
+  src/google/protobuf/map_proto2_unittest.proto
+  src/google/protobuf/map_unittest.proto
+)
+
+# The unittest_custom_options.proto extends the messages in descriptor.proto
+# so we build it in to test extending in general. The library doesn't provide
+# a descriptor as it doesn't use the classes/enums.
+CORE_PROTO_FILES+=(
+  src/google/protobuf/descriptor.proto
 )
 
 compile_proto() {
@@ -104,12 +111,12 @@
   compile_proto "${a_proto}"
 done
 
-OBJC_PROTO_FILES=(                               \
-  objectivec/Tests/unittest_cycle.proto          \
-  objectivec/Tests/unittest_runtime_proto2.proto \
-  objectivec/Tests/unittest_runtime_proto3.proto \
-  objectivec/Tests/unittest_objc.proto           \
-  objectivec/Tests/unittest_objc_startup.proto   \
+OBJC_PROTO_FILES=(
+  objectivec/Tests/unittest_cycle.proto
+  objectivec/Tests/unittest_runtime_proto2.proto
+  objectivec/Tests/unittest_runtime_proto3.proto
+  objectivec/Tests/unittest_objc.proto
+  objectivec/Tests/unittest_objc_startup.proto
 )
 
 for a_proto in "${OBJC_PROTO_FILES[@]}" ; do
diff --git a/objectivec/DevTools/full_mac_build.sh b/objectivec/DevTools/full_mac_build.sh
index c8681e2..b382779 100755
--- a/objectivec/DevTools/full_mac_build.sh
+++ b/objectivec/DevTools/full_mac_build.sh
@@ -190,7 +190,7 @@
 readonly NewestInput=$(find \
    src/google/protobuf/*.proto \
    src/.libs src/*.la src/protoc \
-   objectivec/generate_descriptors_proto.sh \
+   objectivec/generate_well_known_types.sh \
       -type f -print0 \
       | xargs -0 stat -f "%m %N" \
       | sort -n | tail -n1 | cut -f2- -d" ")
@@ -203,7 +203,7 @@
 # If the newest input is newer than the oldest output, regenerate.
 if [[ "${NewestInput}" -nt "${OldestOutput}" ]] ; then
   echo ">> Newest input is newer than oldest output, regenerating."
-  objectivec/generate_descriptors_proto.sh -j "${NUM_MAKE_JOBS}"
+  objectivec/generate_well_known_types.sh -j "${NUM_MAKE_JOBS}"
 else
   echo ">> Newest input is older than oldest output, no need to regenerating."
 fi
diff --git a/objectivec/GPBBootstrap.h b/objectivec/GPBBootstrap.h
index c49c7e2..ffefa77 100644
--- a/objectivec/GPBBootstrap.h
+++ b/objectivec/GPBBootstrap.h
@@ -37,13 +37,6 @@
 #define GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS 0
 #endif
 
-// Most uses of protocol buffers don't need field options, by default the
-// static data will be compiled out, define this to 1 to include it. The only
-// time you need this is if you are doing introspection of the protocol buffers.
-#ifndef GPBOBJC_INCLUDE_FIELD_OPTIONS
-#define GPBOBJC_INCLUDE_FIELD_OPTIONS 0
-#endif
-
 // Used in the generated code to give sizes to enums. int32_t was chosen based
 // on the fact that Protocol Buffers enums are limited to this range.
 #if !__has_feature(objc_fixed_enum)
@@ -89,4 +82,4 @@
 // generated Objective C sources.  In general we don't want to change the
 // runtime interfaces (or this version) as it means everything has to be
 // regenerated.
-#define GOOGLE_PROTOBUF_OBJC_GEN_VERSION 30000
+#define GOOGLE_PROTOBUF_OBJC_GEN_VERSION 30001
diff --git a/objectivec/GPBDescriptor.h b/objectivec/GPBDescriptor.h
index 8d8e975..a6eff0f 100644
--- a/objectivec/GPBDescriptor.h
+++ b/objectivec/GPBDescriptor.h
@@ -34,19 +34,18 @@
 
 @class GPBEnumDescriptor;
 @class GPBFieldDescriptor;
-@class GPBFieldOptions;
 @class GPBFileDescriptor;
 @class GPBOneofDescriptor;
 
 NS_ASSUME_NONNULL_BEGIN
 
-typedef NS_ENUM(NSInteger, GPBFileSyntax) {
+typedef NS_ENUM(uint8_t, GPBFileSyntax) {
   GPBFileSyntaxUnknown = 0,
   GPBFileSyntaxProto2 = 2,
   GPBFileSyntaxProto3 = 3,
 };
 
-typedef NS_ENUM(NSInteger, GPBFieldType) {
+typedef NS_ENUM(uint8_t, GPBFieldType) {
   GPBFieldTypeSingle,    // optional/required
   GPBFieldTypeRepeated,  // repeated
   GPBFieldTypeMap,       // map<K,V>
@@ -57,9 +56,8 @@
 @property(nonatomic, readonly, copy) NSString *name;
 @property(nonatomic, readonly, strong, nullable) NSArray<GPBFieldDescriptor*> *fields;
 @property(nonatomic, readonly, strong, nullable) NSArray<GPBOneofDescriptor*> *oneofs;
-@property(nonatomic, readonly, strong, nullable) NSArray<GPBEnumDescriptor*> *enums;
 @property(nonatomic, readonly, nullable) const GPBExtensionRange *extensionRanges;
-@property(nonatomic, readonly) NSUInteger extensionRangesCount;
+@property(nonatomic, readonly) uint32_t extensionRangesCount;
 @property(nonatomic, readonly, assign) GPBFileDescriptor *file;
 
 @property(nonatomic, readonly, getter=isWireFormat) BOOL wireFormat;
@@ -68,7 +66,6 @@
 - (nullable GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber;
 - (nullable GPBFieldDescriptor *)fieldWithName:(NSString *)name;
 - (nullable GPBOneofDescriptor *)oneofWithName:(NSString *)name;
-- (nullable GPBEnumDescriptor *)enumWithName:(NSString *)name;
 
 @end
 
@@ -103,8 +100,6 @@
 
 @property(nonatomic, readonly, assign, nullable) GPBOneofDescriptor *containingOneof;
 
-@property(nonatomic, readonly, nullable) GPBFieldOptions *fieldOptions;
-
 // Message properties
 @property(nonatomic, readonly, assign, nullable) Class msgClass;
 
diff --git a/objectivec/GPBDescriptor.m b/objectivec/GPBDescriptor.m
index bae9187..2709737 100644
--- a/objectivec/GPBDescriptor.m
+++ b/objectivec/GPBDescriptor.m
@@ -35,7 +35,6 @@
 #import "GPBUtilities_PackagePrivate.h"
 #import "GPBWireFormat.h"
 #import "GPBMessage_PackagePrivate.h"
-#import "google/protobuf/Descriptor.pbobjc.h"
 
 // The address of this variable is used as a key for obj_getAssociatedObject.
 static const char kTextFormatExtraValueKey = 0;
@@ -92,7 +91,6 @@
 
 @implementation GPBDescriptor {
   Class messageClass_;
-  NSArray *enums_;
   GPBFileDescriptor *file_;
   BOOL wireFormat_;
 }
@@ -100,7 +98,6 @@
 @synthesize messageClass = messageClass_;
 @synthesize fields = fields_;
 @synthesize oneofs = oneofs_;
-@synthesize enums = enums_;
 @synthesize extensionRanges = extensionRanges_;
 @synthesize extensionRangesCount = extensionRangesCount_;
 @synthesize file = file_;
@@ -110,130 +107,58 @@
     allocDescriptorForClass:(Class)messageClass
                   rootClass:(Class)rootClass
                        file:(GPBFileDescriptor *)file
-                     fields:(GPBMessageFieldDescription *)fieldDescriptions
-                 fieldCount:(NSUInteger)fieldCount
-                     oneofs:(GPBMessageOneofDescription *)oneofDescriptions
-                 oneofCount:(NSUInteger)oneofCount
-                      enums:(GPBMessageEnumDescription *)enumDescriptions
-                  enumCount:(NSUInteger)enumCount
-                     ranges:(const GPBExtensionRange *)ranges
-                 rangeCount:(NSUInteger)rangeCount
-                storageSize:(size_t)storageSize
-                 wireFormat:(BOOL)wireFormat {
+                     fields:(void *)fieldDescriptions
+                 fieldCount:(uint32_t)fieldCount
+                storageSize:(uint32_t)storageSize
+                      flags:(GPBDescriptorInitializationFlags)flags {
+  // The rootClass is no longer used, but it is passed in to ensure it
+  // was started up during initialization also.
+  (void)rootClass;
   NSMutableArray *fields = nil;
-  NSMutableArray *oneofs = nil;
-  NSMutableArray *enums = nil;
-  NSMutableArray *extensionRanges = nil;
   GPBFileSyntax syntax = file.syntax;
-  for (NSUInteger i = 0; i < fieldCount; ++i) {
+  BOOL fieldsIncludeDefault =
+      (flags & GPBDescriptorInitializationFlag_FieldsWithDefault) != 0;
+
+  void *desc;
+  for (uint32_t i = 0; i < fieldCount; ++i) {
     if (fields == nil) {
       fields = [[NSMutableArray alloc] initWithCapacity:fieldCount];
     }
-    GPBFieldDescriptor *fieldDescriptor = [[GPBFieldDescriptor alloc]
-        initWithFieldDescription:&fieldDescriptions[i]
-                       rootClass:rootClass
-                          syntax:syntax];
+    // Need correctly typed pointer for array indexing below to work.
+    if (fieldsIncludeDefault) {
+      GPBMessageFieldDescriptionWithDefault *fieldDescWithDefault = fieldDescriptions;
+      desc = &(fieldDescWithDefault[i]);
+    } else {
+      GPBMessageFieldDescription *fieldDesc = fieldDescriptions;
+      desc = &(fieldDesc[i]);
+    }
+    GPBFieldDescriptor *fieldDescriptor =
+        [[GPBFieldDescriptor alloc] initWithFieldDescription:desc
+                                             includesDefault:fieldsIncludeDefault
+                                                      syntax:syntax];
     [fields addObject:fieldDescriptor];
     [fieldDescriptor release];
   }
-  for (NSUInteger i = 0; i < oneofCount; ++i) {
-    if (oneofs == nil) {
-      oneofs = [[NSMutableArray alloc] initWithCapacity:oneofCount];
-    }
-    GPBMessageOneofDescription *oneofDescription = &oneofDescriptions[i];
-    NSArray *fieldsForOneof =
-        NewFieldsArrayForHasIndex(oneofDescription->index, fields);
-    GPBOneofDescriptor *oneofDescriptor =
-        [[GPBOneofDescriptor alloc] initWithOneofDescription:oneofDescription
-                                                      fields:fieldsForOneof];
-    [oneofs addObject:oneofDescriptor];
-    [oneofDescriptor release];
-    [fieldsForOneof release];
-  }
-  for (NSUInteger i = 0; i < enumCount; ++i) {
-    if (enums == nil) {
-      enums = [[NSMutableArray alloc] initWithCapacity:enumCount];
-    }
-    GPBEnumDescriptor *enumDescriptor =
-        enumDescriptions[i].enumDescriptorFunc();
-    [enums addObject:enumDescriptor];
-  }
 
+  BOOL wireFormat = (flags & GPBDescriptorInitializationFlag_WireFormat) != 0;
   GPBDescriptor *descriptor = [[self alloc] initWithClass:messageClass
                                                      file:file
                                                    fields:fields
-                                                   oneofs:oneofs
-                                                    enums:enums
-                                          extensionRanges:ranges
-                                     extensionRangesCount:rangeCount
                                               storageSize:storageSize
                                                wireFormat:wireFormat];
   [fields release];
-  [oneofs release];
-  [enums release];
-  [extensionRanges release];
-  return descriptor;
-}
-
-+ (instancetype)
-    allocDescriptorForClass:(Class)messageClass
-                  rootClass:(Class)rootClass
-                       file:(GPBFileDescriptor *)file
-                     fields:(GPBMessageFieldDescription *)fieldDescriptions
-                 fieldCount:(NSUInteger)fieldCount
-                     oneofs:(GPBMessageOneofDescription *)oneofDescriptions
-                 oneofCount:(NSUInteger)oneofCount
-                      enums:(GPBMessageEnumDescription *)enumDescriptions
-                  enumCount:(NSUInteger)enumCount
-                     ranges:(const GPBExtensionRange *)ranges
-                 rangeCount:(NSUInteger)rangeCount
-                storageSize:(size_t)storageSize
-                 wireFormat:(BOOL)wireFormat
-        extraTextFormatInfo:(const char *)extraTextFormatInfo {
-  GPBDescriptor *descriptor = [self allocDescriptorForClass:messageClass
-                                                  rootClass:rootClass
-                                                       file:file
-                                                     fields:fieldDescriptions
-                                                 fieldCount:fieldCount
-                                                     oneofs:oneofDescriptions
-                                                 oneofCount:oneofCount
-                                                      enums:enumDescriptions
-                                                  enumCount:enumCount
-                                                     ranges:ranges
-                                                 rangeCount:rangeCount
-                                                storageSize:storageSize
-                                                 wireFormat:wireFormat];
-  // Extra info is a compile time option, so skip the work if not needed.
-  if (extraTextFormatInfo) {
-    NSValue *extraInfoValue = [NSValue valueWithPointer:extraTextFormatInfo];
-    for (GPBFieldDescriptor *fieldDescriptor in descriptor->fields_) {
-      if (fieldDescriptor->description_->flags & GPBFieldTextFormatNameCustom) {
-        objc_setAssociatedObject(fieldDescriptor, &kTextFormatExtraValueKey,
-                                 extraInfoValue,
-                                 OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-      }
-    }
-  }
   return descriptor;
 }
 
 - (instancetype)initWithClass:(Class)messageClass
                          file:(GPBFileDescriptor *)file
                        fields:(NSArray *)fields
-                       oneofs:(NSArray *)oneofs
-                        enums:(NSArray *)enums
-              extensionRanges:(const GPBExtensionRange *)extensionRanges
-         extensionRangesCount:(NSUInteger)extensionRangesCount
-                  storageSize:(size_t)storageSize
+                  storageSize:(uint32_t)storageSize
                    wireFormat:(BOOL)wireFormat {
   if ((self = [super init])) {
     messageClass_ = messageClass;
     file_ = file;
     fields_ = [fields retain];
-    oneofs_ = [oneofs retain];
-    enums_ = [enums retain];
-    extensionRanges_ = extensionRanges;
-    extensionRangesCount_ = extensionRangesCount;
     storageSize_ = storageSize;
     wireFormat_ = wireFormat;
   }
@@ -243,10 +168,47 @@
 - (void)dealloc {
   [fields_ release];
   [oneofs_ release];
-  [enums_ release];
   [super dealloc];
 }
 
+- (void)setupOneofs:(const char **)oneofNames
+              count:(uint32_t)count
+      firstHasIndex:(int32_t)firstHasIndex {
+  NSCAssert(firstHasIndex < 0, @"Should always be <0");
+  NSMutableArray *oneofs = [[NSMutableArray alloc] initWithCapacity:count];
+  for (uint32_t i = 0, hasIndex = firstHasIndex; i < count; ++i, --hasIndex) {
+    const char *name = oneofNames[i];
+    NSArray *fieldsForOneof = NewFieldsArrayForHasIndex(hasIndex, fields_);
+    NSCAssert(fieldsForOneof.count > 0,
+              @"No fields for this oneof? (%s:%d)", name, hasIndex);
+    GPBOneofDescriptor *oneofDescriptor =
+        [[GPBOneofDescriptor alloc] initWithName:name fields:fieldsForOneof];
+    [oneofs addObject:oneofDescriptor];
+    [oneofDescriptor release];
+    [fieldsForOneof release];
+  }
+  oneofs_ = oneofs;
+}
+
+- (void)setupExtraTextInfo:(const char *)extraTextFormatInfo {
+  // Extra info is a compile time option, so skip the work if not needed.
+  if (extraTextFormatInfo) {
+    NSValue *extraInfoValue = [NSValue valueWithPointer:extraTextFormatInfo];
+    for (GPBFieldDescriptor *fieldDescriptor in fields_) {
+      if (fieldDescriptor->description_->flags & GPBFieldTextFormatNameCustom) {
+        objc_setAssociatedObject(fieldDescriptor, &kTextFormatExtraValueKey,
+                                 extraInfoValue,
+                                 OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+      }
+    }
+  }
+}
+
+- (void)setupExtensionRanges:(const GPBExtensionRange *)ranges count:(int32_t)count {
+  extensionRanges_ = ranges;
+  extensionRangesCount_ = count;
+}
+
 - (NSString *)name {
   return NSStringFromClass(messageClass_);
 }
@@ -283,15 +245,6 @@
   return nil;
 }
 
-- (GPBEnumDescriptor *)enumWithName:(NSString *)name {
-  for (GPBEnumDescriptor *descriptor in enums_) {
-    if ([descriptor.name isEqual:name]) {
-      return descriptor;
-    }
-  }
-  return nil;
-}
-
 @end
 
 @implementation GPBFileDescriptor {
@@ -318,19 +271,16 @@
 
 @synthesize fields = fields_;
 
-- (instancetype)initWithOneofDescription:
-                    (GPBMessageOneofDescription *)oneofDescription
-                                  fields:(NSArray *)fields {
+- (instancetype)initWithName:(const char *)name fields:(NSArray *)fields {
   self = [super init];
   if (self) {
-    NSAssert(oneofDescription->index < 0, @"Should always be <0");
-    oneofDescription_ = oneofDescription;
+    name_ = name;
     fields_ = [fields retain];
     for (GPBFieldDescriptor *fieldDesc in fields) {
       fieldDesc->containingOneof_ = self;
     }
 
-    caseSel_ = SelFromStrings(NULL, oneofDescription->name, "OneOfCase", NO);
+    caseSel_ = SelFromStrings(NULL, name, "OneOfCase", NO);
   }
   return self;
 }
@@ -341,7 +291,7 @@
 }
 
 - (NSString *)name {
-  return @(oneofDescription_->name);
+  return @(name_);
 }
 
 - (GPBFieldDescriptor *)fieldWithNumber:(uint32_t)fieldNumber {
@@ -389,7 +339,6 @@
 
 @implementation GPBFieldDescriptor {
   GPBGenericValue defaultValue_;
-  GPBFieldOptions *fieldOptions_;
 
   // Message ivars
   Class msgClass_;
@@ -403,7 +352,6 @@
   } enumHandling_;
 }
 
-@synthesize fieldOptions = fieldOptions_;
 @synthesize msgClass = msgClass_;
 @synthesize containingOneof = containingOneof_;
 
@@ -417,16 +365,21 @@
   return self;
 }
 
-- (instancetype)initWithFieldDescription:
-                    (GPBMessageFieldDescription *)description
-                               rootClass:(Class)rootClass
+- (instancetype)initWithFieldDescription:(void *)description
+                         includesDefault:(BOOL)includesDefault
                                   syntax:(GPBFileSyntax)syntax {
   if ((self = [super init])) {
-    description_ = description;
-    getSel_ = sel_getUid(description->name);
-    setSel_ = SelFromStrings("set", description->name, NULL, YES);
+    GPBMessageFieldDescription *coreDesc;
+    if (includesDefault) {
+      coreDesc = &(((GPBMessageFieldDescriptionWithDefault *)description)->core);
+    } else {
+      coreDesc = description;
+    }
+    description_ = coreDesc;
+    getSel_ = sel_getUid(coreDesc->name);
+    setSel_ = SelFromStrings("set", coreDesc->name, NULL, YES);
 
-    GPBDataType dataType = description->dataType;
+    GPBDataType dataType = coreDesc->dataType;
     BOOL isMessage = GPBDataTypeIsMessage(dataType);
     BOOL isMapOrArray = GPBFieldIsMapOrArray(self);
 
@@ -434,39 +387,39 @@
       // map<>/repeated fields get a *Count property (inplace of a has*) to
       // support checking if there are any entries without triggering
       // autocreation.
-      hasOrCountSel_ = SelFromStrings(NULL, description->name, "_Count", NO);
+      hasOrCountSel_ = SelFromStrings(NULL, coreDesc->name, "_Count", NO);
     } else {
       // If there is a positive hasIndex, then:
       //   - All fields types for proto2 messages get has* selectors.
       //   - Only message fields for proto3 messages get has* selectors.
       // Note: the positive check is to handle oneOfs, we can't check
       // containingOneof_ because it isn't set until after initialization.
-      if ((description->hasIndex >= 0) &&
-          (description->hasIndex != GPBNoHasBit) &&
+      if ((coreDesc->hasIndex >= 0) &&
+          (coreDesc->hasIndex != GPBNoHasBit) &&
           ((syntax != GPBFileSyntaxProto3) || isMessage)) {
-        hasOrCountSel_ = SelFromStrings("has", description->name, NULL, NO);
-        setHasSel_ = SelFromStrings("setHas", description->name, NULL, YES);
+        hasOrCountSel_ = SelFromStrings("has", coreDesc->name, NULL, NO);
+        setHasSel_ = SelFromStrings("setHas", coreDesc->name, NULL, YES);
       }
     }
 
     // Extra type specific data.
     if (isMessage) {
-      const char *className = description->dataTypeSpecific.className;
+      const char *className = coreDesc->dataTypeSpecific.className;
       msgClass_ = objc_getClass(className);
       NSAssert(msgClass_, @"Class %s not defined", className);
     } else if (dataType == GPBDataTypeEnum) {
-      if ((description_->flags & GPBFieldHasEnumDescriptor) != 0) {
+      if ((coreDesc->flags & GPBFieldHasEnumDescriptor) != 0) {
         enumHandling_.enumDescriptor_ =
-            description->dataTypeSpecific.enumDescFunc();
+            coreDesc->dataTypeSpecific.enumDescFunc();
       } else {
         enumHandling_.enumVerifier_ =
-            description->dataTypeSpecific.enumVerifier;
+            coreDesc->dataTypeSpecific.enumVerifier;
       }
     }
 
-    // Non map<>/repeated fields can have defaults.
-    if (!isMapOrArray) {
-      defaultValue_ = description->defaultValue;
+    // Non map<>/repeated fields can have defaults in proto2 syntax.
+    if (!isMapOrArray && includesDefault) {
+      defaultValue_ = ((GPBMessageFieldDescriptionWithDefault *)description)->defaultValue;
       if (dataType == GPBDataTypeBytes) {
         // Data stored as a length prefixed (network byte order) c-string in
         // descriptor structure.
@@ -480,24 +433,6 @@
         }
       }
     }
-
-    // FieldOptions stored as a length prefixed (network byte order) c-escaped
-    // string in descriptor records.
-    if (description->fieldOptions) {
-      uint8_t *optionsBytes = (uint8_t *)description->fieldOptions;
-      uint32_t optionsLength = *((uint32_t *)optionsBytes);
-      optionsLength = ntohl(optionsLength);
-      if (optionsLength > 0) {
-        optionsBytes += sizeof(optionsLength);
-        NSData *optionsData = [NSData dataWithBytesNoCopy:optionsBytes
-                                                   length:optionsLength
-                                             freeWhenDone:NO];
-        GPBExtensionRegistry *registry = [rootClass extensionRegistry];
-        fieldOptions_ = [[GPBFieldOptions parseFromData:optionsData
-                                      extensionRegistry:registry
-                                                  error:NULL] retain];
-      }
-    }
   }
   return self;
 }
@@ -666,7 +601,7 @@
   } else {
     // Undo the CamelCase.
     NSMutableString *result = [NSMutableString stringWithCapacity:len];
-    for (NSUInteger i = 0; i < len; i++) {
+    for (uint32_t i = 0; i < len; i++) {
       unichar c = [name characterAtIndex:i];
       if (c >= 'A' && c <= 'Z') {
         if (i > 0) {
@@ -686,10 +621,16 @@
 
 @implementation GPBEnumDescriptor {
   NSString *name_;
-  GPBMessageEnumValueDescription *valueDescriptions_;
-  NSUInteger valueDescriptionsCount_;
+  // valueNames_ is a single c string with all of the value names appended
+  // together, each null terminated.  -calcValueNameOffsets fills in
+  // nameOffsets_ with the offsets to allow quicker access to the individual
+  // names.
+  const char *valueNames_;
+  const int32_t *values_;
   GPBEnumValidationFunc enumVerifier_;
   const uint8_t *extraTextFormatInfo_;
+  uint32_t *nameOffsets_;
+  uint32_t valueCount_;
 }
 
 @synthesize name = name_;
@@ -697,26 +638,30 @@
 
 + (instancetype)
     allocDescriptorForName:(NSString *)name
-                    values:(GPBMessageEnumValueDescription *)valueDescriptions
-                valueCount:(NSUInteger)valueCount
+                valueNames:(const char *)valueNames
+                    values:(const int32_t *)values
+                     count:(uint32_t)valueCount
               enumVerifier:(GPBEnumValidationFunc)enumVerifier {
   GPBEnumDescriptor *descriptor = [[self alloc] initWithName:name
-                                                      values:valueDescriptions
-                                                  valueCount:valueCount
+                                                  valueNames:valueNames
+                                                      values:values
+                                                       count:valueCount
                                                 enumVerifier:enumVerifier];
   return descriptor;
 }
 
 + (instancetype)
     allocDescriptorForName:(NSString *)name
-                    values:(GPBMessageEnumValueDescription *)valueDescriptions
-                valueCount:(NSUInteger)valueCount
+                valueNames:(const char *)valueNames
+                    values:(const int32_t *)values
+                     count:(uint32_t)valueCount
               enumVerifier:(GPBEnumValidationFunc)enumVerifier
        extraTextFormatInfo:(const char *)extraTextFormatInfo {
   // Call the common case.
   GPBEnumDescriptor *descriptor = [self allocDescriptorForName:name
-                                                        values:valueDescriptions
-                                                    valueCount:valueCount
+                                                    valueNames:valueNames
+                                                        values:values
+                                                         count:valueCount
                                                   enumVerifier:enumVerifier];
   // Set the extra info.
   descriptor->extraTextFormatInfo_ = (const uint8_t *)extraTextFormatInfo;
@@ -724,24 +669,49 @@
 }
 
 - (instancetype)initWithName:(NSString *)name
-                      values:(GPBMessageEnumValueDescription *)valueDescriptions
-                  valueCount:(NSUInteger)valueCount
+                  valueNames:(const char *)valueNames
+                      values:(const int32_t *)values
+                       count:(uint32_t)valueCount
                 enumVerifier:(GPBEnumValidationFunc)enumVerifier {
   if ((self = [super init])) {
     name_ = [name copy];
-    valueDescriptions_ = valueDescriptions;
-    valueDescriptionsCount_ = valueCount;
+    valueNames_ = valueNames;
+    values_ = values;
+    valueCount_ = valueCount;
     enumVerifier_ = enumVerifier;
   }
   return self;
 }
 
+- (void)dealloc {
+  [name_ release];
+  if (nameOffsets_) free(nameOffsets_);
+  [super dealloc];
+}
+
+- (void)calcValueNameOffsets {
+  @synchronized(self) {
+    if (nameOffsets_ != NULL) {
+      return;
+    }
+    uint32_t *offsets = malloc(valueCount_ * sizeof(uint32_t));
+    const char *scan = valueNames_;
+    for (uint32_t i = 0; i < valueCount_; ++i) {
+      offsets[i] = (uint32_t)(scan - valueNames_);
+      while (*scan != '\0') ++scan;
+      ++scan;  // Step over the null.
+    }
+    nameOffsets_ = offsets;
+  }
+}
+
 - (NSString *)enumNameForValue:(int32_t)number {
-  for (NSUInteger i = 0; i < valueDescriptionsCount_; ++i) {
-    GPBMessageEnumValueDescription *scan = &valueDescriptions_[i];
-    if ((scan->number == number) && (scan->name != NULL)) {
-      NSString *fullName =
-          [NSString stringWithFormat:@"%@_%s", name_, scan->name];
+  if (nameOffsets_ == NULL) [self calcValueNameOffsets];
+
+  for (uint32_t i = 0; i < valueCount_; ++i) {
+    if (values_[i] == number) {
+      const char *valueName = valueNames_ + nameOffsets_[i];
+      NSString *fullName = [NSString stringWithFormat:@"%@_%s", name_, valueName];
       return fullName;
     }
   }
@@ -760,12 +730,14 @@
   const char *nameAsCStr = [name UTF8String];
   nameAsCStr += prefixLen;
 
+  if (nameOffsets_ == NULL) [self calcValueNameOffsets];
+
   // Find it.
-  for (NSUInteger i = 0; i < valueDescriptionsCount_; ++i) {
-    GPBMessageEnumValueDescription *scan = &valueDescriptions_[i];
-    if ((scan->name != NULL) && (strcmp(nameAsCStr, scan->name) == 0)) {
+  for (uint32_t i = 0; i < valueCount_; ++i) {
+    const char *valueName = valueNames_ + nameOffsets_[i];
+    if (strcmp(nameAsCStr, valueName) == 0) {
       if (outValue) {
-        *outValue = scan->number;
+        *outValue = values_[i];
       }
       return YES;
     }
@@ -773,34 +745,28 @@
   return NO;
 }
 
-- (void)dealloc {
-  [name_ release];
-  [super dealloc];
-}
-
 - (NSString *)textFormatNameForValue:(int32_t)number {
+  if (nameOffsets_ == NULL) [self calcValueNameOffsets];
+
   // Find the EnumValue descriptor and its index.
-  GPBMessageEnumValueDescription *valueDescriptor = NULL;
-  NSUInteger valueDescriptorIndex;
-  for (valueDescriptorIndex = 0; valueDescriptorIndex < valueDescriptionsCount_;
+  BOOL foundIt = NO;
+  uint32_t valueDescriptorIndex;
+  for (valueDescriptorIndex = 0; valueDescriptorIndex < valueCount_;
        ++valueDescriptorIndex) {
-    GPBMessageEnumValueDescription *scan =
-        &valueDescriptions_[valueDescriptorIndex];
-    if (scan->number == number) {
-      valueDescriptor = scan;
+    if (values_[valueDescriptorIndex] == number) {
+      foundIt = YES;
       break;
     }
   }
 
-  // If we didn't find it, or names were disable at proto compile time, nothing
-  // we can do.
-  if (!valueDescriptor || !valueDescriptor->name) {
+  if (!foundIt) {
     return nil;
   }
 
   NSString *result = nil;
   // Naming adds an underscore between enum name and value name, skip that also.
-  NSString *shortName = @(valueDescriptor->name);
+  const char *valueName = valueNames_ + nameOffsets_[valueDescriptorIndex];
+  NSString *shortName = @(valueName);
 
   // See if it is in the map of special format handling.
   if (extraTextFormatInfo_) {
diff --git a/objectivec/GPBDescriptor_PackagePrivate.h b/objectivec/GPBDescriptor_PackagePrivate.h
index 7987d92..e3d0a80 100644
--- a/objectivec/GPBDescriptor_PackagePrivate.h
+++ b/objectivec/GPBDescriptor_PackagePrivate.h
@@ -36,7 +36,7 @@
 #import "GPBWireFormat.h"
 
 // Describes attributes of the field.
-typedef NS_OPTIONS(uint32_t, GPBFieldFlags) {
+typedef NS_OPTIONS(uint16_t, GPBFieldFlags) {
   // These map to standard protobuf concepts.
   GPBFieldRequired        = 1 << 0,
   GPBFieldRepeated        = 1 << 1,
@@ -44,6 +44,12 @@
   GPBFieldOptional        = 1 << 3,
   GPBFieldHasDefaultValue = 1 << 4,
 
+  // Indicates the field needs custom handling for the TextFormat name, if not
+  // set, the name can be derived from the ObjC name.
+  GPBFieldTextFormatNameCustom = 1 << 6,
+  // Indicates the field has an enum descriptor.
+  GPBFieldHasEnumDescriptor = 1 << 7,
+
   // These are not standard protobuf concepts, they are specific to the
   // Objective C runtime.
 
@@ -62,35 +68,16 @@
   GPBFieldMapKeySFixed64 = 10 << 8,
   GPBFieldMapKeyBool     = 11 << 8,
   GPBFieldMapKeyString   = 12 << 8,
-
-  // Indicates the field needs custom handling for the TextFormat name, if not
-  // set, the name can be derived from the ObjC name.
-  GPBFieldTextFormatNameCustom = 1 << 16,
-  // Indicates the field has an enum descriptor.
-  GPBFieldHasEnumDescriptor = 1 << 17,
 };
 
+// NOTE: The structures defined here have their members ordered to minimize
+// their size. This directly impacts the size of apps since these exist per
+// field/extension.
+
 // Describes a single field in a protobuf as it is represented as an ivar.
 typedef struct GPBMessageFieldDescription {
   // Name of ivar.
   const char *name;
-  // The field number for the ivar.
-  uint32_t number;
-  // The index (in bits) into _has_storage_.
-  //   > 0: the bit to use for a value being set.
-  //   = 0: no storage used.
-  //   < 0: in a oneOf, use a full int32 to record the field active.
-  int32_t hasIndex;
-  // Field flags. Use accessor functions below.
-  GPBFieldFlags flags;
-  // Data type of the ivar.
-  GPBDataType dataType;
-  // Offset of the variable into it's structure struct.
-  size_t offset;
-  // FieldOptions protobuf, serialized as string.
-  const char *fieldOptions;
-
-  GPBGenericValue defaultValue;  // Default value for the ivar.
   union {
     const char *className;  // Name for message class.
     // For enums only: If EnumDescriptors are compiled in, it will be that,
@@ -98,31 +85,32 @@
     GPBEnumDescriptorFunc enumDescFunc;
     GPBEnumValidationFunc enumVerifier;
   } dataTypeSpecific;
+  // The field number for the ivar.
+  uint32_t number;
+  // The index (in bits) into _has_storage_.
+  //   >= 0: the bit to use for a value being set.
+  //   = GPBNoHasBit(INT32_MAX): no storage used.
+  //   < 0: in a oneOf, use a full int32 to record the field active.
+  int32_t hasIndex;
+  // Offset of the variable into it's structure struct.
+  uint32_t offset;
+  // Field flags. Use accessor functions below.
+  GPBFieldFlags flags;
+  // Data type of the ivar.
+  GPBDataType dataType;
 } GPBMessageFieldDescription;
 
-// Describes a oneof.
-typedef struct GPBMessageOneofDescription {
-  // Name of this enum oneof.
-  const char *name;
-  // The index of this oneof in the has_storage.
-  int32_t index;
-} GPBMessageOneofDescription;
+// Fields in messages defined in a 'proto2' syntax file can provide a default
+// value. This struct provides the default along with the field info.
+typedef struct GPBMessageFieldDescriptionWithDefault {
+  // Default value for the ivar.
+  GPBGenericValue defaultValue;
 
-// Describes an enum type defined in a .proto file.
-typedef struct GPBMessageEnumDescription {
-  GPBEnumDescriptorFunc enumDescriptorFunc;
-} GPBMessageEnumDescription;
-
-// Describes an individual enum constant of a particular type.
-typedef struct GPBMessageEnumValueDescription {
-  // Name of this enum constant.
-  const char *name;
-  // Numeric value of this enum constant.
-  int32_t number;
-} GPBMessageEnumValueDescription;
+  GPBMessageFieldDescription core;
+} GPBMessageFieldDescriptionWithDefault;
 
 // Describes attributes of the extension.
-typedef NS_OPTIONS(uint32_t, GPBExtensionOptions) {
+typedef NS_OPTIONS(uint8_t, GPBExtensionOptions) {
   // These map to standard protobuf concepts.
   GPBExtensionRepeated      = 1 << 0,
   GPBExtensionPacked        = 1 << 1,
@@ -131,65 +119,53 @@
 
 // An extension
 typedef struct GPBExtensionDescription {
-  const char *singletonName;
-  GPBDataType dataType;
-  const char *extendedClass;
-  int32_t fieldNumber;
   GPBGenericValue defaultValue;
+  const char *singletonName;
+  const char *extendedClass;
   const char *messageOrGroupClassName;
-  GPBExtensionOptions options;
   GPBEnumDescriptorFunc enumDescriptorFunc;
+  int32_t fieldNumber;
+  GPBDataType dataType;
+  GPBExtensionOptions options;
 } GPBExtensionDescription;
 
+typedef NS_OPTIONS(uint32_t, GPBDescriptorInitializationFlags) {
+  GPBDescriptorInitializationFlag_FieldsWithDefault = 1 << 0,
+  GPBDescriptorInitializationFlag_WireFormat        = 1 << 1,
+};
+
 @interface GPBDescriptor () {
  @package
   NSArray *fields_;
   NSArray *oneofs_;
-  size_t storageSize_;
+  uint32_t storageSize_;
 }
 
-// fieldDescriptions, enumDescriptions, rangeDescriptions, and
-// extraTextFormatInfo have to be long lived, they are held as raw pointers.
+// fieldDescriptions have to be long lived, they are held as raw pointers.
 + (instancetype)
     allocDescriptorForClass:(Class)messageClass
                   rootClass:(Class)rootClass
                        file:(GPBFileDescriptor *)file
-                     fields:(GPBMessageFieldDescription *)fieldDescriptions
-                 fieldCount:(NSUInteger)fieldCount
-                     oneofs:(GPBMessageOneofDescription *)oneofDescriptions
-                 oneofCount:(NSUInteger)oneofCount
-                      enums:(GPBMessageEnumDescription *)enumDescriptions
-                  enumCount:(NSUInteger)enumCount
-                     ranges:(const GPBExtensionRange *)ranges
-                 rangeCount:(NSUInteger)rangeCount
-                storageSize:(size_t)storageSize
-                 wireFormat:(BOOL)wireFormat;
-+ (instancetype)
-    allocDescriptorForClass:(Class)messageClass
-                  rootClass:(Class)rootClass
-                       file:(GPBFileDescriptor *)file
-                     fields:(GPBMessageFieldDescription *)fieldDescriptions
-                 fieldCount:(NSUInteger)fieldCount
-                     oneofs:(GPBMessageOneofDescription *)oneofDescriptions
-                 oneofCount:(NSUInteger)oneofCount
-                      enums:(GPBMessageEnumDescription *)enumDescriptions
-                  enumCount:(NSUInteger)enumCount
-                     ranges:(const GPBExtensionRange *)ranges
-                 rangeCount:(NSUInteger)rangeCount
-                storageSize:(size_t)storageSize
-                 wireFormat:(BOOL)wireFormat
-        extraTextFormatInfo:(const char *)extraTextFormatInfo;
+                     fields:(void *)fieldDescriptions
+                 fieldCount:(uint32_t)fieldCount
+                storageSize:(uint32_t)storageSize
+                      flags:(GPBDescriptorInitializationFlags)flags;
 
 - (instancetype)initWithClass:(Class)messageClass
                          file:(GPBFileDescriptor *)file
                        fields:(NSArray *)fields
-                       oneofs:(NSArray *)oneofs
-                        enums:(NSArray *)enums
-              extensionRanges:(const GPBExtensionRange *)ranges
-         extensionRangesCount:(NSUInteger)rangeCount
-                  storageSize:(size_t)storage
+                  storageSize:(uint32_t)storage
                    wireFormat:(BOOL)wireFormat;
 
+// Called right after init to provide extra information to avoid init having
+// an explosion of args. These pointers are recorded, so they are expected
+// to live for the lifetime of the app.
+- (void)setupOneofs:(const char **)oneofNames
+              count:(uint32_t)count
+      firstHasIndex:(int32_t)firstHasIndex;
+- (void)setupExtraTextInfo:(const char *)extraTextFormatInfo;
+- (void)setupExtensionRanges:(const GPBExtensionRange *)ranges count:(int32_t)count;
+
 @end
 
 @interface GPBFileDescriptor ()
@@ -199,14 +175,12 @@
 
 @interface GPBOneofDescriptor () {
  @package
-  GPBMessageOneofDescription *oneofDescription_;
+  const char *name_;
   NSArray *fields_;
-
   SEL caseSel_;
 }
-- (instancetype)initWithOneofDescription:
-                    (GPBMessageOneofDescription *)oneofDescription
-                                  fields:(NSArray *)fields;
+// name must be long lived.
+- (instancetype)initWithName:(const char *)name fields:(NSArray *)fields;
 @end
 
 @interface GPBFieldDescriptor () {
@@ -222,30 +196,32 @@
 
 // Single initializer
 // description has to be long lived, it is held as a raw pointer.
-- (instancetype)initWithFieldDescription:
-                    (GPBMessageFieldDescription *)description
-                               rootClass:(Class)rootClass
+- (instancetype)initWithFieldDescription:(void *)description
+                         includesDefault:(BOOL)includesDefault
                                   syntax:(GPBFileSyntax)syntax;
 @end
 
 @interface GPBEnumDescriptor ()
-// valueDescriptions and extraTextFormatInfo have to be long lived, they are
+// valueNames, values and extraTextFormatInfo have to be long lived, they are
 // held as raw pointers.
 + (instancetype)
     allocDescriptorForName:(NSString *)name
-                    values:(GPBMessageEnumValueDescription *)valueDescriptions
-                valueCount:(NSUInteger)valueCount
+                valueNames:(const char *)valueNames
+                    values:(const int32_t *)values
+                     count:(uint32_t)valueCount
               enumVerifier:(GPBEnumValidationFunc)enumVerifier;
 + (instancetype)
     allocDescriptorForName:(NSString *)name
-                    values:(GPBMessageEnumValueDescription *)valueDescriptions
-                valueCount:(NSUInteger)valueCount
+                valueNames:(const char *)valueNames
+                    values:(const int32_t *)values
+                     count:(uint32_t)valueCount
               enumVerifier:(GPBEnumValidationFunc)enumVerifier
        extraTextFormatInfo:(const char *)extraTextFormatInfo;
 
 - (instancetype)initWithName:(NSString *)name
-                      values:(GPBMessageEnumValueDescription *)valueDescriptions
-                  valueCount:(NSUInteger)valueCount
+                  valueNames:(const char *)valueNames
+                      values:(const int32_t *)values
+                       count:(uint32_t)valueCount
                 enumVerifier:(GPBEnumValidationFunc)enumVerifier;
 @end
 
@@ -314,5 +290,24 @@
   return (description->options & GPBExtensionSetWireFormat) != 0;
 }
 
+// Helper for compile time assets.
+#ifndef _GPBCompileAssert
+  #if __has_feature(c_static_assert) || __has_extension(c_static_assert)
+    #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg)
+  #else
+    // Pre-Xcode 7 support.
+    #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg
+    #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg)
+    #define _GPBCompileAssert(test, msg) \
+        typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
+  #endif  // __has_feature(c_static_assert) || __has_extension(c_static_assert)
+#endif // _GPBCompileAssert
+
+// Sanity check that there isn't padding between the field description
+// structures with and without a default.
+_GPBCompileAssert(sizeof(GPBMessageFieldDescriptionWithDefault) ==
+                  (sizeof(GPBGenericValue) +
+                   sizeof(GPBMessageFieldDescription)),
+                  DescriptionsWithDefault_different_size_than_expected);
 
 CF_EXTERN_C_END
diff --git a/objectivec/GPBMessage.m b/objectivec/GPBMessage.m
index d5e8d37..94d179b 100644
--- a/objectivec/GPBMessage.m
+++ b/objectivec/GPBMessage.m
@@ -54,18 +54,6 @@
 
 static NSString *const kGPBDataCoderKey = @"GPBData";
 
-#ifndef _GPBCompileAssert
-  #if __has_feature(c_static_assert) || __has_extension(c_static_assert)
-    #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg)
-  #else
-    // Pre-Xcode 7 support.
-    #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg
-    #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg)
-    #define _GPBCompileAssert(test, msg) \
-        typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
-  #endif  // __has_feature(c_static_assert) || __has_extension(c_static_assert)
-#endif // _GPBCompileAssert
-
 //
 // PLEASE REMEMBER:
 //
@@ -789,14 +777,8 @@
                                                    file:fileDescriptor
                                                  fields:NULL
                                              fieldCount:0
-                                                 oneofs:NULL
-                                             oneofCount:0
-                                                  enums:NULL
-                                              enumCount:0
-                                                 ranges:NULL
-                                             rangeCount:0
                                             storageSize:0
-                                             wireFormat:NO];
+                                                  flags:0];
   }
   return descriptor;
 }
@@ -3096,7 +3078,7 @@
       } else {
         GPBOneofDescriptor *oneof = field->containingOneof_;
         if (oneof && (sel == oneof->caseSel_)) {
-          int32_t index = oneof->oneofDescription_->index;
+          int32_t index = GPBFieldHasIndex(field);
           result.impToAdd = imp_implementationWithBlock(^(id obj) {
             return GPBGetHasOneof(obj, index);
           });
diff --git a/objectivec/GPBProtocolBuffers.m b/objectivec/GPBProtocolBuffers.m
index e9cbfb4..8512af7 100644
--- a/objectivec/GPBProtocolBuffers.m
+++ b/objectivec/GPBProtocolBuffers.m
@@ -46,8 +46,6 @@
 #import "GPBWellKnownTypes.m"
 #import "GPBWireFormat.m"
 
-#import "google/protobuf/Descriptor.pbobjc.m"
-
 // Duration and Timestamp are #imported into GPBWellKnownTypes.m to the
 // Objective C categories added will always be linked in with the classes.
 #import "google/protobuf/Any.pbobjc.m"
diff --git a/objectivec/GPBRuntimeTypes.h b/objectivec/GPBRuntimeTypes.h
index e91d86a..0a38b11 100644
--- a/objectivec/GPBRuntimeTypes.h
+++ b/objectivec/GPBRuntimeTypes.h
@@ -67,7 +67,7 @@
 
 // Do not change the order of this enum (or add things to it) without thinking
 // about it very carefully. There are several things that depend on the order.
-typedef enum {
+typedef NS_ENUM(uint8_t, GPBDataType) {
   GPBDataTypeBool = 0,
   GPBDataTypeFixed32,
   GPBDataTypeSFixed32,
@@ -86,7 +86,7 @@
   GPBDataTypeMessage,
   GPBDataTypeGroup,
   GPBDataTypeEnum,
-} GPBDataType;
+};
 
 enum {
   // A count of the number of types in GPBDataType. Separated out from the
diff --git a/objectivec/GPBUtilities.m b/objectivec/GPBUtilities.m
index d4d6471..3e9d11c 100644
--- a/objectivec/GPBUtilities.m
+++ b/objectivec/GPBUtilities.m
@@ -145,9 +145,8 @@
 }
 
 void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
-                        uint32_t fieldNumberNotToClear) {
-  int32_t hasIndex = oneof->oneofDescription_->index;
-  uint32_t fieldNumberSet = GPBGetHasOneof(self, hasIndex);
+                        int32_t oneofHasIndex, uint32_t fieldNumberNotToClear) {
+  uint32_t fieldNumberSet = GPBGetHasOneof(self, oneofHasIndex);
   if ((fieldNumberSet == fieldNumberNotToClear) || (fieldNumberSet == 0)) {
     // Do nothing/nothing set in the oneof.
     return;
@@ -168,7 +167,7 @@
 
   // Set to nothing stored in the oneof.
   // (field number doesn't matter since setting to nothing).
-  GPBSetHasIvar(self, hasIndex, 1, NO);
+  GPBSetHasIvar(self, oneofHasIndex, 1, NO);
 }
 
 #pragma mark - IVar accessors
@@ -200,7 +199,8 @@
 //%            NAME$S                     GPBFileSyntax syntax) {
 //%  GPBOneofDescriptor *oneof = field->containingOneof_;
 //%  if (oneof) {
-//%    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+//%    GPBMessageFieldDescription *fieldDesc = field->description_;
+//%    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
 //%  }
 //%  NSCAssert(self->messageStorage_ != NULL,
 //%            @"%@: All messages should have storage (from init)",
@@ -321,7 +321,8 @@
     // oneof.
     GPBOneofDescriptor *oneof = field->containingOneof_;
     if (oneof) {
-      GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+      GPBMessageFieldDescription *fieldDesc = field->description_;
+      GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
     }
     // Clear "has" if they are being set to nil.
     BOOL setHasValue = (value != nil);
@@ -476,15 +477,15 @@
   GPBSetInt32IvarWithFieldInternal(self, field, value, syntax);
 }
 
-//%PDDM-EXPAND IVAR_POD_ACCESSORS_DEFN(Bool, BOOL)
-// This block of code is generated, do not edit it directly.
-
 BOOL GPBGetMessageBoolField(GPBMessage *self,
                             GPBFieldDescriptor *field) {
   if (GPBGetHasIvarField(self, field)) {
-    uint8_t *storage = (uint8_t *)self->messageStorage_;
-    BOOL *typePtr = (BOOL *)&storage[field->description_->offset];
-    return *typePtr;
+    // Bools are stored in the has bits to avoid needing explicit space in the
+    // storage structure.
+    // (the field number passed to the HasIvar helper doesn't really matter
+    // since the offset is never negative)
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    return GPBGetHasIvar(self, (int32_t)(fieldDesc->offset), fieldDesc->number);
   } else {
     return field.defaultValue.valueBool;
   }
@@ -503,19 +504,18 @@
                                      GPBFieldDescriptor *field,
                                      BOOL value,
                                      GPBFileSyntax syntax) {
+  GPBMessageFieldDescription *fieldDesc = field->description_;
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
-  NSCAssert(self->messageStorage_ != NULL,
-            @"%@: All messages should have storage (from init)",
-            [self class]);
-#if defined(__clang_analyzer__)
-  if (self->messageStorage_ == NULL) return;
-#endif
-  uint8_t *storage = (uint8_t *)self->messageStorage_;
-  BOOL *typePtr = (BOOL *)&storage[field->description_->offset];
-  *typePtr = value;
+
+  // Bools are stored in the has bits to avoid needing explicit space in the
+  // storage structure.
+  // (the field number passed to the HasIvar helper doesn't really matter since
+  // the offset is never negative)
+  GPBSetHasIvar(self, (int32_t)(fieldDesc->offset), fieldDesc->number, value);
+
   // proto2: any value counts as having been set; proto3, it
   // has to be a non zero value.
   BOOL hasValue =
@@ -553,7 +553,8 @@
                                       GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
@@ -601,7 +602,8 @@
                                        GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
@@ -649,7 +651,8 @@
                                       GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
@@ -697,7 +700,8 @@
                                        GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
@@ -745,7 +749,8 @@
                                       GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
@@ -793,7 +798,8 @@
                                        GPBFileSyntax syntax) {
   GPBOneofDescriptor *oneof = field->containingOneof_;
   if (oneof) {
-    GPBMaybeClearOneof(self, oneof, GPBFieldNumber(field));
+    GPBMessageFieldDescription *fieldDesc = field->description_;
+    GPBMaybeClearOneof(self, oneof, fieldDesc->hasIndex, fieldDesc->number);
   }
   NSCAssert(self->messageStorage_ != NULL,
             @"%@: All messages should have storage (from init)",
@@ -812,7 +818,7 @@
   GPBBecomeVisibleToAutocreator(self);
 }
 
-//%PDDM-EXPAND-END (7 expansions)
+//%PDDM-EXPAND-END (6 expansions)
 
 // Aliases are function calls that are virtually the same.
 
diff --git a/objectivec/GPBUtilities_PackagePrivate.h b/objectivec/GPBUtilities_PackagePrivate.h
index cac551f..a6b6c84 100644
--- a/objectivec/GPBUtilities_PackagePrivate.h
+++ b/objectivec/GPBUtilities_PackagePrivate.h
@@ -185,7 +185,7 @@
 }
 
 void GPBMaybeClearOneof(GPBMessage *self, GPBOneofDescriptor *oneof,
-                        uint32_t fieldNumberNotToClear);
+                        int32_t oneofHasIndex, uint32_t fieldNumberNotToClear);
 
 //%PDDM-DEFINE GPB_IVAR_SET_DECL(NAME, TYPE)
 //%void GPBSet##NAME##IvarWithFieldInternal(GPBMessage *self,
diff --git a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
index 78c3f9b..3093425 100644
--- a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj
@@ -7,7 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		2CFB390415C718CE00CBF84D /* Descriptor.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */; };
 		5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */; };
 		7461B5360F94FB4600A0C422 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
 		7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */; };
@@ -27,7 +26,6 @@
 		8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
 		8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
-		8B96157514CA019D00A2AC0B /* Descriptor.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */; };
 		8BBEA4A9147C727D00C4ADB7 /* GPBCodedInputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69B0F94FDF800A0C422 /* GPBCodedInputStreamTests.m */; };
 		8BBEA4AA147C727D00C4ADB7 /* GPBCodedOuputStreamTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B69D0F94FDF800A0C422 /* GPBCodedOuputStreamTests.m */; };
 		8BBEA4AC147C727D00C4ADB7 /* GPBMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B6A30F94FDF800A0C422 /* GPBMessageTests.m */; };
@@ -140,10 +138,8 @@
 		8B4248D51A92826400BC1EC6 /* Timestamp.pbobjc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Timestamp.pbobjc.h; path = google/protobuf/Timestamp.pbobjc.h; sourceTree = "<group>"; };
 		8B4248D61A92826400BC1EC6 /* Timestamp.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Timestamp.pbobjc.m; path = google/protobuf/Timestamp.pbobjc.m; sourceTree = "<group>"; };
 		8B4248DB1A92933A00BC1EC6 /* GPBWellKnownTypesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypesTest.m; sourceTree = "<group>"; };
-		8B42494B1A92A16600BC1EC6 /* descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = descriptor.proto; path = ../src/google/protobuf/descriptor.proto; sourceTree = "<group>"; };
 		8B42494C1A92A16600BC1EC6 /* duration.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = duration.proto; path = ../src/google/protobuf/duration.proto; sourceTree = "<group>"; };
 		8B42494D1A92A16600BC1EC6 /* timestamp.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = timestamp.proto; path = ../src/google/protobuf/timestamp.proto; sourceTree = "<group>"; };
-		8B54585814DCC34E003D7338 /* Descriptor.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Descriptor.pbobjc.h; path = google/protobuf/Descriptor.pbobjc.h; sourceTree = SOURCE_ROOT; };
 		8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
 		8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
 		8B7E6A7414893DBA00F8884A /* unittest_custom_options.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_custom_options.proto; path = ../../src/google/protobuf/unittest_custom_options.proto; sourceTree = "<group>"; };
@@ -162,7 +158,6 @@
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
-		8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Descriptor.pbobjc.m; path = google/protobuf/Descriptor.pbobjc.m; sourceTree = SOURCE_ROOT; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
 		F401DC2A1A8D444600FCC765 /* GPBArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBArray.h; sourceTree = "<group>"; };
 		F401DC2B1A8D444600FCC765 /* GPBArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArray.m; sourceTree = "<group>"; };
@@ -300,9 +295,6 @@
 				F4E675881B21D0000054530B /* Api.pbobjc.h */,
 				F4E675891B21D0000054530B /* Api.pbobjc.m */,
 				F4E675A71B21D05C0054530B /* api.proto */,
-				8B54585814DCC34E003D7338 /* Descriptor.pbobjc.h */,
-				8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */,
-				8B42494B1A92A16600BC1EC6 /* descriptor.proto */,
 				8B4248D31A92826400BC1EC6 /* Duration.pbobjc.h */,
 				8B4248D41A92826400BC1EC6 /* Duration.pbobjc.m */,
 				8B42494C1A92A16600BC1EC6 /* duration.proto */,
@@ -634,7 +626,6 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				2CFB390415C718CE00CBF84D /* Descriptor.pbobjc.m in Sources */,
 				7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */,
 				F4E6759B1B21D0000054530B /* Empty.pbobjc.m in Sources */,
 				7461B53D0F94FB4E00A0C422 /* GPBCodedOutputStream.m in Sources */,
@@ -696,7 +687,6 @@
 				8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */,
 				8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */,
 				F4E675B11B21D0A70054530B /* FieldMask.pbobjc.m in Sources */,
-				8B96157514CA019D00A2AC0B /* Descriptor.pbobjc.m in Sources */,
 				8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */,
 				F4E675AF1B21D0A70054530B /* Api.pbobjc.m in Sources */,
 			);
diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
index 5d96c05..b622181 100644
--- a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
+++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj
@@ -7,7 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		2CFB390415C718CE00CBF84D /* Descriptor.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */; };
 		5102DABC1891A073002037B6 /* GPBConcurrencyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5102DABB1891A052002037B6 /* GPBConcurrencyTests.m */; };
 		7461B5360F94FB4600A0C422 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
 		7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 7461B48F0F94F99000A0C422 /* GPBCodedInputStream.m */; };
@@ -27,7 +26,6 @@
 		8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B79657914992E3E002FFBFC /* GPBRootObject.m */; };
 		8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B8B615C17DF7056002EE618 /* GPBARCUnittestProtos.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; };
 		8B96157414C8C38C00A2AC0B /* GPBDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B96157314C8C38C00A2AC0B /* GPBDescriptor.m */; };
-		8B96157514CA019D00A2AC0B /* Descriptor.pbobjc.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */; };
 		8B9742331A89D19F00DCE92C /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8B9742321A89D19F00DCE92C /* LaunchScreen.xib */; };
 		8B9742431A8AAA7800DCE92C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B9742421A8AAA7800DCE92C /* CoreGraphics.framework */; };
 		8B9A5EA61831993600A9D33B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; };
@@ -155,7 +153,6 @@
 		8B4248E21A929C8900BC1EC6 /* GPBWellKnownTypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypes.m; sourceTree = "<group>"; };
 		8B4248E51A929C9900BC1EC6 /* GPBWellKnownTypesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBWellKnownTypesTest.m; sourceTree = "<group>"; };
 		8B4249481A92A02300BC1EC6 /* timestamp.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = timestamp.proto; path = ../src/google/protobuf/timestamp.proto; sourceTree = "<group>"; };
-		8B4249491A92A0BA00BC1EC6 /* descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = descriptor.proto; path = ../src/google/protobuf/descriptor.proto; sourceTree = "<group>"; };
 		8B42494A1A92A0BA00BC1EC6 /* duration.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = duration.proto; path = ../src/google/protobuf/duration.proto; sourceTree = "<group>"; };
 		8B79657814992E3E002FFBFC /* GPBRootObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GPBRootObject.h; sourceTree = "<group>"; };
 		8B79657914992E3E002FFBFC /* GPBRootObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBRootObject.m; sourceTree = "<group>"; };
@@ -183,7 +180,6 @@
 		8BCF338814ED799900BC5317 /* GPBProtocolBuffers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPBProtocolBuffers.m; sourceTree = "<group>"; };
 		8BD3981D14BE54220081D629 /* unittest_enormous_descriptor.proto */ = {isa = PBXFileReference; lastKnownFileType = text; name = unittest_enormous_descriptor.proto; path = ../../src/google/protobuf/unittest_enormous_descriptor.proto; sourceTree = "<group>"; };
 		8BD3981E14BE59D70081D629 /* GPBUnittestProtos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBUnittestProtos.m; sourceTree = "<group>"; };
-		8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Descriptor.pbobjc.m; path = google/protobuf/Descriptor.pbobjc.m; sourceTree = SOURCE_ROOT; };
 		8BEB5AE01498033E0078BF9D /* GPBRuntimeTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPBRuntimeTypes.h; sourceTree = "<group>"; };
 		F401DC341A8E5C6F00FCC765 /* GPBArrayTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBArrayTests.m; sourceTree = "<group>"; };
 		F41C175C1833D3310064ED4D /* GPBPerfTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GPBPerfTests.m; sourceTree = "<group>"; };
@@ -224,7 +220,6 @@
 		F4E675B71B21D1440054530B /* Any.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Any.pbobjc.m; path = google/protobuf/Any.pbobjc.m; sourceTree = "<group>"; };
 		F4E675B81B21D1440054530B /* Api.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Api.pbobjc.h; path = google/protobuf/Api.pbobjc.h; sourceTree = "<group>"; };
 		F4E675B91B21D1440054530B /* Api.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Api.pbobjc.m; path = google/protobuf/Api.pbobjc.m; sourceTree = "<group>"; };
-		F4E675BA1B21D1440054530B /* Descriptor.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Descriptor.pbobjc.h; path = google/protobuf/Descriptor.pbobjc.h; sourceTree = "<group>"; };
 		F4E675BB1B21D1440054530B /* Empty.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Empty.pbobjc.h; path = google/protobuf/Empty.pbobjc.h; sourceTree = "<group>"; };
 		F4E675BC1B21D1440054530B /* Empty.pbobjc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Empty.pbobjc.m; path = google/protobuf/Empty.pbobjc.m; sourceTree = "<group>"; };
 		F4E675BD1B21D1440054530B /* FieldMask.pbobjc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FieldMask.pbobjc.h; path = google/protobuf/FieldMask.pbobjc.h; sourceTree = "<group>"; };
@@ -335,9 +330,6 @@
 				F4E675B81B21D1440054530B /* Api.pbobjc.h */,
 				F4E675B91B21D1440054530B /* Api.pbobjc.m */,
 				F4E675D91B21D1DE0054530B /* api.proto */,
-				F4E675BA1B21D1440054530B /* Descriptor.pbobjc.h */,
-				8BD3982214BE5B0C0081D629 /* Descriptor.pbobjc.m */,
-				8B4249491A92A0BA00BC1EC6 /* descriptor.proto */,
 				8B4248DD1A929C7D00BC1EC6 /* Duration.pbobjc.h */,
 				8B4248DE1A929C7D00BC1EC6 /* Duration.pbobjc.m */,
 				8B42494A1A92A0BA00BC1EC6 /* duration.proto */,
@@ -722,7 +714,6 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				2CFB390415C718CE00CBF84D /* Descriptor.pbobjc.m in Sources */,
 				7461B53C0F94FB4E00A0C422 /* GPBCodedInputStream.m in Sources */,
 				F4E675D21B21D1620054530B /* Empty.pbobjc.m in Sources */,
 				F4487C731A9F906200531423 /* GPBArray.m in Sources */,
@@ -792,7 +783,6 @@
 				8B79657D14992E3F002FFBFC /* GPBRootObject.m in Sources */,
 				8BD3981F14BE59D70081D629 /* GPBUnittestProtos.m in Sources */,
 				F4E675CB1B21D1610054530B /* FieldMask.pbobjc.m in Sources */,
-				8B96157514CA019D00A2AC0B /* Descriptor.pbobjc.m in Sources */,
 				8B8B615D17DF7056002EE618 /* GPBARCUnittestProtos.m in Sources */,
 				F4E675C91B21D1610054530B /* Api.pbobjc.m in Sources */,
 			);
diff --git a/objectivec/Tests/GPBARCUnittestProtos.m b/objectivec/Tests/GPBARCUnittestProtos.m
index d040886..28d2396 100644
--- a/objectivec/Tests/GPBARCUnittestProtos.m
+++ b/objectivec/Tests/GPBARCUnittestProtos.m
@@ -34,6 +34,11 @@
 
 // Makes sure all the generated headers compile with ARC on.
 
+// The unittest_custom_options.proto extends the messages in descriptor.proto
+// so we build it in to test extending in general. The library doesn't provide
+// a descriptor as it doesn't use the classes/enums.
+#import "google/protobuf/Descriptor.pbobjc.h"
+
 #import "google/protobuf/Unittest.pbobjc.h"
 #import "google/protobuf/UnittestCustomOptions.pbobjc.h"
 #import "google/protobuf/UnittestCycle.pbobjc.h"
diff --git a/objectivec/Tests/GPBDescriptorTests.m b/objectivec/Tests/GPBDescriptorTests.m
index ccdbb64..a1923c9 100644
--- a/objectivec/Tests/GPBDescriptorTests.m
+++ b/objectivec/Tests/GPBDescriptorTests.m
@@ -153,19 +153,6 @@
   XCTAssertFalse([fieldDescriptor isValidEnumValue:-2]);
 }
 
-- (void)testEnumDescriptorLookup {
-  GPBDescriptor *descriptor = [TestAllTypes descriptor];
-  GPBEnumDescriptor *enumDescriptor =
-      [descriptor enumWithName:@"TestAllTypes_NestedEnum"];
-  XCTAssertNotNil(enumDescriptor);
-
-  // Descriptor cannot find foreign or imported enums.
-  enumDescriptor = [descriptor enumWithName:@"ForeignEnumEnum"];
-  XCTAssertNil(enumDescriptor);
-  enumDescriptor = [descriptor enumWithName:@"ImportEnumEnum"];
-  XCTAssertNil(enumDescriptor);
-}
-
 - (void)testOneofDescriptor {
   GPBDescriptor *descriptor = [TestOneof2 descriptor];
 
diff --git a/objectivec/Tests/GPBUnittestProtos.m b/objectivec/Tests/GPBUnittestProtos.m
index 50c4dfa..d19beee 100644
--- a/objectivec/Tests/GPBUnittestProtos.m
+++ b/objectivec/Tests/GPBUnittestProtos.m
@@ -31,6 +31,11 @@
 // Collects all the compiled protos into one file and compiles them to make sure
 // the compiler is generating valid code.
 
+// The unittest_custom_options.proto extends the messages in descriptor.proto
+// so we build it in to test extending in general. The library doesn't provide
+// a descriptor as it doesn't use the classes/enums.
+#import "google/protobuf/Descriptor.pbobjc.m"
+
 #import "google/protobuf/MapProto2Unittest.pbobjc.m"
 #import "google/protobuf/MapUnittest.pbobjc.m"
 #import "google/protobuf/Unittest.pbobjc.m"
diff --git a/objectivec/generate_descriptors_proto.sh b/objectivec/generate_well_known_types.sh
similarity index 85%
rename from objectivec/generate_descriptors_proto.sh
rename to objectivec/generate_well_known_types.sh
index 84ba073..be9b38a 100755
--- a/objectivec/generate_descriptors_proto.sh
+++ b/objectivec/generate_well_known_types.sh
@@ -1,9 +1,9 @@
 #!/bin/bash
 
-# Run this script to regenerate descriptor.pbobjc.{h,m} after the protocol
-# compiler changes.
+# Run this script to regenerate *.pbobjc.{h,m} for the well known types after
+# the protocol compiler changes.
 
-# HINT:  Flags passed to generate_descriptor_proto.sh will be passed directly
+# HINT:  Flags passed to generate_well_known_types.sh will be passed directly
 #   to make when building protoc.  This is particularly useful for passing
 #   -j4 to run 4 jobs simultaneously.
 
@@ -37,7 +37,6 @@
 declare -a RUNTIME_PROTO_FILES=( \
   google/protobuf/any.proto \
   google/protobuf/api.proto \
-  google/protobuf/descriptor.proto \
   google/protobuf/duration.proto \
   google/protobuf/empty.proto \
   google/protobuf/field_mask.proto \
diff --git a/objectivec/google/protobuf/Any.pbobjc.h b/objectivec/google/protobuf/Any.pbobjc.h
index a204ae9..79ec0fb 100644
--- a/objectivec/google/protobuf/Any.pbobjc.h
+++ b/objectivec/google/protobuf/Any.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/Any.pbobjc.m b/objectivec/google/protobuf/Any.pbobjc.m
index b41102a..7cbf0de 100644
--- a/objectivec/google/protobuf/Any.pbobjc.m
+++ b/objectivec/google/protobuf/Any.pbobjc.m
@@ -46,47 +46,36 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "typeURL",
+        .dataTypeSpecific.className = NULL,
         .number = GPBAny_FieldNumber_TypeURL,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBAny__storage_, typeURL),
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBAny__storage_, typeURL),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBAny_FieldNumber_Value,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBAny__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBytes,
-        .offset = offsetof(GPBAny__storage_, value),
-        .defaultValue.valueData = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
-#if GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
-    const char *extraTextFormatInfo = NULL;
-#else
-    static const char *extraTextFormatInfo = "\001\001\004\241!!\000";
-#endif  // GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBAny class]
                                      rootClass:[GPBAnyRoot class]
                                           file:GPBAnyRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBAny__storage_)
-                                    wireFormat:NO
-                           extraTextFormatInfo:extraTextFormatInfo];
+                                         flags:0];
+#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
+    static const char *extraTextFormatInfo =
+        "\001\001\004\241!!\000";
+    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];
+#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Api.pbobjc.h b/objectivec/google/protobuf/Api.pbobjc.h
index 271a166..3f7e99c 100644
--- a/objectivec/google/protobuf/Api.pbobjc.h
+++ b/objectivec/google/protobuf/Api.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/Api.pbobjc.m b/objectivec/google/protobuf/Api.pbobjc.m
index d964ff4..2b2f62e 100644
--- a/objectivec/google/protobuf/Api.pbobjc.m
+++ b/objectivec/google/protobuf/Api.pbobjc.m
@@ -71,80 +71,66 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBApi_FieldNumber_Name,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, name),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBApi__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "methodsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBMethod),
         .number = GPBApi_FieldNumber_MethodsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, methodsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBApi__storage_, methodsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMethod),
-        .fieldOptions = NULL,
       },
       {
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBApi_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBApi__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       {
         .name = "version",
+        .dataTypeSpecific.className = NULL,
         .number = GPBApi_FieldNumber_Version,
-        .hasIndex = 3,
+        .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, version),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBApi__storage_, version),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "sourceContext",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .number = GPBApi_FieldNumber_SourceContext,
-        .hasIndex = 4,
+        .hasIndex = 2,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, sourceContext),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBApi__storage_, sourceContext),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
-        .fieldOptions = NULL,
       },
       {
         .name = "mixinsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBMixin),
         .number = GPBApi_FieldNumber_MixinsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, mixinsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBApi__storage_, mixinsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMixin),
-        .fieldOptions = NULL,
       },
       {
         .name = "syntax",
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
         .number = GPBApi_FieldNumber_Syntax,
-        .hasIndex = 6,
+        .hasIndex = 3,
+        .offset = (uint32_t)offsetof(GPBApi__storage_, syntax),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBApi__storage_, syntax),
-        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
-        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -152,15 +138,9 @@
                                      rootClass:[GPBApiRoot class]
                                           file:GPBApiRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBApi__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -195,8 +175,6 @@
 
 typedef struct GPBMethod__storage_ {
   uint32_t _has_storage_[1];
-  BOOL requestStreaming;
-  BOOL responseStreaming;
   GPBSyntax syntax;
   NSString *name;
   NSString *requestTypeURL;
@@ -212,102 +190,81 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_Name,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, name),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethod__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "requestTypeURL",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_RequestTypeURL,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, requestTypeURL),
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethod__storage_, requestTypeURL),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "requestStreaming",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_RequestStreaming,
         .hasIndex = 2,
+        .offset = 3,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethod__storage_, requestStreaming),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "responseTypeURL",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_ResponseTypeURL,
-        .hasIndex = 3,
+        .hasIndex = 4,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, responseTypeURL),
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethod__storage_, responseTypeURL),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "responseStreaming",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMethod_FieldNumber_ResponseStreaming,
-        .hasIndex = 4,
+        .hasIndex = 5,
+        .offset = 6,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethod__storage_, responseStreaming),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBMethod_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBMethod__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       {
         .name = "syntax",
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
         .number = GPBMethod_FieldNumber_Syntax,
-        .hasIndex = 6,
+        .hasIndex = 7,
+        .offset = (uint32_t)offsetof(GPBMethod__storage_, syntax),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBMethod__storage_, syntax),
-        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
-        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
-        .fieldOptions = NULL,
       },
     };
-#if GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
-    const char *extraTextFormatInfo = NULL;
-#else
-    static const char *extraTextFormatInfo = "\002\002\007\244\241!!\000\004\010\244\241!!\000";
-#endif  // GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBMethod class]
                                      rootClass:[GPBApiRoot class]
                                           file:GPBApiRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBMethod__storage_)
-                                    wireFormat:NO
-                           extraTextFormatInfo:extraTextFormatInfo];
+                                         flags:0];
+#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
+    static const char *extraTextFormatInfo =
+        "\002\002\007\244\241!!\000\004\010\244\241!!\000";
+    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];
+#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -349,25 +306,21 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMixin_FieldNumber_Name,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBMixin__storage_, name),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMixin__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "root",
+        .dataTypeSpecific.className = NULL,
         .number = GPBMixin_FieldNumber_Root,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBMixin__storage_, root),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMixin__storage_, root),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -375,15 +328,9 @@
                                      rootClass:[GPBApiRoot class]
                                           file:GPBApiRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBMixin__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Descriptor.pbobjc.h b/objectivec/google/protobuf/Descriptor.pbobjc.h
deleted file mode 100644
index 109711c..0000000
--- a/objectivec/google/protobuf/Descriptor.pbobjc.h
+++ /dev/null
@@ -1,1279 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: google/protobuf/descriptor.proto
-
-#import "GPBProtocolBuffers.h"
-
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
-#error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
-#endif
-
-// @@protoc_insertion_point(imports)
-
-CF_EXTERN_C_BEGIN
-
-@class GPBDescriptorProto;
-@class GPBDescriptorProto_ExtensionRange;
-@class GPBDescriptorProto_ReservedRange;
-@class GPBEnumDescriptorProto;
-@class GPBEnumOptions;
-@class GPBEnumValueDescriptorProto;
-@class GPBEnumValueOptions;
-@class GPBFieldDescriptorProto;
-@class GPBFieldOptions;
-@class GPBFileDescriptorProto;
-@class GPBFileOptions;
-@class GPBGeneratedCodeInfo_Annotation;
-@class GPBMessageOptions;
-@class GPBMethodDescriptorProto;
-@class GPBMethodOptions;
-@class GPBOneofDescriptorProto;
-@class GPBServiceDescriptorProto;
-@class GPBServiceOptions;
-@class GPBSourceCodeInfo;
-@class GPBSourceCodeInfo_Location;
-@class GPBUninterpretedOption;
-@class GPBUninterpretedOption_NamePart;
-
-NS_ASSUME_NONNULL_BEGIN
-
-#pragma mark - Enum GPBFieldDescriptorProto_Type
-
-typedef GPB_ENUM(GPBFieldDescriptorProto_Type) {
-  /// 0 is reserved for errors.
-  /// Order is weird for historical reasons.
-  GPBFieldDescriptorProto_Type_TypeDouble = 1,
-  GPBFieldDescriptorProto_Type_TypeFloat = 2,
-
-  /// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if
-  /// negative values are likely.
-  GPBFieldDescriptorProto_Type_TypeInt64 = 3,
-  GPBFieldDescriptorProto_Type_TypeUint64 = 4,
-
-  /// Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if
-  /// negative values are likely.
-  GPBFieldDescriptorProto_Type_TypeInt32 = 5,
-  GPBFieldDescriptorProto_Type_TypeFixed64 = 6,
-  GPBFieldDescriptorProto_Type_TypeFixed32 = 7,
-  GPBFieldDescriptorProto_Type_TypeBool = 8,
-  GPBFieldDescriptorProto_Type_TypeString = 9,
-
-  /// Tag-delimited aggregate.
-  GPBFieldDescriptorProto_Type_TypeGroup = 10,
-
-  /// Length-delimited aggregate.
-  GPBFieldDescriptorProto_Type_TypeMessage = 11,
-
-  /// New in version 2.
-  GPBFieldDescriptorProto_Type_TypeBytes = 12,
-  GPBFieldDescriptorProto_Type_TypeUint32 = 13,
-  GPBFieldDescriptorProto_Type_TypeEnum = 14,
-  GPBFieldDescriptorProto_Type_TypeSfixed32 = 15,
-  GPBFieldDescriptorProto_Type_TypeSfixed64 = 16,
-
-  /// Uses ZigZag encoding.
-  GPBFieldDescriptorProto_Type_TypeSint32 = 17,
-
-  /// Uses ZigZag encoding.
-  GPBFieldDescriptorProto_Type_TypeSint64 = 18,
-};
-
-GPBEnumDescriptor *GPBFieldDescriptorProto_Type_EnumDescriptor(void);
-
-/// Checks to see if the given value is defined by the enum or was not known at
-/// the time this source was generated.
-BOOL GPBFieldDescriptorProto_Type_IsValidValue(int32_t value);
-
-#pragma mark - Enum GPBFieldDescriptorProto_Label
-
-typedef GPB_ENUM(GPBFieldDescriptorProto_Label) {
-  /// 0 is reserved for errors
-  GPBFieldDescriptorProto_Label_LabelOptional = 1,
-  GPBFieldDescriptorProto_Label_LabelRequired = 2,
-
-  /// TODO(sanjay): Should we add LABEL_MAP?
-  GPBFieldDescriptorProto_Label_LabelRepeated = 3,
-};
-
-GPBEnumDescriptor *GPBFieldDescriptorProto_Label_EnumDescriptor(void);
-
-/// Checks to see if the given value is defined by the enum or was not known at
-/// the time this source was generated.
-BOOL GPBFieldDescriptorProto_Label_IsValidValue(int32_t value);
-
-#pragma mark - Enum GPBFileOptions_OptimizeMode
-
-/// Generated classes can be optimized for speed or code size.
-typedef GPB_ENUM(GPBFileOptions_OptimizeMode) {
-  /// Generate complete code for parsing, serialization,
-  GPBFileOptions_OptimizeMode_Speed = 1,
-
-  /// etc.
-  GPBFileOptions_OptimizeMode_CodeSize = 2,
-
-  /// Generate code using MessageLite and the lite runtime.
-  GPBFileOptions_OptimizeMode_LiteRuntime = 3,
-};
-
-GPBEnumDescriptor *GPBFileOptions_OptimizeMode_EnumDescriptor(void);
-
-/// Checks to see if the given value is defined by the enum or was not known at
-/// the time this source was generated.
-BOOL GPBFileOptions_OptimizeMode_IsValidValue(int32_t value);
-
-#pragma mark - Enum GPBFieldOptions_CType
-
-typedef GPB_ENUM(GPBFieldOptions_CType) {
-  /// Default mode.
-  GPBFieldOptions_CType_String = 0,
-  GPBFieldOptions_CType_Cord = 1,
-  GPBFieldOptions_CType_StringPiece = 2,
-};
-
-GPBEnumDescriptor *GPBFieldOptions_CType_EnumDescriptor(void);
-
-/// Checks to see if the given value is defined by the enum or was not known at
-/// the time this source was generated.
-BOOL GPBFieldOptions_CType_IsValidValue(int32_t value);
-
-#pragma mark - Enum GPBFieldOptions_JSType
-
-typedef GPB_ENUM(GPBFieldOptions_JSType) {
-  /// Use the default type.
-  GPBFieldOptions_JSType_JsNormal = 0,
-
-  /// Use JavaScript strings.
-  GPBFieldOptions_JSType_JsString = 1,
-
-  /// Use JavaScript numbers.
-  GPBFieldOptions_JSType_JsNumber = 2,
-};
-
-GPBEnumDescriptor *GPBFieldOptions_JSType_EnumDescriptor(void);
-
-/// Checks to see if the given value is defined by the enum or was not known at
-/// the time this source was generated.
-BOOL GPBFieldOptions_JSType_IsValidValue(int32_t value);
-
-#pragma mark - GPBDescriptorRoot
-
-/// Exposes the extension registry for this file.
-///
-/// The base class provides:
-/// @code
-///   + (GPBExtensionRegistry *)extensionRegistry;
-/// @endcode
-/// which is a @c GPBExtensionRegistry that includes all the extensions defined by
-/// this file and all files that it depends on.
-@interface GPBDescriptorRoot : GPBRootObject
-@end
-
-#pragma mark - GPBFileDescriptorSet
-
-typedef GPB_ENUM(GPBFileDescriptorSet_FieldNumber) {
-  GPBFileDescriptorSet_FieldNumber_FileArray = 1,
-};
-
-/// The protocol compiler can output a FileDescriptorSet containing the .proto
-/// files it parses.
-@interface GPBFileDescriptorSet : GPBMessage
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBFileDescriptorProto*> *fileArray;
-/// The number of items in @c fileArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger fileArray_Count;
-
-@end
-
-#pragma mark - GPBFileDescriptorProto
-
-typedef GPB_ENUM(GPBFileDescriptorProto_FieldNumber) {
-  GPBFileDescriptorProto_FieldNumber_Name = 1,
-  GPBFileDescriptorProto_FieldNumber_Package = 2,
-  GPBFileDescriptorProto_FieldNumber_DependencyArray = 3,
-  GPBFileDescriptorProto_FieldNumber_MessageTypeArray = 4,
-  GPBFileDescriptorProto_FieldNumber_EnumTypeArray = 5,
-  GPBFileDescriptorProto_FieldNumber_ServiceArray = 6,
-  GPBFileDescriptorProto_FieldNumber_ExtensionArray = 7,
-  GPBFileDescriptorProto_FieldNumber_Options = 8,
-  GPBFileDescriptorProto_FieldNumber_SourceCodeInfo = 9,
-  GPBFileDescriptorProto_FieldNumber_PublicDependencyArray = 10,
-  GPBFileDescriptorProto_FieldNumber_WeakDependencyArray = 11,
-  GPBFileDescriptorProto_FieldNumber_Syntax = 12,
-};
-
-/// Describes a complete .proto file.
-@interface GPBFileDescriptorProto : GPBMessage
-
-/// file name, relative to root of source tree
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-/// Test to see if @c name has been set.
-@property(nonatomic, readwrite) BOOL hasName;
-
-/// e.g. "foo", "foo.bar", etc.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *package;
-/// Test to see if @c package has been set.
-@property(nonatomic, readwrite) BOOL hasPackage;
-
-/// Names of files imported by this file.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *dependencyArray;
-/// The number of items in @c dependencyArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger dependencyArray_Count;
-
-/// Indexes of the public imported files in the dependency list above.
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *publicDependencyArray;
-/// The number of items in @c publicDependencyArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger publicDependencyArray_Count;
-
-/// Indexes of the weak imported files in the dependency list.
-/// For Google-internal migration only. Do not use.
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *weakDependencyArray;
-/// The number of items in @c weakDependencyArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger weakDependencyArray_Count;
-
-/// All top-level definitions in this file.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBDescriptorProto*> *messageTypeArray;
-/// The number of items in @c messageTypeArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger messageTypeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumDescriptorProto*> *enumTypeArray;
-/// The number of items in @c enumTypeArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger enumTypeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBServiceDescriptorProto*> *serviceArray;
-/// The number of items in @c serviceArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger serviceArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBFieldDescriptorProto*> *extensionArray;
-/// The number of items in @c extensionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger extensionArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) GPBFileOptions *options;
-/// Test to see if @c options has been set.
-@property(nonatomic, readwrite) BOOL hasOptions;
-
-/// This field contains optional information about the original source code.
-/// You may safely remove this entire field without harming runtime
-/// functionality of the descriptors -- the information is needed only by
-/// development tools.
-@property(nonatomic, readwrite, strong, null_resettable) GPBSourceCodeInfo *sourceCodeInfo;
-/// Test to see if @c sourceCodeInfo has been set.
-@property(nonatomic, readwrite) BOOL hasSourceCodeInfo;
-
-/// The syntax of the proto file.
-/// The supported values are "proto2" and "proto3".
-@property(nonatomic, readwrite, copy, null_resettable) NSString *syntax;
-/// Test to see if @c syntax has been set.
-@property(nonatomic, readwrite) BOOL hasSyntax;
-
-@end
-
-#pragma mark - GPBDescriptorProto
-
-typedef GPB_ENUM(GPBDescriptorProto_FieldNumber) {
-  GPBDescriptorProto_FieldNumber_Name = 1,
-  GPBDescriptorProto_FieldNumber_FieldArray = 2,
-  GPBDescriptorProto_FieldNumber_NestedTypeArray = 3,
-  GPBDescriptorProto_FieldNumber_EnumTypeArray = 4,
-  GPBDescriptorProto_FieldNumber_ExtensionRangeArray = 5,
-  GPBDescriptorProto_FieldNumber_ExtensionArray = 6,
-  GPBDescriptorProto_FieldNumber_Options = 7,
-  GPBDescriptorProto_FieldNumber_OneofDeclArray = 8,
-  GPBDescriptorProto_FieldNumber_ReservedRangeArray = 9,
-  GPBDescriptorProto_FieldNumber_ReservedNameArray = 10,
-};
-
-/// Describes a message type.
-@interface GPBDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-/// Test to see if @c name has been set.
-@property(nonatomic, readwrite) BOOL hasName;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBFieldDescriptorProto*> *fieldArray;
-/// The number of items in @c fieldArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger fieldArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBFieldDescriptorProto*> *extensionArray;
-/// The number of items in @c extensionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger extensionArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBDescriptorProto*> *nestedTypeArray;
-/// The number of items in @c nestedTypeArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger nestedTypeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumDescriptorProto*> *enumTypeArray;
-/// The number of items in @c enumTypeArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger enumTypeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBDescriptorProto_ExtensionRange*> *extensionRangeArray;
-/// The number of items in @c extensionRangeArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger extensionRangeArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBOneofDescriptorProto*> *oneofDeclArray;
-/// The number of items in @c oneofDeclArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger oneofDeclArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) GPBMessageOptions *options;
-/// Test to see if @c options has been set.
-@property(nonatomic, readwrite) BOOL hasOptions;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBDescriptorProto_ReservedRange*> *reservedRangeArray;
-/// The number of items in @c reservedRangeArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger reservedRangeArray_Count;
-
-/// Reserved field names, which may not be used by fields in the same message.
-/// A given name may only be reserved once.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *reservedNameArray;
-/// The number of items in @c reservedNameArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger reservedNameArray_Count;
-
-@end
-
-#pragma mark - GPBDescriptorProto_ExtensionRange
-
-typedef GPB_ENUM(GPBDescriptorProto_ExtensionRange_FieldNumber) {
-  GPBDescriptorProto_ExtensionRange_FieldNumber_Start = 1,
-  GPBDescriptorProto_ExtensionRange_FieldNumber_End = 2,
-};
-
-@interface GPBDescriptorProto_ExtensionRange : GPBMessage
-
-@property(nonatomic, readwrite) int32_t start;
-
-@property(nonatomic, readwrite) BOOL hasStart;
-@property(nonatomic, readwrite) int32_t end;
-
-@property(nonatomic, readwrite) BOOL hasEnd;
-@end
-
-#pragma mark - GPBDescriptorProto_ReservedRange
-
-typedef GPB_ENUM(GPBDescriptorProto_ReservedRange_FieldNumber) {
-  GPBDescriptorProto_ReservedRange_FieldNumber_Start = 1,
-  GPBDescriptorProto_ReservedRange_FieldNumber_End = 2,
-};
-
-/// Range of reserved tag numbers. Reserved tag numbers may not be used by
-/// fields or extension ranges in the same message. Reserved ranges may
-/// not overlap.
-@interface GPBDescriptorProto_ReservedRange : GPBMessage
-
-/// Inclusive.
-@property(nonatomic, readwrite) int32_t start;
-
-@property(nonatomic, readwrite) BOOL hasStart;
-/// Exclusive.
-@property(nonatomic, readwrite) int32_t end;
-
-@property(nonatomic, readwrite) BOOL hasEnd;
-@end
-
-#pragma mark - GPBFieldDescriptorProto
-
-typedef GPB_ENUM(GPBFieldDescriptorProto_FieldNumber) {
-  GPBFieldDescriptorProto_FieldNumber_Name = 1,
-  GPBFieldDescriptorProto_FieldNumber_Extendee = 2,
-  GPBFieldDescriptorProto_FieldNumber_Number = 3,
-  GPBFieldDescriptorProto_FieldNumber_Label = 4,
-  GPBFieldDescriptorProto_FieldNumber_Type = 5,
-  GPBFieldDescriptorProto_FieldNumber_TypeName = 6,
-  GPBFieldDescriptorProto_FieldNumber_DefaultValue = 7,
-  GPBFieldDescriptorProto_FieldNumber_Options = 8,
-  GPBFieldDescriptorProto_FieldNumber_OneofIndex = 9,
-  GPBFieldDescriptorProto_FieldNumber_JsonName = 10,
-};
-
-/// Describes a field within a message.
-@interface GPBFieldDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-/// Test to see if @c name has been set.
-@property(nonatomic, readwrite) BOOL hasName;
-
-@property(nonatomic, readwrite) int32_t number;
-
-@property(nonatomic, readwrite) BOOL hasNumber;
-@property(nonatomic, readwrite) GPBFieldDescriptorProto_Label label;
-
-@property(nonatomic, readwrite) BOOL hasLabel;
-/// If type_name is set, this need not be set.  If both this and type_name
-/// are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP.
-@property(nonatomic, readwrite) GPBFieldDescriptorProto_Type type;
-
-@property(nonatomic, readwrite) BOOL hasType;
-/// For message and enum types, this is the name of the type.  If the name
-/// starts with a '.', it is fully-qualified.  Otherwise, C++-like scoping
-/// rules are used to find the type (i.e. first the nested types within this
-/// message are searched, then within the parent, on up to the root
-/// namespace).
-@property(nonatomic, readwrite, copy, null_resettable) NSString *typeName;
-/// Test to see if @c typeName has been set.
-@property(nonatomic, readwrite) BOOL hasTypeName;
-
-/// For extensions, this is the name of the type being extended.  It is
-/// resolved in the same manner as type_name.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *extendee;
-/// Test to see if @c extendee has been set.
-@property(nonatomic, readwrite) BOOL hasExtendee;
-
-/// For numeric types, contains the original text representation of the value.
-/// For booleans, "true" or "false".
-/// For strings, contains the default text contents (not escaped in any way).
-/// For bytes, contains the C escaped value.  All bytes >= 128 are escaped.
-/// TODO(kenton):  Base-64 encode?
-@property(nonatomic, readwrite, copy, null_resettable) NSString *defaultValue;
-/// Test to see if @c defaultValue has been set.
-@property(nonatomic, readwrite) BOOL hasDefaultValue;
-
-/// If set, gives the index of a oneof in the containing type's oneof_decl
-/// list.  This field is a member of that oneof.
-@property(nonatomic, readwrite) int32_t oneofIndex;
-
-@property(nonatomic, readwrite) BOOL hasOneofIndex;
-/// JSON name of this field. The value is set by protocol compiler. If the
-/// user has set a "json_name" option on this field, that option's value
-/// will be used. Otherwise, it's deduced from the field's name by converting
-/// it to camelCase.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *jsonName;
-/// Test to see if @c jsonName has been set.
-@property(nonatomic, readwrite) BOOL hasJsonName;
-
-@property(nonatomic, readwrite, strong, null_resettable) GPBFieldOptions *options;
-/// Test to see if @c options has been set.
-@property(nonatomic, readwrite) BOOL hasOptions;
-
-@end
-
-#pragma mark - GPBOneofDescriptorProto
-
-typedef GPB_ENUM(GPBOneofDescriptorProto_FieldNumber) {
-  GPBOneofDescriptorProto_FieldNumber_Name = 1,
-};
-
-/// Describes a oneof.
-@interface GPBOneofDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-/// Test to see if @c name has been set.
-@property(nonatomic, readwrite) BOOL hasName;
-
-@end
-
-#pragma mark - GPBEnumDescriptorProto
-
-typedef GPB_ENUM(GPBEnumDescriptorProto_FieldNumber) {
-  GPBEnumDescriptorProto_FieldNumber_Name = 1,
-  GPBEnumDescriptorProto_FieldNumber_ValueArray = 2,
-  GPBEnumDescriptorProto_FieldNumber_Options = 3,
-};
-
-/// Describes an enum type.
-@interface GPBEnumDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-/// Test to see if @c name has been set.
-@property(nonatomic, readwrite) BOOL hasName;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBEnumValueDescriptorProto*> *valueArray;
-/// The number of items in @c valueArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger valueArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) GPBEnumOptions *options;
-/// Test to see if @c options has been set.
-@property(nonatomic, readwrite) BOOL hasOptions;
-
-@end
-
-#pragma mark - GPBEnumValueDescriptorProto
-
-typedef GPB_ENUM(GPBEnumValueDescriptorProto_FieldNumber) {
-  GPBEnumValueDescriptorProto_FieldNumber_Name = 1,
-  GPBEnumValueDescriptorProto_FieldNumber_Number = 2,
-  GPBEnumValueDescriptorProto_FieldNumber_Options = 3,
-};
-
-/// Describes a value within an enum.
-@interface GPBEnumValueDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-/// Test to see if @c name has been set.
-@property(nonatomic, readwrite) BOOL hasName;
-
-@property(nonatomic, readwrite) int32_t number;
-
-@property(nonatomic, readwrite) BOOL hasNumber;
-@property(nonatomic, readwrite, strong, null_resettable) GPBEnumValueOptions *options;
-/// Test to see if @c options has been set.
-@property(nonatomic, readwrite) BOOL hasOptions;
-
-@end
-
-#pragma mark - GPBServiceDescriptorProto
-
-typedef GPB_ENUM(GPBServiceDescriptorProto_FieldNumber) {
-  GPBServiceDescriptorProto_FieldNumber_Name = 1,
-  GPBServiceDescriptorProto_FieldNumber_MethodArray = 2,
-  GPBServiceDescriptorProto_FieldNumber_Options = 3,
-};
-
-/// Describes a service.
-@interface GPBServiceDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-/// Test to see if @c name has been set.
-@property(nonatomic, readwrite) BOOL hasName;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBMethodDescriptorProto*> *methodArray;
-/// The number of items in @c methodArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger methodArray_Count;
-
-@property(nonatomic, readwrite, strong, null_resettable) GPBServiceOptions *options;
-/// Test to see if @c options has been set.
-@property(nonatomic, readwrite) BOOL hasOptions;
-
-@end
-
-#pragma mark - GPBMethodDescriptorProto
-
-typedef GPB_ENUM(GPBMethodDescriptorProto_FieldNumber) {
-  GPBMethodDescriptorProto_FieldNumber_Name = 1,
-  GPBMethodDescriptorProto_FieldNumber_InputType = 2,
-  GPBMethodDescriptorProto_FieldNumber_OutputType = 3,
-  GPBMethodDescriptorProto_FieldNumber_Options = 4,
-  GPBMethodDescriptorProto_FieldNumber_ClientStreaming = 5,
-  GPBMethodDescriptorProto_FieldNumber_ServerStreaming = 6,
-};
-
-/// Describes a method of a service.
-@interface GPBMethodDescriptorProto : GPBMessage
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *name;
-/// Test to see if @c name has been set.
-@property(nonatomic, readwrite) BOOL hasName;
-
-/// Input and output type names.  These are resolved in the same way as
-/// FieldDescriptorProto.type_name, but must refer to a message type.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *inputType;
-/// Test to see if @c inputType has been set.
-@property(nonatomic, readwrite) BOOL hasInputType;
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *outputType;
-/// Test to see if @c outputType has been set.
-@property(nonatomic, readwrite) BOOL hasOutputType;
-
-@property(nonatomic, readwrite, strong, null_resettable) GPBMethodOptions *options;
-/// Test to see if @c options has been set.
-@property(nonatomic, readwrite) BOOL hasOptions;
-
-/// Identifies if client streams multiple client messages
-@property(nonatomic, readwrite) BOOL clientStreaming;
-
-@property(nonatomic, readwrite) BOOL hasClientStreaming;
-/// Identifies if server streams multiple server messages
-@property(nonatomic, readwrite) BOOL serverStreaming;
-
-@property(nonatomic, readwrite) BOOL hasServerStreaming;
-@end
-
-#pragma mark - GPBFileOptions
-
-typedef GPB_ENUM(GPBFileOptions_FieldNumber) {
-  GPBFileOptions_FieldNumber_JavaPackage = 1,
-  GPBFileOptions_FieldNumber_JavaOuterClassname = 8,
-  GPBFileOptions_FieldNumber_OptimizeFor = 9,
-  GPBFileOptions_FieldNumber_JavaMultipleFiles = 10,
-  GPBFileOptions_FieldNumber_GoPackage = 11,
-  GPBFileOptions_FieldNumber_CcGenericServices = 16,
-  GPBFileOptions_FieldNumber_JavaGenericServices = 17,
-  GPBFileOptions_FieldNumber_PyGenericServices = 18,
-  GPBFileOptions_FieldNumber_JavaGenerateEqualsAndHash = 20,
-  GPBFileOptions_FieldNumber_Deprecated = 23,
-  GPBFileOptions_FieldNumber_JavaStringCheckUtf8 = 27,
-  GPBFileOptions_FieldNumber_CcEnableArenas = 31,
-  GPBFileOptions_FieldNumber_ObjcClassPrefix = 36,
-  GPBFileOptions_FieldNumber_CsharpNamespace = 37,
-  GPBFileOptions_FieldNumber_JavananoUseDeprecatedPackage = 38,
-  GPBFileOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBFileOptions : GPBMessage
-
-/// Sets the Java package where classes generated from this .proto will be
-/// placed.  By default, the proto package is used, but this is often
-/// inappropriate because proto packages do not normally start with backwards
-/// domain names.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *javaPackage;
-/// Test to see if @c javaPackage has been set.
-@property(nonatomic, readwrite) BOOL hasJavaPackage;
-
-/// If set, all the classes from the .proto file are wrapped in a single
-/// outer class with the given name.  This applies to both Proto1
-/// (equivalent to the old "--one_java_file" option) and Proto2 (where
-/// a .proto always translates to a single class, but you may want to
-/// explicitly choose the class name).
-@property(nonatomic, readwrite, copy, null_resettable) NSString *javaOuterClassname;
-/// Test to see if @c javaOuterClassname has been set.
-@property(nonatomic, readwrite) BOOL hasJavaOuterClassname;
-
-/// If set true, then the Java code generator will generate a separate .java
-/// file for each top-level message, enum, and service defined in the .proto
-/// file.  Thus, these types will *not* be nested inside the outer class
-/// named by java_outer_classname.  However, the outer class will still be
-/// generated to contain the file's getDescriptor() method as well as any
-/// top-level extensions defined in the file.
-@property(nonatomic, readwrite) BOOL javaMultipleFiles;
-
-@property(nonatomic, readwrite) BOOL hasJavaMultipleFiles;
-/// If set true, then the Java code generator will generate equals() and
-/// hashCode() methods for all messages defined in the .proto file.
-/// This increases generated code size, potentially substantially for large
-/// protos, which may harm a memory-constrained application.
-/// - In the full runtime this is a speed optimization, as the
-/// AbstractMessage base class includes reflection-based implementations of
-/// these methods.
-/// - In the lite runtime, setting this option changes the semantics of
-/// equals() and hashCode() to more closely match those of the full runtime;
-/// the generated methods compute their results based on field values rather
-/// than object identity. (Implementations should not assume that hashcodes
-/// will be consistent across runtimes or versions of the protocol compiler.)
-@property(nonatomic, readwrite) BOOL javaGenerateEqualsAndHash;
-
-@property(nonatomic, readwrite) BOOL hasJavaGenerateEqualsAndHash;
-/// If set true, then the Java2 code generator will generate code that
-/// throws an exception whenever an attempt is made to assign a non-UTF-8
-/// byte sequence to a string field.
-/// Message reflection will do the same.
-/// However, an extension field still accepts non-UTF-8 byte sequences.
-/// This option has no effect on when used with the lite runtime.
-@property(nonatomic, readwrite) BOOL javaStringCheckUtf8;
-
-@property(nonatomic, readwrite) BOOL hasJavaStringCheckUtf8;
-@property(nonatomic, readwrite) GPBFileOptions_OptimizeMode optimizeFor;
-
-@property(nonatomic, readwrite) BOOL hasOptimizeFor;
-/// Sets the Go package where structs generated from this .proto will be
-/// placed. If omitted, the Go package will be derived from the following:
-///   - The basename of the package import path, if provided.
-///   - Otherwise, the package statement in the .proto file, if present.
-///   - Otherwise, the basename of the .proto file, without extension.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *goPackage;
-/// Test to see if @c goPackage has been set.
-@property(nonatomic, readwrite) BOOL hasGoPackage;
-
-/// Should generic services be generated in each language?  "Generic" services
-/// are not specific to any particular RPC system.  They are generated by the
-/// main code generators in each language (without additional plugins).
-/// Generic services were the only kind of service generation supported by
-/// early versions of google.protobuf.
-///
-/// Generic services are now considered deprecated in favor of using plugins
-/// that generate code specific to your particular RPC system.  Therefore,
-/// these default to false.  Old code which depends on generic services should
-/// explicitly set them to true.
-@property(nonatomic, readwrite) BOOL ccGenericServices;
-
-@property(nonatomic, readwrite) BOOL hasCcGenericServices;
-@property(nonatomic, readwrite) BOOL javaGenericServices;
-
-@property(nonatomic, readwrite) BOOL hasJavaGenericServices;
-@property(nonatomic, readwrite) BOOL pyGenericServices;
-
-@property(nonatomic, readwrite) BOOL hasPyGenericServices;
-/// Is this file deprecated?
-/// Depending on the target platform, this can emit Deprecated annotations
-/// for everything in the file, or it will be completely ignored; in the very
-/// least, this is a formalization for deprecating files.
-@property(nonatomic, readwrite) BOOL deprecated;
-
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-/// Enables the use of arenas for the proto messages in this file. This applies
-/// only to generated classes for C++.
-@property(nonatomic, readwrite) BOOL ccEnableArenas;
-
-@property(nonatomic, readwrite) BOOL hasCcEnableArenas;
-/// Sets the objective c class prefix which is prepended to all objective c
-/// generated classes from this .proto. There is no default.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *objcClassPrefix;
-/// Test to see if @c objcClassPrefix has been set.
-@property(nonatomic, readwrite) BOOL hasObjcClassPrefix;
-
-/// Namespace for generated classes; defaults to the package.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *csharpNamespace;
-/// Test to see if @c csharpNamespace has been set.
-@property(nonatomic, readwrite) BOOL hasCsharpNamespace;
-
-/// Whether the nano proto compiler should generate in the deprecated non-nano
-/// suffixed package.
-@property(nonatomic, readwrite) BOOL javananoUseDeprecatedPackage;
-
-@property(nonatomic, readwrite) BOOL hasJavananoUseDeprecatedPackage;
-/// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-/// The number of items in @c uninterpretedOptionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBMessageOptions
-
-typedef GPB_ENUM(GPBMessageOptions_FieldNumber) {
-  GPBMessageOptions_FieldNumber_MessageSetWireFormat = 1,
-  GPBMessageOptions_FieldNumber_NoStandardDescriptorAccessor = 2,
-  GPBMessageOptions_FieldNumber_Deprecated = 3,
-  GPBMessageOptions_FieldNumber_MapEntry = 7,
-  GPBMessageOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBMessageOptions : GPBMessage
-
-/// Set true to use the old proto1 MessageSet wire format for extensions.
-/// This is provided for backwards-compatibility with the MessageSet wire
-/// format.  You should not use this for any other reason:  It's less
-/// efficient, has fewer features, and is more complicated.
-///
-/// The message must be defined exactly as follows:
-///   message Foo {
-///     option message_set_wire_format = true;
-///     extensions 4 to max;
-///   }
-/// Note that the message cannot have any defined fields; MessageSets only
-/// have extensions.
-///
-/// All extensions of your type must be singular messages; e.g. they cannot
-/// be int32s, enums, or repeated messages.
-///
-/// Because this is an option, the above two restrictions are not enforced by
-/// the protocol compiler.
-@property(nonatomic, readwrite) BOOL messageSetWireFormat;
-
-@property(nonatomic, readwrite) BOOL hasMessageSetWireFormat;
-/// Disables the generation of the standard "descriptor()" accessor, which can
-/// conflict with a field of the same name.  This is meant to make migration
-/// from proto1 easier; new code should avoid fields named "descriptor".
-@property(nonatomic, readwrite) BOOL noStandardDescriptorAccessor;
-
-@property(nonatomic, readwrite) BOOL hasNoStandardDescriptorAccessor;
-/// Is this message deprecated?
-/// Depending on the target platform, this can emit Deprecated annotations
-/// for the message, or it will be completely ignored; in the very least,
-/// this is a formalization for deprecating messages.
-@property(nonatomic, readwrite) BOOL deprecated;
-
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-/// Whether the message is an automatically generated map entry type for the
-/// maps field.
-///
-/// For maps fields:
-///     map<KeyType, ValueType> map_field = 1;
-/// The parsed descriptor looks like:
-///     message MapFieldEntry {
-///         option map_entry = true;
-///         optional KeyType key = 1;
-///         optional ValueType value = 2;
-///     }
-///     repeated MapFieldEntry map_field = 1;
-///
-/// Implementations may choose not to generate the map_entry=true message, but
-/// use a native map in the target language to hold the keys and values.
-/// The reflection APIs in such implementions still need to work as
-/// if the field is a repeated message field.
-///
-/// NOTE: Do not set the option in .proto files. Always use the maps syntax
-/// instead. The option should only be implicitly set by the proto compiler
-/// parser.
-@property(nonatomic, readwrite) BOOL mapEntry;
-
-@property(nonatomic, readwrite) BOOL hasMapEntry;
-/// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-/// The number of items in @c uninterpretedOptionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBFieldOptions
-
-typedef GPB_ENUM(GPBFieldOptions_FieldNumber) {
-  GPBFieldOptions_FieldNumber_Ctype = 1,
-  GPBFieldOptions_FieldNumber_Packed = 2,
-  GPBFieldOptions_FieldNumber_Deprecated = 3,
-  GPBFieldOptions_FieldNumber_Lazy = 5,
-  GPBFieldOptions_FieldNumber_Jstype = 6,
-  GPBFieldOptions_FieldNumber_Weak = 10,
-  GPBFieldOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBFieldOptions : GPBMessage
-
-/// The ctype option instructs the C++ code generator to use a different
-/// representation of the field than it normally would.  See the specific
-/// options below.  This option is not yet implemented in the open source
-/// release -- sorry, we'll try to include it in a future version!
-@property(nonatomic, readwrite) GPBFieldOptions_CType ctype;
-
-@property(nonatomic, readwrite) BOOL hasCtype;
-/// The packed option can be enabled for repeated primitive fields to enable
-/// a more efficient representation on the wire. Rather than repeatedly
-/// writing the tag and type for each element, the entire array is encoded as
-/// a single length-delimited blob. In proto3, only explicit setting it to
-/// false will avoid using packed encoding.
-@property(nonatomic, readwrite) BOOL packed;
-
-@property(nonatomic, readwrite) BOOL hasPacked;
-/// The jstype option determines the JavaScript type used for values of the
-/// field.  The option is permitted only for 64 bit integral and fixed types
-/// (int64, uint64, sint64, fixed64, sfixed64).  By default these types are
-/// represented as JavaScript strings.  This avoids loss of precision that can
-/// happen when a large value is converted to a floating point JavaScript
-/// numbers.  Specifying JS_NUMBER for the jstype causes the generated
-/// JavaScript code to use the JavaScript "number" type instead of strings.
-/// This option is an enum to permit additional types to be added,
-/// e.g. goog.math.Integer.
-@property(nonatomic, readwrite) GPBFieldOptions_JSType jstype;
-
-@property(nonatomic, readwrite) BOOL hasJstype;
-/// Should this field be parsed lazily?  Lazy applies only to message-type
-/// fields.  It means that when the outer message is initially parsed, the
-/// inner message's contents will not be parsed but instead stored in encoded
-/// form.  The inner message will actually be parsed when it is first accessed.
-///
-/// This is only a hint.  Implementations are free to choose whether to use
-/// eager or lazy parsing regardless of the value of this option.  However,
-/// setting this option true suggests that the protocol author believes that
-/// using lazy parsing on this field is worth the additional bookkeeping
-/// overhead typically needed to implement it.
-///
-/// This option does not affect the public interface of any generated code;
-/// all method signatures remain the same.  Furthermore, thread-safety of the
-/// interface is not affected by this option; const methods remain safe to
-/// call from multiple threads concurrently, while non-const methods continue
-/// to require exclusive access.
-///
-///
-/// Note that implementations may choose not to check required fields within
-/// a lazy sub-message.  That is, calling IsInitialized() on the outher message
-/// may return true even if the inner message has missing required fields.
-/// This is necessary because otherwise the inner message would have to be
-/// parsed in order to perform the check, defeating the purpose of lazy
-/// parsing.  An implementation which chooses not to check required fields
-/// must be consistent about it.  That is, for any particular sub-message, the
-/// implementation must either *always* check its required fields, or *never*
-/// check its required fields, regardless of whether or not the message has
-/// been parsed.
-@property(nonatomic, readwrite) BOOL lazy;
-
-@property(nonatomic, readwrite) BOOL hasLazy;
-/// Is this field deprecated?
-/// Depending on the target platform, this can emit Deprecated annotations
-/// for accessors, or it will be completely ignored; in the very least, this
-/// is a formalization for deprecating fields.
-@property(nonatomic, readwrite) BOOL deprecated;
-
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-/// For Google-internal migration only. Do not use.
-@property(nonatomic, readwrite) BOOL weak;
-
-@property(nonatomic, readwrite) BOOL hasWeak;
-/// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-/// The number of items in @c uninterpretedOptionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBEnumOptions
-
-typedef GPB_ENUM(GPBEnumOptions_FieldNumber) {
-  GPBEnumOptions_FieldNumber_AllowAlias = 2,
-  GPBEnumOptions_FieldNumber_Deprecated = 3,
-  GPBEnumOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBEnumOptions : GPBMessage
-
-/// Set this option to true to allow mapping different tag names to the same
-/// value.
-@property(nonatomic, readwrite) BOOL allowAlias;
-
-@property(nonatomic, readwrite) BOOL hasAllowAlias;
-/// Is this enum deprecated?
-/// Depending on the target platform, this can emit Deprecated annotations
-/// for the enum, or it will be completely ignored; in the very least, this
-/// is a formalization for deprecating enums.
-@property(nonatomic, readwrite) BOOL deprecated;
-
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-/// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-/// The number of items in @c uninterpretedOptionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBEnumValueOptions
-
-typedef GPB_ENUM(GPBEnumValueOptions_FieldNumber) {
-  GPBEnumValueOptions_FieldNumber_Deprecated = 1,
-  GPBEnumValueOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBEnumValueOptions : GPBMessage
-
-/// Is this enum value deprecated?
-/// Depending on the target platform, this can emit Deprecated annotations
-/// for the enum value, or it will be completely ignored; in the very least,
-/// this is a formalization for deprecating enum values.
-@property(nonatomic, readwrite) BOOL deprecated;
-
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-/// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-/// The number of items in @c uninterpretedOptionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBServiceOptions
-
-typedef GPB_ENUM(GPBServiceOptions_FieldNumber) {
-  GPBServiceOptions_FieldNumber_Deprecated = 33,
-  GPBServiceOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBServiceOptions : GPBMessage
-
-/// Is this service deprecated?
-/// Depending on the target platform, this can emit Deprecated annotations
-/// for the service, or it will be completely ignored; in the very least,
-/// this is a formalization for deprecating services.
-@property(nonatomic, readwrite) BOOL deprecated;
-
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-/// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-/// The number of items in @c uninterpretedOptionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBMethodOptions
-
-typedef GPB_ENUM(GPBMethodOptions_FieldNumber) {
-  GPBMethodOptions_FieldNumber_Deprecated = 33,
-  GPBMethodOptions_FieldNumber_UninterpretedOptionArray = 999,
-};
-
-@interface GPBMethodOptions : GPBMessage
-
-/// Is this method deprecated?
-/// Depending on the target platform, this can emit Deprecated annotations
-/// for the method, or it will be completely ignored; in the very least,
-/// this is a formalization for deprecating methods.
-@property(nonatomic, readwrite) BOOL deprecated;
-
-@property(nonatomic, readwrite) BOOL hasDeprecated;
-/// The parser stores options it doesn't recognize here. See above.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption*> *uninterpretedOptionArray;
-/// The number of items in @c uninterpretedOptionArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger uninterpretedOptionArray_Count;
-
-@end
-
-#pragma mark - GPBUninterpretedOption
-
-typedef GPB_ENUM(GPBUninterpretedOption_FieldNumber) {
-  GPBUninterpretedOption_FieldNumber_NameArray = 2,
-  GPBUninterpretedOption_FieldNumber_IdentifierValue = 3,
-  GPBUninterpretedOption_FieldNumber_PositiveIntValue = 4,
-  GPBUninterpretedOption_FieldNumber_NegativeIntValue = 5,
-  GPBUninterpretedOption_FieldNumber_DoubleValue = 6,
-  GPBUninterpretedOption_FieldNumber_StringValue = 7,
-  GPBUninterpretedOption_FieldNumber_AggregateValue = 8,
-};
-
-/// A message representing a option the parser does not recognize. This only
-/// appears in options protos created by the compiler::Parser class.
-/// DescriptorPool resolves these when building Descriptor objects. Therefore,
-/// options protos in descriptor objects (e.g. returned by Descriptor::options(),
-/// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions
-/// in them.
-@interface GPBUninterpretedOption : GPBMessage
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBUninterpretedOption_NamePart*> *nameArray;
-/// The number of items in @c nameArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger nameArray_Count;
-
-/// The value of the uninterpreted option, in whatever type the tokenizer
-/// identified it as during parsing. Exactly one of these should be set.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *identifierValue;
-/// Test to see if @c identifierValue has been set.
-@property(nonatomic, readwrite) BOOL hasIdentifierValue;
-
-@property(nonatomic, readwrite) uint64_t positiveIntValue;
-
-@property(nonatomic, readwrite) BOOL hasPositiveIntValue;
-@property(nonatomic, readwrite) int64_t negativeIntValue;
-
-@property(nonatomic, readwrite) BOOL hasNegativeIntValue;
-@property(nonatomic, readwrite) double doubleValue;
-
-@property(nonatomic, readwrite) BOOL hasDoubleValue;
-@property(nonatomic, readwrite, copy, null_resettable) NSData *stringValue;
-/// Test to see if @c stringValue has been set.
-@property(nonatomic, readwrite) BOOL hasStringValue;
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *aggregateValue;
-/// Test to see if @c aggregateValue has been set.
-@property(nonatomic, readwrite) BOOL hasAggregateValue;
-
-@end
-
-#pragma mark - GPBUninterpretedOption_NamePart
-
-typedef GPB_ENUM(GPBUninterpretedOption_NamePart_FieldNumber) {
-  GPBUninterpretedOption_NamePart_FieldNumber_NamePart = 1,
-  GPBUninterpretedOption_NamePart_FieldNumber_IsExtension = 2,
-};
-
-/// The name of the uninterpreted option.  Each string represents a segment in
-/// a dot-separated name.  is_extension is true iff a segment represents an
-/// extension (denoted with parentheses in options specs in .proto files).
-/// E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents
-/// "foo.(bar.baz).qux".
-@interface GPBUninterpretedOption_NamePart : GPBMessage
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *namePart;
-/// Test to see if @c namePart has been set.
-@property(nonatomic, readwrite) BOOL hasNamePart;
-
-@property(nonatomic, readwrite) BOOL isExtension;
-
-@property(nonatomic, readwrite) BOOL hasIsExtension;
-@end
-
-#pragma mark - GPBSourceCodeInfo
-
-typedef GPB_ENUM(GPBSourceCodeInfo_FieldNumber) {
-  GPBSourceCodeInfo_FieldNumber_LocationArray = 1,
-};
-
-/// Encapsulates information about the original source file from which a
-/// FileDescriptorProto was generated.
-@interface GPBSourceCodeInfo : GPBMessage
-
-/// A Location identifies a piece of source code in a .proto file which
-/// corresponds to a particular definition.  This information is intended
-/// to be useful to IDEs, code indexers, documentation generators, and similar
-/// tools.
-///
-/// For example, say we have a file like:
-///   message Foo {
-///     optional string foo = 1;
-///   }
-/// Let's look at just the field definition:
-///   optional string foo = 1;
-///   ^       ^^     ^^  ^  ^^^
-///   a       bc     de  f  ghi
-/// We have the following locations:
-///   span   path               represents
-///   [a,i)  [ 4, 0, 2, 0 ]     The whole field definition.
-///   [a,b)  [ 4, 0, 2, 0, 4 ]  The label (optional).
-///   [c,d)  [ 4, 0, 2, 0, 5 ]  The type (string).
-///   [e,f)  [ 4, 0, 2, 0, 1 ]  The name (foo).
-///   [g,h)  [ 4, 0, 2, 0, 3 ]  The number (1).
-///
-/// Notes:
-/// - A location may refer to a repeated field itself (i.e. not to any
-///   particular index within it).  This is used whenever a set of elements are
-///   logically enclosed in a single code segment.  For example, an entire
-///   extend block (possibly containing multiple extension definitions) will
-///   have an outer location whose path refers to the "extensions" repeated
-///   field without an index.
-/// - Multiple locations may have the same path.  This happens when a single
-///   logical declaration is spread out across multiple places.  The most
-///   obvious example is the "extend" block again -- there may be multiple
-///   extend blocks in the same scope, each of which will have the same path.
-/// - A location's span is not always a subset of its parent's span.  For
-///   example, the "extendee" of an extension declaration appears at the
-///   beginning of the "extend" block and is shared by all extensions within
-///   the block.
-/// - Just because a location's span is a subset of some other location's span
-///   does not mean that it is a descendent.  For example, a "group" defines
-///   both a type and a field in a single declaration.  Thus, the locations
-///   corresponding to the type and field and their components will overlap.
-/// - Code which tries to interpret locations should probably be designed to
-///   ignore those that it doesn't understand, as more types of locations could
-///   be recorded in the future.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBSourceCodeInfo_Location*> *locationArray;
-/// The number of items in @c locationArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger locationArray_Count;
-
-@end
-
-#pragma mark - GPBSourceCodeInfo_Location
-
-typedef GPB_ENUM(GPBSourceCodeInfo_Location_FieldNumber) {
-  GPBSourceCodeInfo_Location_FieldNumber_PathArray = 1,
-  GPBSourceCodeInfo_Location_FieldNumber_SpanArray = 2,
-  GPBSourceCodeInfo_Location_FieldNumber_LeadingComments = 3,
-  GPBSourceCodeInfo_Location_FieldNumber_TrailingComments = 4,
-  GPBSourceCodeInfo_Location_FieldNumber_LeadingDetachedCommentsArray = 6,
-};
-
-@interface GPBSourceCodeInfo_Location : GPBMessage
-
-/// Identifies which part of the FileDescriptorProto was defined at this
-/// location.
-///
-/// Each element is a field number or an index.  They form a path from
-/// the root FileDescriptorProto to the place where the definition.  For
-/// example, this path:
-///   [ 4, 3, 2, 7, 1 ]
-/// refers to:
-///   file.message_type(3)  // 4, 3
-///       .field(7)         // 2, 7
-///       .name()           // 1
-/// This is because FileDescriptorProto.message_type has field number 4:
-///   repeated DescriptorProto message_type = 4;
-/// and DescriptorProto.field has field number 2:
-///   repeated FieldDescriptorProto field = 2;
-/// and FieldDescriptorProto.name has field number 1:
-///   optional string name = 1;
-///
-/// Thus, the above path gives the location of a field name.  If we removed
-/// the last element:
-///   [ 4, 3, 2, 7 ]
-/// this path refers to the whole field declaration (from the beginning
-/// of the label to the terminating semicolon).
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *pathArray;
-/// The number of items in @c pathArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger pathArray_Count;
-
-/// Always has exactly three or four elements: start line, start column,
-/// end line (optional, otherwise assumed same as start line), end column.
-/// These are packed into a single field for efficiency.  Note that line
-/// and column numbers are zero-based -- typically you will want to add
-/// 1 to each before displaying to a user.
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *spanArray;
-/// The number of items in @c spanArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger spanArray_Count;
-
-/// If this SourceCodeInfo represents a complete declaration, these are any
-/// comments appearing before and after the declaration which appear to be
-/// attached to the declaration.
-///
-/// A series of line comments appearing on consecutive lines, with no other
-/// tokens appearing on those lines, will be treated as a single comment.
-///
-/// leading_detached_comments will keep paragraphs of comments that appear
-/// before (but not connected to) the current element. Each paragraph,
-/// separated by empty lines, will be one comment element in the repeated
-/// field.
-///
-/// Only the comment content is provided; comment markers (e.g. //) are
-/// stripped out.  For block comments, leading whitespace and an asterisk
-/// will be stripped from the beginning of each line other than the first.
-/// Newlines are included in the output.
-///
-/// Examples:
-///
-///   optional int32 foo = 1;  // Comment attached to foo.
-///   // Comment attached to bar.
-///   optional int32 bar = 2;
-///
-///   optional string baz = 3;
-///   // Comment attached to baz.
-///   // Another line attached to baz.
-///
-///   // Comment attached to qux.
-///   //
-///   // Another line attached to qux.
-///   optional double qux = 4;
-///
-///   // Detached comment for corge. This is not leading or trailing comments
-///   // to qux or corge because there are blank lines separating it from
-///   // both.
-///
-///   // Detached comment for corge paragraph 2.
-///
-///   optional string corge = 5;
-///   /* Block comment attached
-///    * to corge.  Leading asterisks
-///    * will be removed. */
-///   /* Block comment attached to
-///    * grault. */
-///   optional int32 grault = 6;
-///
-///   // ignored detached comments.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *leadingComments;
-/// Test to see if @c leadingComments has been set.
-@property(nonatomic, readwrite) BOOL hasLeadingComments;
-
-@property(nonatomic, readwrite, copy, null_resettable) NSString *trailingComments;
-/// Test to see if @c trailingComments has been set.
-@property(nonatomic, readwrite) BOOL hasTrailingComments;
-
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<NSString*> *leadingDetachedCommentsArray;
-/// The number of items in @c leadingDetachedCommentsArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger leadingDetachedCommentsArray_Count;
-
-@end
-
-#pragma mark - GPBGeneratedCodeInfo
-
-typedef GPB_ENUM(GPBGeneratedCodeInfo_FieldNumber) {
-  GPBGeneratedCodeInfo_FieldNumber_AnnotationArray = 1,
-};
-
-/// Describes the relationship between generated code and its original source
-/// file. A GeneratedCodeInfo message is associated with only one generated
-/// source file, but may contain references to different source .proto files.
-@interface GPBGeneratedCodeInfo : GPBMessage
-
-/// An Annotation connects some span of text in generated code to an element
-/// of its generating .proto file.
-@property(nonatomic, readwrite, strong, null_resettable) NSMutableArray<GPBGeneratedCodeInfo_Annotation*> *annotationArray;
-/// The number of items in @c annotationArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger annotationArray_Count;
-
-@end
-
-#pragma mark - GPBGeneratedCodeInfo_Annotation
-
-typedef GPB_ENUM(GPBGeneratedCodeInfo_Annotation_FieldNumber) {
-  GPBGeneratedCodeInfo_Annotation_FieldNumber_PathArray = 1,
-  GPBGeneratedCodeInfo_Annotation_FieldNumber_SourceFile = 2,
-  GPBGeneratedCodeInfo_Annotation_FieldNumber_Begin = 3,
-  GPBGeneratedCodeInfo_Annotation_FieldNumber_End = 4,
-};
-
-@interface GPBGeneratedCodeInfo_Annotation : GPBMessage
-
-/// Identifies the element in the original source .proto file. This field
-/// is formatted the same as SourceCodeInfo.Location.path.
-@property(nonatomic, readwrite, strong, null_resettable) GPBInt32Array *pathArray;
-/// The number of items in @c pathArray without causing the array to be created.
-@property(nonatomic, readonly) NSUInteger pathArray_Count;
-
-/// Identifies the filesystem path to the original source .proto.
-@property(nonatomic, readwrite, copy, null_resettable) NSString *sourceFile;
-/// Test to see if @c sourceFile has been set.
-@property(nonatomic, readwrite) BOOL hasSourceFile;
-
-/// Identifies the starting offset in bytes in the generated code
-/// that relates to the identified object.
-@property(nonatomic, readwrite) int32_t begin;
-
-@property(nonatomic, readwrite) BOOL hasBegin;
-/// Identifies the ending offset in bytes in the generated code that
-/// relates to the identified offset. The end offset should be one past
-/// the last relevant byte (so the length of the text = end - begin).
-@property(nonatomic, readwrite) int32_t end;
-
-@property(nonatomic, readwrite) BOOL hasEnd;
-@end
-
-NS_ASSUME_NONNULL_END
-
-CF_EXTERN_C_END
-
-// @@protoc_insertion_point(global_scope)
diff --git a/objectivec/google/protobuf/Descriptor.pbobjc.m b/objectivec/google/protobuf/Descriptor.pbobjc.m
deleted file mode 100644
index 4030989..0000000
--- a/objectivec/google/protobuf/Descriptor.pbobjc.m
+++ /dev/null
@@ -1,2594 +0,0 @@
-// Generated by the protocol buffer compiler.  DO NOT EDIT!
-// source: google/protobuf/descriptor.proto
-
-#import "GPBProtocolBuffers_RuntimeSupport.h"
-#import "google/protobuf/Descriptor.pbobjc.h"
-// @@protoc_insertion_point(imports)
-
-#pragma mark - GPBDescriptorRoot
-
-@implementation GPBDescriptorRoot
-
-@end
-
-#pragma mark - GPBDescriptorRoot_FileDescriptor
-
-static GPBFileDescriptor *GPBDescriptorRoot_FileDescriptor(void) {
-  // This is called by +initialize so there is no need to worry
-  // about thread safety of the singleton.
-  static GPBFileDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    GPBDebugCheckRuntimeVersion();
-    descriptor = [[GPBFileDescriptor alloc] initWithPackage:@"google.protobuf"
-                                                     syntax:GPBFileSyntaxProto2];
-  }
-  return descriptor;
-}
-
-#pragma mark - GPBFileDescriptorSet
-
-@implementation GPBFileDescriptorSet
-
-@dynamic fileArray, fileArray_Count;
-
-typedef struct GPBFileDescriptorSet__storage_ {
-  uint32_t _has_storage_[1];
-  NSMutableArray *fileArray;
-} GPBFileDescriptorSet__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "fileArray",
-        .number = GPBFileDescriptorSet_FieldNumber_FileArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorSet__storage_, fileArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFileDescriptorProto),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFileDescriptorSet class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBFileDescriptorSet__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBFileDescriptorProto
-
-@implementation GPBFileDescriptorProto
-
-@dynamic hasName, name;
-@dynamic hasPackage, package;
-@dynamic dependencyArray, dependencyArray_Count;
-@dynamic publicDependencyArray, publicDependencyArray_Count;
-@dynamic weakDependencyArray, weakDependencyArray_Count;
-@dynamic messageTypeArray, messageTypeArray_Count;
-@dynamic enumTypeArray, enumTypeArray_Count;
-@dynamic serviceArray, serviceArray_Count;
-@dynamic extensionArray, extensionArray_Count;
-@dynamic hasOptions, options;
-@dynamic hasSourceCodeInfo, sourceCodeInfo;
-@dynamic hasSyntax, syntax;
-
-typedef struct GPBFileDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-  NSString *package;
-  NSMutableArray *dependencyArray;
-  NSMutableArray *messageTypeArray;
-  NSMutableArray *enumTypeArray;
-  NSMutableArray *serviceArray;
-  NSMutableArray *extensionArray;
-  GPBFileOptions *options;
-  GPBSourceCodeInfo *sourceCodeInfo;
-  GPBInt32Array *publicDependencyArray;
-  GPBInt32Array *weakDependencyArray;
-  NSString *syntax;
-} GPBFileDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBFileDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "package",
-        .number = GPBFileDescriptorProto_FieldNumber_Package,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, package),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "dependencyArray",
-        .number = GPBFileDescriptorProto_FieldNumber_DependencyArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, dependencyArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "messageTypeArray",
-        .number = GPBFileDescriptorProto_FieldNumber_MessageTypeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, messageTypeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "enumTypeArray",
-        .number = GPBFileDescriptorProto_FieldNumber_EnumTypeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, enumTypeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "serviceArray",
-        .number = GPBFileDescriptorProto_FieldNumber_ServiceArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, serviceArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBServiceDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "extensionArray",
-        .number = GPBFileDescriptorProto_FieldNumber_ExtensionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, extensionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFieldDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBFileDescriptorProto_FieldNumber_Options,
-        .hasIndex = 9,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFileOptions),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "sourceCodeInfo",
-        .number = GPBFileDescriptorProto_FieldNumber_SourceCodeInfo,
-        .hasIndex = 10,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, sourceCodeInfo),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceCodeInfo),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "publicDependencyArray",
-        .number = GPBFileDescriptorProto_FieldNumber_PublicDependencyArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, publicDependencyArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "weakDependencyArray",
-        .number = GPBFileDescriptorProto_FieldNumber_WeakDependencyArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, weakDependencyArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "syntax",
-        .number = GPBFileDescriptorProto_FieldNumber_Syntax,
-        .hasIndex = 11,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileDescriptorProto__storage_, syntax),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFileDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBFileDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBDescriptorProto
-
-@implementation GPBDescriptorProto
-
-@dynamic hasName, name;
-@dynamic fieldArray, fieldArray_Count;
-@dynamic extensionArray, extensionArray_Count;
-@dynamic nestedTypeArray, nestedTypeArray_Count;
-@dynamic enumTypeArray, enumTypeArray_Count;
-@dynamic extensionRangeArray, extensionRangeArray_Count;
-@dynamic oneofDeclArray, oneofDeclArray_Count;
-@dynamic hasOptions, options;
-@dynamic reservedRangeArray, reservedRangeArray_Count;
-@dynamic reservedNameArray, reservedNameArray_Count;
-
-typedef struct GPBDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-  NSMutableArray *fieldArray;
-  NSMutableArray *nestedTypeArray;
-  NSMutableArray *enumTypeArray;
-  NSMutableArray *extensionRangeArray;
-  NSMutableArray *extensionArray;
-  GPBMessageOptions *options;
-  NSMutableArray *oneofDeclArray;
-  NSMutableArray *reservedRangeArray;
-  NSMutableArray *reservedNameArray;
-} GPBDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "fieldArray",
-        .number = GPBDescriptorProto_FieldNumber_FieldArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, fieldArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFieldDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "nestedTypeArray",
-        .number = GPBDescriptorProto_FieldNumber_NestedTypeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, nestedTypeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "enumTypeArray",
-        .number = GPBDescriptorProto_FieldNumber_EnumTypeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, enumTypeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "extensionRangeArray",
-        .number = GPBDescriptorProto_FieldNumber_ExtensionRangeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, extensionRangeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBDescriptorProto_ExtensionRange),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "extensionArray",
-        .number = GPBDescriptorProto_FieldNumber_ExtensionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, extensionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFieldDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBDescriptorProto_FieldNumber_Options,
-        .hasIndex = 7,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMessageOptions),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "oneofDeclArray",
-        .number = GPBDescriptorProto_FieldNumber_OneofDeclArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, oneofDeclArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOneofDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "reservedRangeArray",
-        .number = GPBDescriptorProto_FieldNumber_ReservedRangeArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBDescriptorProto__storage_, reservedRangeArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBDescriptorProto_ReservedRange),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "reservedNameArray",
-        .number = GPBDescriptorProto_FieldNumber_ReservedNameArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBDescriptorProto__storage_, reservedNameArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBDescriptorProto_ExtensionRange
-
-@implementation GPBDescriptorProto_ExtensionRange
-
-@dynamic hasStart, start;
-@dynamic hasEnd, end;
-
-typedef struct GPBDescriptorProto_ExtensionRange__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t start;
-  int32_t end;
-} GPBDescriptorProto_ExtensionRange__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "start",
-        .number = GPBDescriptorProto_ExtensionRange_FieldNumber_Start,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDescriptorProto_ExtensionRange__storage_, start),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "end",
-        .number = GPBDescriptorProto_ExtensionRange_FieldNumber_End,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDescriptorProto_ExtensionRange__storage_, end),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBDescriptorProto_ExtensionRange class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBDescriptorProto_ExtensionRange__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBDescriptorProto_ReservedRange
-
-@implementation GPBDescriptorProto_ReservedRange
-
-@dynamic hasStart, start;
-@dynamic hasEnd, end;
-
-typedef struct GPBDescriptorProto_ReservedRange__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t start;
-  int32_t end;
-} GPBDescriptorProto_ReservedRange__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "start",
-        .number = GPBDescriptorProto_ReservedRange_FieldNumber_Start,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDescriptorProto_ReservedRange__storage_, start),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "end",
-        .number = GPBDescriptorProto_ReservedRange_FieldNumber_End,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDescriptorProto_ReservedRange__storage_, end),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBDescriptorProto_ReservedRange class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBDescriptorProto_ReservedRange__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBFieldDescriptorProto
-
-@implementation GPBFieldDescriptorProto
-
-@dynamic hasName, name;
-@dynamic hasNumber, number;
-@dynamic hasLabel, label;
-@dynamic hasType, type;
-@dynamic hasTypeName, typeName;
-@dynamic hasExtendee, extendee;
-@dynamic hasDefaultValue, defaultValue;
-@dynamic hasOneofIndex, oneofIndex;
-@dynamic hasJsonName, jsonName;
-@dynamic hasOptions, options;
-
-typedef struct GPBFieldDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t number;
-  GPBFieldDescriptorProto_Label label;
-  GPBFieldDescriptorProto_Type type;
-  int32_t oneofIndex;
-  NSString *name;
-  NSString *extendee;
-  NSString *typeName;
-  NSString *defaultValue;
-  GPBFieldOptions *options;
-  NSString *jsonName;
-} GPBFieldDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBFieldDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "extendee",
-        .number = GPBFieldDescriptorProto_FieldNumber_Extendee,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, extendee),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "number",
-        .number = GPBFieldDescriptorProto_FieldNumber_Number,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, number),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "label",
-        .number = GPBFieldDescriptorProto_FieldNumber_Label,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, label),
-        .defaultValue.valueEnum = GPBFieldDescriptorProto_Label_LabelOptional,
-        .dataTypeSpecific.enumDescFunc = GPBFieldDescriptorProto_Label_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "type",
-        .number = GPBFieldDescriptorProto_FieldNumber_Type,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, type),
-        .defaultValue.valueEnum = GPBFieldDescriptorProto_Type_TypeDouble,
-        .dataTypeSpecific.enumDescFunc = GPBFieldDescriptorProto_Type_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "typeName",
-        .number = GPBFieldDescriptorProto_FieldNumber_TypeName,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, typeName),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "defaultValue",
-        .number = GPBFieldDescriptorProto_FieldNumber_DefaultValue,
-        .hasIndex = 6,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, defaultValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBFieldDescriptorProto_FieldNumber_Options,
-        .hasIndex = 9,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBFieldOptions),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "oneofIndex",
-        .number = GPBFieldDescriptorProto_FieldNumber_OneofIndex,
-        .hasIndex = 7,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, oneofIndex),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "jsonName",
-        .number = GPBFieldDescriptorProto_FieldNumber_JsonName,
-        .hasIndex = 8,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldDescriptorProto__storage_, jsonName),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBMessageEnumDescription enums[] = {
-      { .enumDescriptorFunc = GPBFieldDescriptorProto_Type_EnumDescriptor },
-      { .enumDescriptorFunc = GPBFieldDescriptorProto_Label_EnumDescriptor },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFieldDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:enums
-                                     enumCount:sizeof(enums) / sizeof(GPBMessageEnumDescription)
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBFieldDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - Enum GPBFieldDescriptorProto_Type
-
-GPBEnumDescriptor *GPBFieldDescriptorProto_Type_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "TypeDouble", .number = GPBFieldDescriptorProto_Type_TypeDouble },
-      { .name = "TypeFloat", .number = GPBFieldDescriptorProto_Type_TypeFloat },
-      { .name = "TypeInt64", .number = GPBFieldDescriptorProto_Type_TypeInt64 },
-      { .name = "TypeUint64", .number = GPBFieldDescriptorProto_Type_TypeUint64 },
-      { .name = "TypeInt32", .number = GPBFieldDescriptorProto_Type_TypeInt32 },
-      { .name = "TypeFixed64", .number = GPBFieldDescriptorProto_Type_TypeFixed64 },
-      { .name = "TypeFixed32", .number = GPBFieldDescriptorProto_Type_TypeFixed32 },
-      { .name = "TypeBool", .number = GPBFieldDescriptorProto_Type_TypeBool },
-      { .name = "TypeString", .number = GPBFieldDescriptorProto_Type_TypeString },
-      { .name = "TypeGroup", .number = GPBFieldDescriptorProto_Type_TypeGroup },
-      { .name = "TypeMessage", .number = GPBFieldDescriptorProto_Type_TypeMessage },
-      { .name = "TypeBytes", .number = GPBFieldDescriptorProto_Type_TypeBytes },
-      { .name = "TypeUint32", .number = GPBFieldDescriptorProto_Type_TypeUint32 },
-      { .name = "TypeEnum", .number = GPBFieldDescriptorProto_Type_TypeEnum },
-      { .name = "TypeSfixed32", .number = GPBFieldDescriptorProto_Type_TypeSfixed32 },
-      { .name = "TypeSfixed64", .number = GPBFieldDescriptorProto_Type_TypeSfixed64 },
-      { .name = "TypeSint32", .number = GPBFieldDescriptorProto_Type_TypeSint32 },
-      { .name = "TypeSint64", .number = GPBFieldDescriptorProto_Type_TypeSint64 },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFieldDescriptorProto_Type)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFieldDescriptorProto_Type_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFieldDescriptorProto_Type_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFieldDescriptorProto_Type_TypeDouble:
-    case GPBFieldDescriptorProto_Type_TypeFloat:
-    case GPBFieldDescriptorProto_Type_TypeInt64:
-    case GPBFieldDescriptorProto_Type_TypeUint64:
-    case GPBFieldDescriptorProto_Type_TypeInt32:
-    case GPBFieldDescriptorProto_Type_TypeFixed64:
-    case GPBFieldDescriptorProto_Type_TypeFixed32:
-    case GPBFieldDescriptorProto_Type_TypeBool:
-    case GPBFieldDescriptorProto_Type_TypeString:
-    case GPBFieldDescriptorProto_Type_TypeGroup:
-    case GPBFieldDescriptorProto_Type_TypeMessage:
-    case GPBFieldDescriptorProto_Type_TypeBytes:
-    case GPBFieldDescriptorProto_Type_TypeUint32:
-    case GPBFieldDescriptorProto_Type_TypeEnum:
-    case GPBFieldDescriptorProto_Type_TypeSfixed32:
-    case GPBFieldDescriptorProto_Type_TypeSfixed64:
-    case GPBFieldDescriptorProto_Type_TypeSint32:
-    case GPBFieldDescriptorProto_Type_TypeSint64:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - Enum GPBFieldDescriptorProto_Label
-
-GPBEnumDescriptor *GPBFieldDescriptorProto_Label_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "LabelOptional", .number = GPBFieldDescriptorProto_Label_LabelOptional },
-      { .name = "LabelRequired", .number = GPBFieldDescriptorProto_Label_LabelRequired },
-      { .name = "LabelRepeated", .number = GPBFieldDescriptorProto_Label_LabelRepeated },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFieldDescriptorProto_Label)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFieldDescriptorProto_Label_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFieldDescriptorProto_Label_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFieldDescriptorProto_Label_LabelOptional:
-    case GPBFieldDescriptorProto_Label_LabelRequired:
-    case GPBFieldDescriptorProto_Label_LabelRepeated:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - GPBOneofDescriptorProto
-
-@implementation GPBOneofDescriptorProto
-
-@dynamic hasName, name;
-
-typedef struct GPBOneofDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-} GPBOneofDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBOneofDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBOneofDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBOneofDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBOneofDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBEnumDescriptorProto
-
-@implementation GPBEnumDescriptorProto
-
-@dynamic hasName, name;
-@dynamic valueArray, valueArray_Count;
-@dynamic hasOptions, options;
-
-typedef struct GPBEnumDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-  NSMutableArray *valueArray;
-  GPBEnumOptions *options;
-} GPBEnumDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBEnumDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBEnumDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "valueArray",
-        .number = GPBEnumDescriptorProto_FieldNumber_ValueArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumDescriptorProto__storage_, valueArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumValueDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBEnumDescriptorProto_FieldNumber_Options,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumOptions),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBEnumDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBEnumDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBEnumValueDescriptorProto
-
-@implementation GPBEnumValueDescriptorProto
-
-@dynamic hasName, name;
-@dynamic hasNumber, number;
-@dynamic hasOptions, options;
-
-typedef struct GPBEnumValueDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t number;
-  NSString *name;
-  GPBEnumValueOptions *options;
-} GPBEnumValueDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBEnumValueDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBEnumValueDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "number",
-        .number = GPBEnumValueDescriptorProto_FieldNumber_Number,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBEnumValueDescriptorProto__storage_, number),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBEnumValueDescriptorProto_FieldNumber_Options,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumValueDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumValueOptions),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBEnumValueDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBEnumValueDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBServiceDescriptorProto
-
-@implementation GPBServiceDescriptorProto
-
-@dynamic hasName, name;
-@dynamic methodArray, methodArray_Count;
-@dynamic hasOptions, options;
-
-typedef struct GPBServiceDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  NSString *name;
-  NSMutableArray *methodArray;
-  GPBServiceOptions *options;
-} GPBServiceDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBServiceDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBServiceDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "methodArray",
-        .number = GPBServiceDescriptorProto_FieldNumber_MethodArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBServiceDescriptorProto__storage_, methodArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMethodDescriptorProto),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBServiceDescriptorProto_FieldNumber_Options,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBServiceDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBServiceOptions),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBServiceDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBServiceDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBMethodDescriptorProto
-
-@implementation GPBMethodDescriptorProto
-
-@dynamic hasName, name;
-@dynamic hasInputType, inputType;
-@dynamic hasOutputType, outputType;
-@dynamic hasOptions, options;
-@dynamic hasClientStreaming, clientStreaming;
-@dynamic hasServerStreaming, serverStreaming;
-
-typedef struct GPBMethodDescriptorProto__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL clientStreaming;
-  BOOL serverStreaming;
-  NSString *name;
-  NSString *inputType;
-  NSString *outputType;
-  GPBMethodOptions *options;
-} GPBMethodDescriptorProto__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "name",
-        .number = GPBMethodDescriptorProto_FieldNumber_Name,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "inputType",
-        .number = GPBMethodDescriptorProto_FieldNumber_InputType,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, inputType),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "outputType",
-        .number = GPBMethodDescriptorProto_FieldNumber_OutputType,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, outputType),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "options",
-        .number = GPBMethodDescriptorProto_FieldNumber_Options,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, options),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBMethodOptions),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "clientStreaming",
-        .number = GPBMethodDescriptorProto_FieldNumber_ClientStreaming,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, clientStreaming),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "serverStreaming",
-        .number = GPBMethodDescriptorProto_FieldNumber_ServerStreaming,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethodDescriptorProto__storage_, serverStreaming),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBMethodDescriptorProto class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBMethodDescriptorProto__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBFileOptions
-
-@implementation GPBFileOptions
-
-@dynamic hasJavaPackage, javaPackage;
-@dynamic hasJavaOuterClassname, javaOuterClassname;
-@dynamic hasJavaMultipleFiles, javaMultipleFiles;
-@dynamic hasJavaGenerateEqualsAndHash, javaGenerateEqualsAndHash;
-@dynamic hasJavaStringCheckUtf8, javaStringCheckUtf8;
-@dynamic hasOptimizeFor, optimizeFor;
-@dynamic hasGoPackage, goPackage;
-@dynamic hasCcGenericServices, ccGenericServices;
-@dynamic hasJavaGenericServices, javaGenericServices;
-@dynamic hasPyGenericServices, pyGenericServices;
-@dynamic hasDeprecated, deprecated;
-@dynamic hasCcEnableArenas, ccEnableArenas;
-@dynamic hasObjcClassPrefix, objcClassPrefix;
-@dynamic hasCsharpNamespace, csharpNamespace;
-@dynamic hasJavananoUseDeprecatedPackage, javananoUseDeprecatedPackage;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBFileOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL javaMultipleFiles;
-  BOOL ccGenericServices;
-  BOOL javaGenericServices;
-  BOOL pyGenericServices;
-  BOOL javaGenerateEqualsAndHash;
-  BOOL deprecated;
-  BOOL javaStringCheckUtf8;
-  BOOL ccEnableArenas;
-  BOOL javananoUseDeprecatedPackage;
-  GPBFileOptions_OptimizeMode optimizeFor;
-  NSString *javaPackage;
-  NSString *javaOuterClassname;
-  NSString *goPackage;
-  NSString *objcClassPrefix;
-  NSString *csharpNamespace;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBFileOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "javaPackage",
-        .number = GPBFileOptions_FieldNumber_JavaPackage,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, javaPackage),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaOuterClassname",
-        .number = GPBFileOptions_FieldNumber_JavaOuterClassname,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, javaOuterClassname),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "optimizeFor",
-        .number = GPBFileOptions_FieldNumber_OptimizeFor,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFileOptions__storage_, optimizeFor),
-        .defaultValue.valueEnum = GPBFileOptions_OptimizeMode_Speed,
-        .dataTypeSpecific.enumDescFunc = GPBFileOptions_OptimizeMode_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaMultipleFiles",
-        .number = GPBFileOptions_FieldNumber_JavaMultipleFiles,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javaMultipleFiles),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "goPackage",
-        .number = GPBFileOptions_FieldNumber_GoPackage,
-        .hasIndex = 6,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, goPackage),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "ccGenericServices",
-        .number = GPBFileOptions_FieldNumber_CcGenericServices,
-        .hasIndex = 7,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, ccGenericServices),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaGenericServices",
-        .number = GPBFileOptions_FieldNumber_JavaGenericServices,
-        .hasIndex = 8,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javaGenericServices),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "pyGenericServices",
-        .number = GPBFileOptions_FieldNumber_PyGenericServices,
-        .hasIndex = 9,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, pyGenericServices),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaGenerateEqualsAndHash",
-        .number = GPBFileOptions_FieldNumber_JavaGenerateEqualsAndHash,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javaGenerateEqualsAndHash),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "deprecated",
-        .number = GPBFileOptions_FieldNumber_Deprecated,
-        .hasIndex = 10,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javaStringCheckUtf8",
-        .number = GPBFileOptions_FieldNumber_JavaStringCheckUtf8,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javaStringCheckUtf8),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "ccEnableArenas",
-        .number = GPBFileOptions_FieldNumber_CcEnableArenas,
-        .hasIndex = 11,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, ccEnableArenas),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "objcClassPrefix",
-        .number = GPBFileOptions_FieldNumber_ObjcClassPrefix,
-        .hasIndex = 12,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, objcClassPrefix),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "csharpNamespace",
-        .number = GPBFileOptions_FieldNumber_CsharpNamespace,
-        .hasIndex = 13,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFileOptions__storage_, csharpNamespace),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "javananoUseDeprecatedPackage",
-        .number = GPBFileOptions_FieldNumber_JavananoUseDeprecatedPackage,
-        .hasIndex = 14,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFileOptions__storage_, javananoUseDeprecatedPackage),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-      #if GPBOBJC_INCLUDE_FIELD_OPTIONS
-        .fieldOptions = "\000\000\000\002\030\001",
-      #else
-        .fieldOptions = NULL,
-      #endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBFileOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFileOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBMessageEnumDescription enums[] = {
-      { .enumDescriptorFunc = GPBFileOptions_OptimizeMode_EnumDescriptor },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFileOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:enums
-                                     enumCount:sizeof(enums) / sizeof(GPBMessageEnumDescription)
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBFileOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - Enum GPBFileOptions_OptimizeMode
-
-GPBEnumDescriptor *GPBFileOptions_OptimizeMode_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "Speed", .number = GPBFileOptions_OptimizeMode_Speed },
-      { .name = "CodeSize", .number = GPBFileOptions_OptimizeMode_CodeSize },
-      { .name = "LiteRuntime", .number = GPBFileOptions_OptimizeMode_LiteRuntime },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFileOptions_OptimizeMode)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFileOptions_OptimizeMode_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFileOptions_OptimizeMode_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFileOptions_OptimizeMode_Speed:
-    case GPBFileOptions_OptimizeMode_CodeSize:
-    case GPBFileOptions_OptimizeMode_LiteRuntime:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - GPBMessageOptions
-
-@implementation GPBMessageOptions
-
-@dynamic hasMessageSetWireFormat, messageSetWireFormat;
-@dynamic hasNoStandardDescriptorAccessor, noStandardDescriptorAccessor;
-@dynamic hasDeprecated, deprecated;
-@dynamic hasMapEntry, mapEntry;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBMessageOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL messageSetWireFormat;
-  BOOL noStandardDescriptorAccessor;
-  BOOL deprecated;
-  BOOL mapEntry;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBMessageOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "messageSetWireFormat",
-        .number = GPBMessageOptions_FieldNumber_MessageSetWireFormat,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMessageOptions__storage_, messageSetWireFormat),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "noStandardDescriptorAccessor",
-        .number = GPBMessageOptions_FieldNumber_NoStandardDescriptorAccessor,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMessageOptions__storage_, noStandardDescriptorAccessor),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "deprecated",
-        .number = GPBMessageOptions_FieldNumber_Deprecated,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMessageOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "mapEntry",
-        .number = GPBMessageOptions_FieldNumber_MapEntry,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMessageOptions__storage_, mapEntry),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBMessageOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBMessageOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBMessageOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBMessageOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBFieldOptions
-
-@implementation GPBFieldOptions
-
-@dynamic hasCtype, ctype;
-@dynamic hasPacked, packed;
-@dynamic hasJstype, jstype;
-@dynamic hasLazy, lazy;
-@dynamic hasDeprecated, deprecated;
-@dynamic hasWeak, weak;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBFieldOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL packed;
-  BOOL deprecated;
-  BOOL lazy;
-  BOOL weak;
-  GPBFieldOptions_CType ctype;
-  GPBFieldOptions_JSType jstype;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBFieldOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "ctype",
-        .number = GPBFieldOptions_FieldNumber_Ctype,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFieldOptions__storage_, ctype),
-        .defaultValue.valueEnum = GPBFieldOptions_CType_String,
-        .dataTypeSpecific.enumDescFunc = GPBFieldOptions_CType_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "packed",
-        .number = GPBFieldOptions_FieldNumber_Packed,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFieldOptions__storage_, packed),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "deprecated",
-        .number = GPBFieldOptions_FieldNumber_Deprecated,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFieldOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "lazy",
-        .number = GPBFieldOptions_FieldNumber_Lazy,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFieldOptions__storage_, lazy),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "jstype",
-        .number = GPBFieldOptions_FieldNumber_Jstype,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue | GPBFieldHasEnumDescriptor,
-        .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBFieldOptions__storage_, jstype),
-        .defaultValue.valueEnum = GPBFieldOptions_JSType_JsNormal,
-        .dataTypeSpecific.enumDescFunc = GPBFieldOptions_JSType_EnumDescriptor,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "weak",
-        .number = GPBFieldOptions_FieldNumber_Weak,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBFieldOptions__storage_, weak),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBFieldOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBFieldOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBMessageEnumDescription enums[] = {
-      { .enumDescriptorFunc = GPBFieldOptions_CType_EnumDescriptor },
-      { .enumDescriptorFunc = GPBFieldOptions_JSType_EnumDescriptor },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBFieldOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:enums
-                                     enumCount:sizeof(enums) / sizeof(GPBMessageEnumDescription)
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBFieldOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - Enum GPBFieldOptions_CType
-
-GPBEnumDescriptor *GPBFieldOptions_CType_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "String", .number = GPBFieldOptions_CType_String },
-      { .name = "Cord", .number = GPBFieldOptions_CType_Cord },
-      { .name = "StringPiece", .number = GPBFieldOptions_CType_StringPiece },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFieldOptions_CType)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFieldOptions_CType_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFieldOptions_CType_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFieldOptions_CType_String:
-    case GPBFieldOptions_CType_Cord:
-    case GPBFieldOptions_CType_StringPiece:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - Enum GPBFieldOptions_JSType
-
-GPBEnumDescriptor *GPBFieldOptions_JSType_EnumDescriptor(void) {
-  static GPBEnumDescriptor *descriptor = NULL;
-  if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "JsNormal", .number = GPBFieldOptions_JSType_JsNormal },
-      { .name = "JsString", .number = GPBFieldOptions_JSType_JsString },
-      { .name = "JsNumber", .number = GPBFieldOptions_JSType_JsNumber },
-    };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBFieldOptions_JSType)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBFieldOptions_JSType_IsValidValue];
-  }
-  return descriptor;
-}
-
-BOOL GPBFieldOptions_JSType_IsValidValue(int32_t value__) {
-  switch (value__) {
-    case GPBFieldOptions_JSType_JsNormal:
-    case GPBFieldOptions_JSType_JsString:
-    case GPBFieldOptions_JSType_JsNumber:
-      return YES;
-    default:
-      return NO;
-  }
-}
-
-#pragma mark - GPBEnumOptions
-
-@implementation GPBEnumOptions
-
-@dynamic hasAllowAlias, allowAlias;
-@dynamic hasDeprecated, deprecated;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBEnumOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL allowAlias;
-  BOOL deprecated;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBEnumOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "allowAlias",
-        .number = GPBEnumOptions_FieldNumber_AllowAlias,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBEnumOptions__storage_, allowAlias),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "deprecated",
-        .number = GPBEnumOptions_FieldNumber_Deprecated,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBEnumOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBEnumOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBEnumOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBEnumOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBEnumValueOptions
-
-@implementation GPBEnumValueOptions
-
-@dynamic hasDeprecated, deprecated;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBEnumValueOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL deprecated;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBEnumValueOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "deprecated",
-        .number = GPBEnumValueOptions_FieldNumber_Deprecated,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBEnumValueOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBEnumValueOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumValueOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBEnumValueOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBEnumValueOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBServiceOptions
-
-@implementation GPBServiceOptions
-
-@dynamic hasDeprecated, deprecated;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBServiceOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL deprecated;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBServiceOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "deprecated",
-        .number = GPBServiceOptions_FieldNumber_Deprecated,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBServiceOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBServiceOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBServiceOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBServiceOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBServiceOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBMethodOptions
-
-@implementation GPBMethodOptions
-
-@dynamic hasDeprecated, deprecated;
-@dynamic uninterpretedOptionArray, uninterpretedOptionArray_Count;
-
-typedef struct GPBMethodOptions__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL deprecated;
-  NSMutableArray *uninterpretedOptionArray;
-} GPBMethodOptions__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "deprecated",
-        .number = GPBMethodOptions_FieldNumber_Deprecated,
-        .hasIndex = 0,
-        .flags = GPBFieldOptional | GPBFieldHasDefaultValue,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBMethodOptions__storage_, deprecated),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "uninterpretedOptionArray",
-        .number = GPBMethodOptions_FieldNumber_UninterpretedOptionArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBMethodOptions__storage_, uninterpretedOptionArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption),
-        .fieldOptions = NULL,
-      },
-    };
-    static GPBExtensionRange ranges[] = {
-      { .start = 1000, .end = 536870912 },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBMethodOptions class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:ranges
-                                    rangeCount:sizeof(ranges) / sizeof(GPBExtensionRange)
-                                   storageSize:sizeof(GPBMethodOptions__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBUninterpretedOption
-
-@implementation GPBUninterpretedOption
-
-@dynamic nameArray, nameArray_Count;
-@dynamic hasIdentifierValue, identifierValue;
-@dynamic hasPositiveIntValue, positiveIntValue;
-@dynamic hasNegativeIntValue, negativeIntValue;
-@dynamic hasDoubleValue, doubleValue;
-@dynamic hasStringValue, stringValue;
-@dynamic hasAggregateValue, aggregateValue;
-
-typedef struct GPBUninterpretedOption__storage_ {
-  uint32_t _has_storage_[1];
-  NSMutableArray *nameArray;
-  NSString *identifierValue;
-  NSData *stringValue;
-  NSString *aggregateValue;
-  uint64_t positiveIntValue;
-  int64_t negativeIntValue;
-  double doubleValue;
-} GPBUninterpretedOption__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "nameArray",
-        .number = GPBUninterpretedOption_FieldNumber_NameArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBUninterpretedOption__storage_, nameArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBUninterpretedOption_NamePart),
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "identifierValue",
-        .number = GPBUninterpretedOption_FieldNumber_IdentifierValue,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBUninterpretedOption__storage_, identifierValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "positiveIntValue",
-        .number = GPBUninterpretedOption_FieldNumber_PositiveIntValue,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeUInt64,
-        .offset = offsetof(GPBUninterpretedOption__storage_, positiveIntValue),
-        .defaultValue.valueUInt64 = 0ULL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "negativeIntValue",
-        .number = GPBUninterpretedOption_FieldNumber_NegativeIntValue,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt64,
-        .offset = offsetof(GPBUninterpretedOption__storage_, negativeIntValue),
-        .defaultValue.valueInt64 = 0LL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "doubleValue",
-        .number = GPBUninterpretedOption_FieldNumber_DoubleValue,
-        .hasIndex = 4,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeDouble,
-        .offset = offsetof(GPBUninterpretedOption__storage_, doubleValue),
-        .defaultValue.valueDouble = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "stringValue",
-        .number = GPBUninterpretedOption_FieldNumber_StringValue,
-        .hasIndex = 5,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeBytes,
-        .offset = offsetof(GPBUninterpretedOption__storage_, stringValue),
-        .defaultValue.valueData = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "aggregateValue",
-        .number = GPBUninterpretedOption_FieldNumber_AggregateValue,
-        .hasIndex = 6,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBUninterpretedOption__storage_, aggregateValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBUninterpretedOption class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBUninterpretedOption__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBUninterpretedOption_NamePart
-
-@implementation GPBUninterpretedOption_NamePart
-
-@dynamic hasNamePart, namePart;
-@dynamic hasIsExtension, isExtension;
-
-typedef struct GPBUninterpretedOption_NamePart__storage_ {
-  uint32_t _has_storage_[1];
-  BOOL isExtension;
-  NSString *namePart;
-} GPBUninterpretedOption_NamePart__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "namePart",
-        .number = GPBUninterpretedOption_NamePart_FieldNumber_NamePart,
-        .hasIndex = 0,
-        .flags = GPBFieldRequired,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBUninterpretedOption_NamePart__storage_, namePart),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "isExtension",
-        .number = GPBUninterpretedOption_NamePart_FieldNumber_IsExtension,
-        .hasIndex = 1,
-        .flags = GPBFieldRequired,
-        .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBUninterpretedOption_NamePart__storage_, isExtension),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBUninterpretedOption_NamePart class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBUninterpretedOption_NamePart__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBSourceCodeInfo
-
-@implementation GPBSourceCodeInfo
-
-@dynamic locationArray, locationArray_Count;
-
-typedef struct GPBSourceCodeInfo__storage_ {
-  uint32_t _has_storage_[1];
-  NSMutableArray *locationArray;
-} GPBSourceCodeInfo__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "locationArray",
-        .number = GPBSourceCodeInfo_FieldNumber_LocationArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBSourceCodeInfo__storage_, locationArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceCodeInfo_Location),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBSourceCodeInfo class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBSourceCodeInfo__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBSourceCodeInfo_Location
-
-@implementation GPBSourceCodeInfo_Location
-
-@dynamic pathArray, pathArray_Count;
-@dynamic spanArray, spanArray_Count;
-@dynamic hasLeadingComments, leadingComments;
-@dynamic hasTrailingComments, trailingComments;
-@dynamic leadingDetachedCommentsArray, leadingDetachedCommentsArray_Count;
-
-typedef struct GPBSourceCodeInfo_Location__storage_ {
-  uint32_t _has_storage_[1];
-  GPBInt32Array *pathArray;
-  GPBInt32Array *spanArray;
-  NSString *leadingComments;
-  NSString *trailingComments;
-  NSMutableArray *leadingDetachedCommentsArray;
-} GPBSourceCodeInfo_Location__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "pathArray",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_PathArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated | GPBFieldPacked,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, pathArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-      #if GPBOBJC_INCLUDE_FIELD_OPTIONS
-        .fieldOptions = "\000\000\000\002\020\001",
-      #else
-        .fieldOptions = NULL,
-      #endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS
-      },
-      {
-        .name = "spanArray",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_SpanArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated | GPBFieldPacked,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, spanArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-      #if GPBOBJC_INCLUDE_FIELD_OPTIONS
-        .fieldOptions = "\000\000\000\002\020\001",
-      #else
-        .fieldOptions = NULL,
-      #endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS
-      },
-      {
-        .name = "leadingComments",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_LeadingComments,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, leadingComments),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "trailingComments",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_TrailingComments,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, trailingComments),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "leadingDetachedCommentsArray",
-        .number = GPBSourceCodeInfo_Location_FieldNumber_LeadingDetachedCommentsArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBSourceCodeInfo_Location__storage_, leadingDetachedCommentsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBSourceCodeInfo_Location class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBSourceCodeInfo_Location__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBGeneratedCodeInfo
-
-@implementation GPBGeneratedCodeInfo
-
-@dynamic annotationArray, annotationArray_Count;
-
-typedef struct GPBGeneratedCodeInfo__storage_ {
-  uint32_t _has_storage_[1];
-  NSMutableArray *annotationArray;
-} GPBGeneratedCodeInfo__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "annotationArray",
-        .number = GPBGeneratedCodeInfo_FieldNumber_AnnotationArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated,
-        .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBGeneratedCodeInfo__storage_, annotationArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBGeneratedCodeInfo_Annotation),
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBGeneratedCodeInfo class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBGeneratedCodeInfo__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-#pragma mark - GPBGeneratedCodeInfo_Annotation
-
-@implementation GPBGeneratedCodeInfo_Annotation
-
-@dynamic pathArray, pathArray_Count;
-@dynamic hasSourceFile, sourceFile;
-@dynamic hasBegin, begin;
-@dynamic hasEnd, end;
-
-typedef struct GPBGeneratedCodeInfo_Annotation__storage_ {
-  uint32_t _has_storage_[1];
-  int32_t begin;
-  int32_t end;
-  GPBInt32Array *pathArray;
-  NSString *sourceFile;
-} GPBGeneratedCodeInfo_Annotation__storage_;
-
-// This method is threadsafe because it is initially called
-// in +initialize for each subclass.
-+ (GPBDescriptor *)descriptor {
-  static GPBDescriptor *descriptor = nil;
-  if (!descriptor) {
-    static GPBMessageFieldDescription fields[] = {
-      {
-        .name = "pathArray",
-        .number = GPBGeneratedCodeInfo_Annotation_FieldNumber_PathArray,
-        .hasIndex = GPBNoHasBit,
-        .flags = GPBFieldRepeated | GPBFieldPacked,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBGeneratedCodeInfo_Annotation__storage_, pathArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-      #if GPBOBJC_INCLUDE_FIELD_OPTIONS
-        .fieldOptions = "\000\000\000\002\020\001",
-      #else
-        .fieldOptions = NULL,
-      #endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS
-      },
-      {
-        .name = "sourceFile",
-        .number = GPBGeneratedCodeInfo_Annotation_FieldNumber_SourceFile,
-        .hasIndex = 1,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBGeneratedCodeInfo_Annotation__storage_, sourceFile),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "begin",
-        .number = GPBGeneratedCodeInfo_Annotation_FieldNumber_Begin,
-        .hasIndex = 2,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBGeneratedCodeInfo_Annotation__storage_, begin),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-      {
-        .name = "end",
-        .number = GPBGeneratedCodeInfo_Annotation_FieldNumber_End,
-        .hasIndex = 3,
-        .flags = GPBFieldOptional,
-        .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBGeneratedCodeInfo_Annotation__storage_, end),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
-      },
-    };
-    GPBDescriptor *localDescriptor =
-        [GPBDescriptor allocDescriptorForClass:[GPBGeneratedCodeInfo_Annotation class]
-                                     rootClass:[GPBDescriptorRoot class]
-                                          file:GPBDescriptorRoot_FileDescriptor()
-                                        fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
-                                   storageSize:sizeof(GPBGeneratedCodeInfo_Annotation__storage_)
-                                    wireFormat:NO];
-    NSAssert(descriptor == nil, @"Startup recursed!");
-    descriptor = localDescriptor;
-  }
-  return descriptor;
-}
-
-@end
-
-
-// @@protoc_insertion_point(global_scope)
diff --git a/objectivec/google/protobuf/Duration.pbobjc.h b/objectivec/google/protobuf/Duration.pbobjc.h
index ebf9119..3685a61 100644
--- a/objectivec/google/protobuf/Duration.pbobjc.h
+++ b/objectivec/google/protobuf/Duration.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/Duration.pbobjc.m b/objectivec/google/protobuf/Duration.pbobjc.m
index e4fd495..bb79c7a 100644
--- a/objectivec/google/protobuf/Duration.pbobjc.m
+++ b/objectivec/google/protobuf/Duration.pbobjc.m
@@ -46,25 +46,21 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "seconds",
+        .dataTypeSpecific.className = NULL,
         .number = GPBDuration_FieldNumber_Seconds,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBDuration__storage_, seconds),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt64,
-        .offset = offsetof(GPBDuration__storage_, seconds),
-        .defaultValue.valueInt64 = 0LL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "nanos",
+        .dataTypeSpecific.className = NULL,
         .number = GPBDuration_FieldNumber_Nanos,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBDuration__storage_, nanos),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBDuration__storage_, nanos),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -72,15 +68,9 @@
                                      rootClass:[GPBDurationRoot class]
                                           file:GPBDurationRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBDuration__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Empty.pbobjc.h b/objectivec/google/protobuf/Empty.pbobjc.h
index ca09f71..6651ef7 100644
--- a/objectivec/google/protobuf/Empty.pbobjc.h
+++ b/objectivec/google/protobuf/Empty.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/Empty.pbobjc.m b/objectivec/google/protobuf/Empty.pbobjc.m
index 17f0c1a..5d7f8f1 100644
--- a/objectivec/google/protobuf/Empty.pbobjc.m
+++ b/objectivec/google/protobuf/Empty.pbobjc.m
@@ -31,7 +31,7 @@
 
 
 typedef struct GPBEmpty__storage_ {
-  uint32_t _has_storage_[0];
+  uint32_t _has_storage_[1];
 } GPBEmpty__storage_;
 
 // This method is threadsafe because it is initially called
@@ -45,14 +45,8 @@
                                           file:GPBEmptyRoot_FileDescriptor()
                                         fields:NULL
                                     fieldCount:0
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
                                    storageSize:sizeof(GPBEmpty__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/FieldMask.pbobjc.h b/objectivec/google/protobuf/FieldMask.pbobjc.h
index f861a98..931f664 100644
--- a/objectivec/google/protobuf/FieldMask.pbobjc.h
+++ b/objectivec/google/protobuf/FieldMask.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/FieldMask.pbobjc.m b/objectivec/google/protobuf/FieldMask.pbobjc.m
index f9684f5..36fc758 100644
--- a/objectivec/google/protobuf/FieldMask.pbobjc.m
+++ b/objectivec/google/protobuf/FieldMask.pbobjc.m
@@ -44,14 +44,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "pathsArray",
+        .dataTypeSpecific.className = NULL,
         .number = GPBFieldMask_FieldNumber_PathsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBFieldMask__storage_, pathsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBFieldMask__storage_, pathsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -59,15 +57,9 @@
                                      rootClass:[GPBFieldMaskRoot class]
                                           file:GPBFieldMaskRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBFieldMask__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/SourceContext.pbobjc.h b/objectivec/google/protobuf/SourceContext.pbobjc.h
index 546db67..67b6d47 100644
--- a/objectivec/google/protobuf/SourceContext.pbobjc.h
+++ b/objectivec/google/protobuf/SourceContext.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/SourceContext.pbobjc.m b/objectivec/google/protobuf/SourceContext.pbobjc.m
index ac1827f..4e8bf3d 100644
--- a/objectivec/google/protobuf/SourceContext.pbobjc.m
+++ b/objectivec/google/protobuf/SourceContext.pbobjc.m
@@ -44,14 +44,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "fileName",
+        .dataTypeSpecific.className = NULL,
         .number = GPBSourceContext_FieldNumber_FileName,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBSourceContext__storage_, fileName),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBSourceContext__storage_, fileName),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -59,15 +57,9 @@
                                      rootClass:[GPBSourceContextRoot class]
                                           file:GPBSourceContextRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBSourceContext__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Struct.pbobjc.h b/objectivec/google/protobuf/Struct.pbobjc.h
index 7b9c45a..e2388e2 100644
--- a/objectivec/google/protobuf/Struct.pbobjc.h
+++ b/objectivec/google/protobuf/Struct.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/Struct.pbobjc.m b/objectivec/google/protobuf/Struct.pbobjc.m
index 14b8f27..0601a4b 100644
--- a/objectivec/google/protobuf/Struct.pbobjc.m
+++ b/objectivec/google/protobuf/Struct.pbobjc.m
@@ -30,13 +30,20 @@
 GPBEnumDescriptor *GPBNullValue_EnumDescriptor(void) {
   static GPBEnumDescriptor *descriptor = NULL;
   if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "NullValue", .number = GPBNullValue_NullValue },
+    static const char *valueNames =
+        "NullValue\000";
+    static const int32_t values[] = {
+        GPBNullValue_NullValue,
     };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBNullValue)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBNullValue_IsValidValue];
+    GPBEnumDescriptor *worker =
+        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBNullValue)
+                                       valueNames:valueNames
+                                           values:values
+                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))
+                                     enumVerifier:GPBNullValue_IsValidValue];
+    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {
+      [worker release];
+    }
   }
   return descriptor;
 }
@@ -69,14 +76,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "fields",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBValue),
         .number = GPBStruct_FieldNumber_Fields,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBStruct__storage_, fields),
         .flags = GPBFieldMapKeyString,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBStruct__storage_, fields),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBValue),
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -84,15 +89,9 @@
                                      rootClass:[GPBStructRoot class]
                                           file:GPBStructRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBStruct__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -115,7 +114,6 @@
 
 typedef struct GPBValue__storage_ {
   uint32_t _has_storage_[2];
-  BOOL boolValue;
   GPBNullValue nullValue;
   NSString *stringValue;
   GPBStruct *structValue;
@@ -128,78 +126,60 @@
 + (GPBDescriptor *)descriptor {
   static GPBDescriptor *descriptor = nil;
   if (!descriptor) {
-    static GPBMessageOneofDescription oneofs[] = {
-      {
-        .name = "kind",
-        .index = -1,
-      },
-    };
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "nullValue",
+        .dataTypeSpecific.enumDescFunc = GPBNullValue_EnumDescriptor,
         .number = GPBValue_FieldNumber_NullValue,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, nullValue),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBValue__storage_, nullValue),
-        .defaultValue.valueEnum = GPBNullValue_NullValue,
-        .dataTypeSpecific.enumDescFunc = GPBNullValue_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       {
         .name = "numberValue",
+        .dataTypeSpecific.className = NULL,
         .number = GPBValue_FieldNumber_NumberValue,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, numberValue),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeDouble,
-        .offset = offsetof(GPBValue__storage_, numberValue),
-        .defaultValue.valueDouble = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "stringValue",
+        .dataTypeSpecific.className = NULL,
         .number = GPBValue_FieldNumber_StringValue,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, stringValue),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBValue__storage_, stringValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "boolValue",
+        .dataTypeSpecific.className = NULL,
         .number = GPBValue_FieldNumber_BoolValue,
         .hasIndex = -1,
+        .offset = 0,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBValue__storage_, boolValue),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "structValue",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBStruct),
         .number = GPBValue_FieldNumber_StructValue,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, structValue),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBValue__storage_, structValue),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBStruct),
-        .fieldOptions = NULL,
       },
       {
         .name = "listValue",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBListValue),
         .number = GPBValue_FieldNumber_ListValue,
         .hasIndex = -1,
+        .offset = (uint32_t)offsetof(GPBValue__storage_, listValue),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBValue__storage_, listValue),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBListValue),
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -207,15 +187,15 @@
                                      rootClass:[GPBStructRoot class]
                                           file:GPBStructRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:oneofs
-                                    oneofCount:sizeof(oneofs) / sizeof(GPBMessageOneofDescription)
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
+    static const char *oneofs[] = {
+      "kind",
+    };
+    [localDescriptor setupOneofs:oneofs
+                           count:(uint32_t)(sizeof(oneofs) / sizeof(char*))
+                   firstHasIndex:-1];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -239,7 +219,7 @@
 void GPBValue_ClearKindOneOfCase(GPBValue *message) {
   GPBDescriptor *descriptor = [message descriptor];
   GPBOneofDescriptor *oneof = descriptor->oneofs_[0];
-  GPBMaybeClearOneof(message, oneof, 0);
+  GPBMaybeClearOneof(message, oneof, -1, 0);
 }
 #pragma mark - GPBListValue
 
@@ -260,14 +240,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "valuesArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBValue),
         .number = GPBListValue_FieldNumber_ValuesArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBListValue__storage_, valuesArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBListValue__storage_, valuesArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBValue),
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -275,15 +253,9 @@
                                      rootClass:[GPBStructRoot class]
                                           file:GPBStructRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBListValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Timestamp.pbobjc.h b/objectivec/google/protobuf/Timestamp.pbobjc.h
index d17c286..b66b323 100644
--- a/objectivec/google/protobuf/Timestamp.pbobjc.h
+++ b/objectivec/google/protobuf/Timestamp.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/Timestamp.pbobjc.m b/objectivec/google/protobuf/Timestamp.pbobjc.m
index a206f15..1416115 100644
--- a/objectivec/google/protobuf/Timestamp.pbobjc.m
+++ b/objectivec/google/protobuf/Timestamp.pbobjc.m
@@ -46,25 +46,21 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "seconds",
+        .dataTypeSpecific.className = NULL,
         .number = GPBTimestamp_FieldNumber_Seconds,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBTimestamp__storage_, seconds),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt64,
-        .offset = offsetof(GPBTimestamp__storage_, seconds),
-        .defaultValue.valueInt64 = 0LL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "nanos",
+        .dataTypeSpecific.className = NULL,
         .number = GPBTimestamp_FieldNumber_Nanos,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBTimestamp__storage_, nanos),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBTimestamp__storage_, nanos),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -72,15 +68,9 @@
                                      rootClass:[GPBTimestampRoot class]
                                           file:GPBTimestampRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBTimestamp__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Type.pbobjc.h b/objectivec/google/protobuf/Type.pbobjc.h
index 9301e4f..efaeab3 100644
--- a/objectivec/google/protobuf/Type.pbobjc.h
+++ b/objectivec/google/protobuf/Type.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/Type.pbobjc.m b/objectivec/google/protobuf/Type.pbobjc.m
index b4e0a5f..175c023 100644
--- a/objectivec/google/protobuf/Type.pbobjc.m
+++ b/objectivec/google/protobuf/Type.pbobjc.m
@@ -45,14 +45,21 @@
 GPBEnumDescriptor *GPBSyntax_EnumDescriptor(void) {
   static GPBEnumDescriptor *descriptor = NULL;
   if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "SyntaxProto2", .number = GPBSyntax_SyntaxProto2 },
-      { .name = "SyntaxProto3", .number = GPBSyntax_SyntaxProto3 },
+    static const char *valueNames =
+        "SyntaxProto2\000SyntaxProto3\000";
+    static const int32_t values[] = {
+        GPBSyntax_SyntaxProto2,
+        GPBSyntax_SyntaxProto3,
     };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBSyntax)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBSyntax_IsValidValue];
+    GPBEnumDescriptor *worker =
+        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBSyntax)
+                                       valueNames:valueNames
+                                           values:values
+                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))
+                                     enumVerifier:GPBSyntax_IsValidValue];
+    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {
+      [worker release];
+    }
   }
   return descriptor;
 }
@@ -96,69 +103,57 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBType_FieldNumber_Name,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBType__storage_, name),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBType__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "fieldsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBField),
         .number = GPBType_FieldNumber_FieldsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBType__storage_, fieldsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBType__storage_, fieldsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBField),
-        .fieldOptions = NULL,
       },
       {
         .name = "oneofsArray",
+        .dataTypeSpecific.className = NULL,
         .number = GPBType_FieldNumber_OneofsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBType__storage_, oneofsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBType__storage_, oneofsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBType_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBType__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBType__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       {
         .name = "sourceContext",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .number = GPBType_FieldNumber_SourceContext,
-        .hasIndex = 4,
+        .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBType__storage_, sourceContext),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBType__storage_, sourceContext),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
-        .fieldOptions = NULL,
       },
       {
         .name = "syntax",
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
         .number = GPBType_FieldNumber_Syntax,
-        .hasIndex = 5,
+        .hasIndex = 2,
+        .offset = (uint32_t)offsetof(GPBType__storage_, syntax),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBType__storage_, syntax),
-        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
-        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -166,15 +161,9 @@
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBType__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -212,7 +201,6 @@
 
 typedef struct GPBField__storage_ {
   uint32_t _has_storage_[1];
-  BOOL packed;
   GPBField_Kind kind;
   GPBField_Cardinality cardinality;
   int32_t number;
@@ -232,139 +220,108 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "kind",
+        .dataTypeSpecific.enumDescFunc = GPBField_Kind_EnumDescriptor,
         .number = GPBField_FieldNumber_Kind,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBField__storage_, kind),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBField__storage_, kind),
-        .defaultValue.valueEnum = GPBField_Kind_TypeUnknown,
-        .dataTypeSpecific.enumDescFunc = GPBField_Kind_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       {
         .name = "cardinality",
+        .dataTypeSpecific.enumDescFunc = GPBField_Cardinality_EnumDescriptor,
         .number = GPBField_FieldNumber_Cardinality,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBField__storage_, cardinality),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBField__storage_, cardinality),
-        .defaultValue.valueEnum = GPBField_Cardinality_CardinalityUnknown,
-        .dataTypeSpecific.enumDescFunc = GPBField_Cardinality_EnumDescriptor,
-        .fieldOptions = NULL,
       },
       {
         .name = "number",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_Number,
         .hasIndex = 2,
+        .offset = (uint32_t)offsetof(GPBField__storage_, number),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBField__storage_, number),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_Name,
         .hasIndex = 3,
+        .offset = (uint32_t)offsetof(GPBField__storage_, name),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBField__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "typeURL",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_TypeURL,
         .hasIndex = 4,
+        .offset = (uint32_t)offsetof(GPBField__storage_, typeURL),
         .flags = GPBFieldOptional | GPBFieldTextFormatNameCustom,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBField__storage_, typeURL),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "oneofIndex",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_OneofIndex,
         .hasIndex = 5,
+        .offset = (uint32_t)offsetof(GPBField__storage_, oneofIndex),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBField__storage_, oneofIndex),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "packed",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_Packed,
         .hasIndex = 6,
+        .offset = 7,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBField__storage_, packed),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBField_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBField__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBField__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       {
         .name = "jsonName",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_JsonName,
         .hasIndex = 8,
+        .offset = (uint32_t)offsetof(GPBField__storage_, jsonName),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBField__storage_, jsonName),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "defaultValue",
+        .dataTypeSpecific.className = NULL,
         .number = GPBField_FieldNumber_DefaultValue,
         .hasIndex = 9,
+        .offset = (uint32_t)offsetof(GPBField__storage_, defaultValue),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBField__storage_, defaultValue),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
-    static GPBMessageEnumDescription enums[] = {
-      { .enumDescriptorFunc = GPBField_Kind_EnumDescriptor },
-      { .enumDescriptorFunc = GPBField_Cardinality_EnumDescriptor },
-    };
-#if GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
-    const char *extraTextFormatInfo = NULL;
-#else
-    static const char *extraTextFormatInfo = "\001\006\004\241!!\000";
-#endif  // GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     GPBDescriptor *localDescriptor =
         [GPBDescriptor allocDescriptorForClass:[GPBField class]
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:enums
-                                     enumCount:sizeof(enums) / sizeof(GPBMessageEnumDescription)
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBField__storage_)
-                                    wireFormat:NO
-                           extraTextFormatInfo:extraTextFormatInfo];
+                                         flags:0];
+#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
+    static const char *extraTextFormatInfo =
+        "\001\006\004\241!!\000";
+    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];
+#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -402,31 +359,43 @@
 GPBEnumDescriptor *GPBField_Kind_EnumDescriptor(void) {
   static GPBEnumDescriptor *descriptor = NULL;
   if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "TypeUnknown", .number = GPBField_Kind_TypeUnknown },
-      { .name = "TypeDouble", .number = GPBField_Kind_TypeDouble },
-      { .name = "TypeFloat", .number = GPBField_Kind_TypeFloat },
-      { .name = "TypeInt64", .number = GPBField_Kind_TypeInt64 },
-      { .name = "TypeUint64", .number = GPBField_Kind_TypeUint64 },
-      { .name = "TypeInt32", .number = GPBField_Kind_TypeInt32 },
-      { .name = "TypeFixed64", .number = GPBField_Kind_TypeFixed64 },
-      { .name = "TypeFixed32", .number = GPBField_Kind_TypeFixed32 },
-      { .name = "TypeBool", .number = GPBField_Kind_TypeBool },
-      { .name = "TypeString", .number = GPBField_Kind_TypeString },
-      { .name = "TypeGroup", .number = GPBField_Kind_TypeGroup },
-      { .name = "TypeMessage", .number = GPBField_Kind_TypeMessage },
-      { .name = "TypeBytes", .number = GPBField_Kind_TypeBytes },
-      { .name = "TypeUint32", .number = GPBField_Kind_TypeUint32 },
-      { .name = "TypeEnum", .number = GPBField_Kind_TypeEnum },
-      { .name = "TypeSfixed32", .number = GPBField_Kind_TypeSfixed32 },
-      { .name = "TypeSfixed64", .number = GPBField_Kind_TypeSfixed64 },
-      { .name = "TypeSint32", .number = GPBField_Kind_TypeSint32 },
-      { .name = "TypeSint64", .number = GPBField_Kind_TypeSint64 },
+    static const char *valueNames =
+        "TypeUnknown\000TypeDouble\000TypeFloat\000TypeInt"
+        "64\000TypeUint64\000TypeInt32\000TypeFixed64\000Type"
+        "Fixed32\000TypeBool\000TypeString\000TypeGroup\000Ty"
+        "peMessage\000TypeBytes\000TypeUint32\000TypeEnum\000"
+        "TypeSfixed32\000TypeSfixed64\000TypeSint32\000Typ"
+        "eSint64\000";
+    static const int32_t values[] = {
+        GPBField_Kind_TypeUnknown,
+        GPBField_Kind_TypeDouble,
+        GPBField_Kind_TypeFloat,
+        GPBField_Kind_TypeInt64,
+        GPBField_Kind_TypeUint64,
+        GPBField_Kind_TypeInt32,
+        GPBField_Kind_TypeFixed64,
+        GPBField_Kind_TypeFixed32,
+        GPBField_Kind_TypeBool,
+        GPBField_Kind_TypeString,
+        GPBField_Kind_TypeGroup,
+        GPBField_Kind_TypeMessage,
+        GPBField_Kind_TypeBytes,
+        GPBField_Kind_TypeUint32,
+        GPBField_Kind_TypeEnum,
+        GPBField_Kind_TypeSfixed32,
+        GPBField_Kind_TypeSfixed64,
+        GPBField_Kind_TypeSint32,
+        GPBField_Kind_TypeSint64,
     };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBField_Kind)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBField_Kind_IsValidValue];
+    GPBEnumDescriptor *worker =
+        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBField_Kind)
+                                       valueNames:valueNames
+                                           values:values
+                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))
+                                     enumVerifier:GPBField_Kind_IsValidValue];
+    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {
+      [worker release];
+    }
   }
   return descriptor;
 }
@@ -463,16 +432,24 @@
 GPBEnumDescriptor *GPBField_Cardinality_EnumDescriptor(void) {
   static GPBEnumDescriptor *descriptor = NULL;
   if (!descriptor) {
-    static GPBMessageEnumValueDescription values[] = {
-      { .name = "CardinalityUnknown", .number = GPBField_Cardinality_CardinalityUnknown },
-      { .name = "CardinalityOptional", .number = GPBField_Cardinality_CardinalityOptional },
-      { .name = "CardinalityRequired", .number = GPBField_Cardinality_CardinalityRequired },
-      { .name = "CardinalityRepeated", .number = GPBField_Cardinality_CardinalityRepeated },
+    static const char *valueNames =
+        "CardinalityUnknown\000CardinalityOptional\000C"
+        "ardinalityRequired\000CardinalityRepeated\000";
+    static const int32_t values[] = {
+        GPBField_Cardinality_CardinalityUnknown,
+        GPBField_Cardinality_CardinalityOptional,
+        GPBField_Cardinality_CardinalityRequired,
+        GPBField_Cardinality_CardinalityRepeated,
     };
-    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBField_Cardinality)
-                                                   values:values
-                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)
-                                             enumVerifier:GPBField_Cardinality_IsValidValue];
+    GPBEnumDescriptor *worker =
+        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol(GPBField_Cardinality)
+                                       valueNames:valueNames
+                                           values:values
+                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))
+                                     enumVerifier:GPBField_Cardinality_IsValidValue];
+    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {
+      [worker release];
+    }
   }
   return descriptor;
 }
@@ -516,58 +493,48 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBEnum_FieldNumber_Name,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, name),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBEnum__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "enumvalueArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumValue),
         .number = GPBEnum_FieldNumber_EnumvalueArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, enumvalueArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnum__storage_, enumvalueArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBEnumValue),
-        .fieldOptions = NULL,
       },
       {
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBEnum_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnum__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
       {
         .name = "sourceContext",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
         .number = GPBEnum_FieldNumber_SourceContext,
-        .hasIndex = 3,
+        .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, sourceContext),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnum__storage_, sourceContext),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBSourceContext),
-        .fieldOptions = NULL,
       },
       {
         .name = "syntax",
+        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
         .number = GPBEnum_FieldNumber_Syntax,
-        .hasIndex = 4,
+        .hasIndex = 2,
+        .offset = (uint32_t)offsetof(GPBEnum__storage_, syntax),
         .flags = GPBFieldOptional | GPBFieldHasEnumDescriptor,
         .dataType = GPBDataTypeEnum,
-        .offset = offsetof(GPBEnum__storage_, syntax),
-        .defaultValue.valueEnum = GPBSyntax_SyntaxProto2,
-        .dataTypeSpecific.enumDescFunc = GPBSyntax_EnumDescriptor,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -575,15 +542,9 @@
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBEnum__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -627,36 +588,30 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBEnumValue_FieldNumber_Name,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBEnumValue__storage_, name),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBEnumValue__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "number",
+        .dataTypeSpecific.className = NULL,
         .number = GPBEnumValue_FieldNumber_Number,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBEnumValue__storage_, number),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBEnumValue__storage_, number),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "optionsArray",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
         .number = GPBEnumValue_FieldNumber_OptionsArray,
         .hasIndex = GPBNoHasBit,
+        .offset = (uint32_t)offsetof(GPBEnumValue__storage_, optionsArray),
         .flags = GPBFieldRepeated,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBEnumValue__storage_, optionsArray),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBOption),
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -664,15 +619,9 @@
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBEnumValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -702,25 +651,21 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "name",
+        .dataTypeSpecific.className = NULL,
         .number = GPBOption_FieldNumber_Name,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBOption__storage_, name),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBOption__storage_, name),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
       {
         .name = "value",
+        .dataTypeSpecific.className = GPBStringifySymbol(GPBAny),
         .number = GPBOption_FieldNumber_Value,
         .hasIndex = 1,
+        .offset = (uint32_t)offsetof(GPBOption__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeMessage,
-        .offset = offsetof(GPBOption__storage_, value),
-        .defaultValue.valueMessage = nil,
-        .dataTypeSpecific.className = GPBStringifySymbol(GPBAny),
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -728,15 +673,9 @@
                                      rootClass:[GPBTypeRoot class]
                                           file:GPBTypeRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBOption__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/objectivec/google/protobuf/Wrappers.pbobjc.h b/objectivec/google/protobuf/Wrappers.pbobjc.h
index 38b9962..0ca439a 100644
--- a/objectivec/google/protobuf/Wrappers.pbobjc.h
+++ b/objectivec/google/protobuf/Wrappers.pbobjc.h
@@ -3,7 +3,7 @@
 
 #import "GPBProtocolBuffers.h"
 
-#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30000
+#if GOOGLE_PROTOBUF_OBJC_GEN_VERSION != 30001
 #error This file was generated by a different version of protoc which is incompatible with your Protocol Buffer library sources.
 #endif
 
diff --git a/objectivec/google/protobuf/Wrappers.pbobjc.m b/objectivec/google/protobuf/Wrappers.pbobjc.m
index 0403b46..b1b5be6 100644
--- a/objectivec/google/protobuf/Wrappers.pbobjc.m
+++ b/objectivec/google/protobuf/Wrappers.pbobjc.m
@@ -44,14 +44,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBDoubleValue_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBDoubleValue__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeDouble,
-        .offset = offsetof(GPBDoubleValue__storage_, value),
-        .defaultValue.valueDouble = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -59,15 +57,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBDoubleValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -95,14 +87,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBFloatValue_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBFloatValue__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeFloat,
-        .offset = offsetof(GPBFloatValue__storage_, value),
-        .defaultValue.valueFloat = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -110,15 +100,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBFloatValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -146,14 +130,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBInt64Value_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBInt64Value__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt64,
-        .offset = offsetof(GPBInt64Value__storage_, value),
-        .defaultValue.valueInt64 = 0LL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -161,15 +143,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBInt64Value__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -197,14 +173,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBUInt64Value_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBUInt64Value__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeUInt64,
-        .offset = offsetof(GPBUInt64Value__storage_, value),
-        .defaultValue.valueUInt64 = 0ULL,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -212,15 +186,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBUInt64Value__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -248,14 +216,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBInt32Value_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBInt32Value__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeInt32,
-        .offset = offsetof(GPBInt32Value__storage_, value),
-        .defaultValue.valueInt32 = 0,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -263,15 +229,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBInt32Value__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -299,14 +259,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBUInt32Value_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBUInt32Value__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeUInt32,
-        .offset = offsetof(GPBUInt32Value__storage_, value),
-        .defaultValue.valueUInt32 = 0U,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -314,15 +272,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBUInt32Value__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -339,7 +291,6 @@
 
 typedef struct GPBBoolValue__storage_ {
   uint32_t _has_storage_[1];
-  BOOL value;
 } GPBBoolValue__storage_;
 
 // This method is threadsafe because it is initially called
@@ -350,14 +301,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBBoolValue_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = 1,  // Stored in _has_storage_ to save space.
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBool,
-        .offset = offsetof(GPBBoolValue__storage_, value),
-        .defaultValue.valueBool = NO,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -365,15 +314,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBBoolValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -401,14 +344,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBStringValue_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBStringValue__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeString,
-        .offset = offsetof(GPBStringValue__storage_, value),
-        .defaultValue.valueString = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -416,15 +357,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBStringValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
@@ -452,14 +387,12 @@
     static GPBMessageFieldDescription fields[] = {
       {
         .name = "value",
+        .dataTypeSpecific.className = NULL,
         .number = GPBBytesValue_FieldNumber_Value,
         .hasIndex = 0,
+        .offset = (uint32_t)offsetof(GPBBytesValue__storage_, value),
         .flags = GPBFieldOptional,
         .dataType = GPBDataTypeBytes,
-        .offset = offsetof(GPBBytesValue__storage_, value),
-        .defaultValue.valueData = nil,
-        .dataTypeSpecific.className = NULL,
-        .fieldOptions = NULL,
       },
     };
     GPBDescriptor *localDescriptor =
@@ -467,15 +400,9 @@
                                      rootClass:[GPBWrappersRoot class]
                                           file:GPBWrappersRoot_FileDescriptor()
                                         fields:fields
-                                    fieldCount:sizeof(fields) / sizeof(GPBMessageFieldDescription)
-                                        oneofs:NULL
-                                    oneofCount:0
-                                         enums:NULL
-                                     enumCount:0
-                                        ranges:NULL
-                                    rangeCount:0
+                                    fieldCount:(uint32_t)(sizeof(fields) / sizeof(GPBMessageFieldDescription))
                                    storageSize:sizeof(GPBBytesValue__storage_)
-                                    wireFormat:NO];
+                                         flags:0];
     NSAssert(descriptor == nil, @"Startup recursed!");
     descriptor = localDescriptor;
   }
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum.cc b/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
index 857d24a..3f81dcb 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum.cc
@@ -122,16 +122,6 @@
       "\n",
       "name", name_);
 
-  printer->Print(
-      "GPBEnumDescriptor *$name$_EnumDescriptor(void) {\n"
-      "  static GPBEnumDescriptor *descriptor = NULL;\n"
-      "  if (!descriptor) {\n"
-      "    static GPBMessageEnumValueDescription values[] = {\n",
-      "name", name_);
-  printer->Indent();
-  printer->Indent();
-  printer->Indent();
-
   // Note: For the TextFormat decode info, we can't use the enum value as
   // the key because protocol buffer enums have 'allow_alias', which lets
   // a value be used more than once. Instead, the index into the list of
@@ -139,41 +129,66 @@
   // will be zero.
   TextFormatDecodeData text_format_decode_data;
   int enum_value_description_key = -1;
+  string text_blob;
 
   for (int i = 0; i < all_values_.size(); i++) {
     ++enum_value_description_key;
     string short_name(EnumValueShortName(all_values_[i]));
-    printer->Print("{ .name = \"$short_name$\", .number = $name$ },\n",
-                   "short_name", short_name,
-                   "name", EnumValueName(all_values_[i]));
+    text_blob += short_name + '\0';
     if (UnCamelCaseEnumShortName(short_name) != all_values_[i]->name()) {
       text_format_decode_data.AddString(enum_value_description_key, short_name,
                                         all_values_[i]->name());
     }
   }
-  printer->Outdent();
-  printer->Outdent();
-  printer->Outdent();
+
+  printer->Print(
+      "GPBEnumDescriptor *$name$_EnumDescriptor(void) {\n"
+      "  static GPBEnumDescriptor *descriptor = NULL;\n"
+      "  if (!descriptor) {\n",
+      "name", name_);
+
+  static const int kBytesPerLine = 40;  // allow for escaping
+  printer->Print(
+      "    static const char *valueNames =");
+  for (int i = 0; i < text_blob.size(); i += kBytesPerLine) {
+    printer->Print(
+        "\n        \"$data$\"",
+        "data", EscapeTrigraphs(CEscape(text_blob.substr(i, kBytesPerLine))));
+  }
+  printer->Print(
+      ";\n"
+      "    static const int32_t values[] = {\n");
+  for (int i = 0; i < all_values_.size(); i++) {
+    printer->Print("        $name$,\n",  "name", EnumValueName(all_values_[i]));
+  }
   printer->Print("    };\n");
+
   if (text_format_decode_data.num_entries() == 0) {
     printer->Print(
-        "    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n"
-        "                                                   values:values\n"
-        "                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)\n"
-        "                                             enumVerifier:$name$_IsValidValue];\n",
+        "    GPBEnumDescriptor *worker =\n"
+        "        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n"
+        "                                       valueNames:valueNames\n"
+        "                                           values:values\n"
+        "                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n"
+        "                                     enumVerifier:$name$_IsValidValue];\n",
         "name", name_);
     } else {
       printer->Print(
         "    static const char *extraTextFormatInfo = \"$extraTextFormatInfo$\";\n"
-        "    descriptor = [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n"
-        "                                                   values:values\n"
-        "                                               valueCount:sizeof(values) / sizeof(GPBMessageEnumValueDescription)\n"
-        "                                             enumVerifier:$name$_IsValidValue\n"
-        "                                      extraTextFormatInfo:extraTextFormatInfo];\n",
+        "    GPBEnumDescriptor *worker =\n"
+        "        [GPBEnumDescriptor allocDescriptorForName:GPBNSStringifySymbol($name$)\n"
+        "                                       valueNames:valueNames\n"
+        "                                           values:values\n"
+        "                                            count:(uint32_t)(sizeof(values) / sizeof(int32_t))\n"
+        "                                     enumVerifier:$name$_IsValidValue\n"
+        "                              extraTextFormatInfo:extraTextFormatInfo];\n",
         "name", name_,
         "extraTextFormatInfo", CEscape(text_format_decode_data.Data()));
     }
     printer->Print(
+      "    if (!OSAtomicCompareAndSwapPtrBarrier(nil, worker, (void * volatile *)&descriptor)) {\n"
+      "      [worker release];\n"
+      "    }\n"
       "  }\n"
       "  return descriptor;\n"
       "}\n\n");
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
index cfbb8c5..b63bc0d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc
@@ -59,6 +59,9 @@
   (*variables)["enum_verifier"] = type + "_IsValidValue";
   (*variables)["enum_desc_func"] = type + "_EnumDescriptor";
 
+  (*variables)["dataTypeSpecific_name"] = "enumDescFunc";
+  (*variables)["dataTypeSpecific_value"] = (*variables)["enum_desc_func"];
+
   const Descriptor* msg_descriptor = descriptor->containing_type();
   (*variables)["owning_message_class"] = ClassName(msg_descriptor);
 }
@@ -72,13 +75,6 @@
 
 EnumFieldGenerator::~EnumFieldGenerator() {}
 
-void EnumFieldGenerator::GenerateFieldDescriptionTypeSpecific(
-    io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "  .dataTypeSpecific.enumDescFunc = $enum_desc_func$,\n");
-}
-
 void EnumFieldGenerator::GenerateCFunctionDeclarations(
     io::Printer* printer) const {
   if (!HasPreservingUnknownEnumSemantics(descriptor_->file())) {
@@ -145,13 +141,6 @@
       "// |" + variables_["name"] + "| contains |" + variables_["storage_type"] + "|\n";
 }
 
-void RepeatedEnumFieldGenerator::GenerateFieldDescriptionTypeSpecific(
-    io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "  .dataTypeSpecific.enumDescFunc = $enum_desc_func$,\n");
-}
-
 }  // namespace objectivec
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
index ae2f57e..946faa8 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_enum_field.h
@@ -45,7 +45,6 @@
                                               const Options& options);
 
  public:
-  virtual void GenerateFieldDescriptionTypeSpecific(io::Printer* printer) const;
   virtual void GenerateCFunctionDeclarations(io::Printer* printer) const;
   virtual void GenerateCFunctionImplementations(io::Printer* printer) const;
   virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
@@ -64,7 +63,6 @@
 
  public:
   virtual void FinishInitialization();
-  virtual void GenerateFieldDescriptionTypeSpecific(io::Printer* printer) const;
 
  protected:
   RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor,
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_extension.cc b/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
index 4e34839..3f7ab9d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_extension.cc
@@ -114,14 +114,14 @@
 
   printer->Print(vars,
                  "{\n"
-                 "  .singletonName = GPBStringifySymbol($root_class_and_method_name$),\n"
-                 "  .dataType = $extension_type$,\n"
-                 "  .extendedClass = GPBStringifySymbol($extended_type$),\n"
-                 "  .fieldNumber = $number$,\n"
                  "  .defaultValue.$default_name$ = $default$,\n"
+                 "  .singletonName = GPBStringifySymbol($root_class_and_method_name$),\n"
+                 "  .extendedClass = GPBStringifySymbol($extended_type$),\n"
                  "  .messageOrGroupClassName = $type$,\n"
-                 "  .options = $options$,\n"
                  "  .enumDescriptorFunc = $enum_desc_func_name$,\n"
+                 "  .fieldNumber = $number$,\n"
+                 "  .dataType = $extension_type$,\n"
+                 "  .options = $options$,\n"
                  "},\n");
 }
 
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_field.cc
index 8697e22..7bb9837 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_field.cc
@@ -28,6 +28,8 @@
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
+#include <iostream>
+
 #include <google/protobuf/compiler/objectivec/objectivec_field.h>
 #include <google/protobuf/compiler/objectivec/objectivec_helpers.h>
 #include <google/protobuf/compiler/objectivec/objectivec_enum_field.h>
@@ -75,7 +77,6 @@
   (*variables)["field_number_name"] =
       classname + "_FieldNumber_" + capitalized_name;
   (*variables)["field_number"] = SimpleItoa(descriptor->number());
-  (*variables)["has_index"] = SimpleItoa(descriptor->index());
   (*variables)["field_type"] = GetCapitalizedType(descriptor);
   std::vector<string> field_flags;
   if (descriptor->is_repeated()) field_flags.push_back("GPBFieldRepeated");
@@ -99,18 +100,9 @@
   (*variables)["dataTypeSpecific_name"] = "className";
   (*variables)["dataTypeSpecific_value"] = "NULL";
 
-  string field_options = descriptor->options().SerializeAsString();
-  // Must convert to a standard byte order for packing length into
-  // a cstring.
-  uint32 length = ghtonl(field_options.length());
-  if (length > 0) {
-    string bytes((const char*)&length, sizeof(length));
-    bytes.append(field_options);
-    string options_str = "\"" + CEscape(bytes) + "\"";
-    (*variables)["fieldoptions"] = "\"" + CEscape(bytes) + "\"";
-  } else {
-    (*variables)["fieldoptions"] = "";
-  }
+  (*variables)["storage_offset_value"] =
+      "(uint32_t)offsetof(" + classname + "__storage_, " + camel_case_name + ")";
+  (*variables)["storage_offset_comment"] = "";
 
   // Clear some common things so they can be set just when needed.
   (*variables)["storage_attribute"] = "";
@@ -190,52 +182,54 @@
 }
 
 void FieldGenerator::GenerateFieldDescription(
-    io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "{\n"
-      "  .name = \"$name$\",\n"
-      "  .number = $field_number_name$,\n"
-      "  .hasIndex = $has_index$,\n"
-      "  .flags = $fieldflags$,\n"
-      "  .dataType = GPBDataType$field_type$,\n"
-      "  .offset = offsetof($classname$__storage_, $name$),\n"
-      "  .defaultValue.$default_name$ = $default$,\n");
-
-  // TODO(thomasvl): It might be useful to add a CPP wrapper to support
-  // compiling away the EnumDescriptors.  To do that, we'd need a #if here
-  // to control setting the descriptor vs. the validator, and above in
-  // SetCommonFieldVariables() we'd want to wrap how we add
-  // GPBFieldHasDefaultValue to the flags.
-
-  // "  .dataTypeSpecific.value* = [something],"
-  GenerateFieldDescriptionTypeSpecific(printer);
-
-  const string& field_options(variables_.find("fieldoptions")->second);
-  if (field_options.empty()) {
-    printer->Print("  .fieldOptions = NULL,\n");
-  } else {
-    // Can't use PrintRaw() here to get the #if/#else/#endif lines completely
-    // outdented because the need for indent captured on the previous
-    // printing of a \n and there is no way to get the current indent level
-    // to call the right number of Outdent()/Indents() to maintain state.
+    io::Printer* printer, bool include_default) const {
+  // Printed in the same order as the structure decl.
+  if (include_default) {
     printer->Print(
         variables_,
-        "#if GPBOBJC_INCLUDE_FIELD_OPTIONS\n"
-        "  .fieldOptions = $fieldoptions$,\n"
-        "#else\n"
-        "  .fieldOptions = NULL,\n"
-        "#endif  // GPBOBJC_INCLUDE_FIELD_OPTIONS\n");
+        "{\n"
+        "  .defaultValue.$default_name$ = $default$,\n"
+        "  .core.name = \"$name$\",\n"
+        "  .core.dataTypeSpecific.$dataTypeSpecific_name$ = $dataTypeSpecific_value$,\n"
+        "  .core.number = $field_number_name$,\n"
+        "  .core.hasIndex = $has_index$,\n"
+        "  .core.offset = $storage_offset_value$,$storage_offset_comment$\n"
+        "  .core.flags = $fieldflags$,\n"
+        "  .core.dataType = GPBDataType$field_type$,\n"
+        "},\n");
+  } else {
+    printer->Print(
+        variables_,
+        "{\n"
+        "  .name = \"$name$\",\n"
+        "  .dataTypeSpecific.$dataTypeSpecific_name$ = $dataTypeSpecific_value$,\n"
+        "  .number = $field_number_name$,\n"
+        "  .hasIndex = $has_index$,\n"
+        "  .offset = $storage_offset_value$,$storage_offset_comment$\n"
+        "  .flags = $fieldflags$,\n"
+        "  .dataType = GPBDataType$field_type$,\n"
+        "},\n");
   }
-
-  printer->Print("},\n");
 }
 
-void FieldGenerator::GenerateFieldDescriptionTypeSpecific(
-    io::Printer* printer) const {
-  printer->Print(
-      variables_,
-      "  .dataTypeSpecific.$dataTypeSpecific_name$ = $dataTypeSpecific_value$,\n");
+void FieldGenerator::SetRuntimeHasBit(int has_index) {
+  variables_["has_index"] = SimpleItoa(has_index);
+}
+
+void FieldGenerator::SetNoHasBit(void) {
+  variables_["has_index"] = "GPBNoHasBit";
+}
+
+int FieldGenerator::ExtraRuntimeHasBitsNeeded(void) const {
+  return 0;
+}
+
+void FieldGenerator::SetExtraRuntimeHasBitsBase(int index_base) {
+  // NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
+  // error cases, so it seems to be ok to use as a back door for errors.
+  cerr << "Error: should have overriden SetExtraRuntimeHasBitsBase()." << endl;
+  cerr.flush();
+  abort();
 }
 
 void FieldGenerator::SetOneofIndexBase(int index_base) {
@@ -302,6 +296,14 @@
   return false;
 }
 
+bool SingleFieldGenerator::RuntimeUsesHasBit(void) const {
+  if (descriptor_->containing_oneof() != NULL) {
+    // The oneof tracks what is set instead.
+    return false;
+  }
+  return true;
+}
+
 ObjCObjFieldGenerator::ObjCObjFieldGenerator(const FieldDescriptor* descriptor,
                                              const Options& options)
     : SingleFieldGenerator(descriptor, options) {
@@ -347,8 +349,6 @@
 RepeatedFieldGenerator::RepeatedFieldGenerator(
     const FieldDescriptor* descriptor, const Options& options)
     : ObjCObjFieldGenerator(descriptor, options) {
-  // Repeated fields don't use the has index.
-  variables_["has_index"] = "GPBNoHasBit";
   // Default to no comment and let the cases needing it fill it in.
   variables_["array_comment"] = "";
 }
@@ -402,6 +402,10 @@
   return false;
 }
 
+bool RepeatedFieldGenerator::RuntimeUsesHasBit(void) const {
+  return false;  // The array having anything is what is used.
+}
+
 FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor,
                                      const Options& options)
     : descriptor_(descriptor),
@@ -432,12 +436,40 @@
   return *extension_generators_[index];
 }
 
+int FieldGeneratorMap::CalculateHasBits(void) {
+  int total_bits = 0;
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (field_generators_[i]->RuntimeUsesHasBit()) {
+      field_generators_[i]->SetRuntimeHasBit(total_bits);
+      ++total_bits;
+    } else {
+      field_generators_[i]->SetNoHasBit();
+    }
+    int extra_bits = field_generators_[i]->ExtraRuntimeHasBitsNeeded();
+    if (extra_bits) {
+      field_generators_[i]->SetExtraRuntimeHasBitsBase(total_bits);
+      total_bits += extra_bits;
+    }
+  }
+  return total_bits;
+}
+
 void FieldGeneratorMap::SetOneofIndexBase(int index_base) {
   for (int i = 0; i < descriptor_->field_count(); i++) {
     field_generators_[i]->SetOneofIndexBase(index_base);
   }
 }
 
+bool FieldGeneratorMap::DoesAnyFieldHaveNonZeroDefault(void) const {
+  for (int i = 0; i < descriptor_->field_count(); i++) {
+    if (HasNonZeroDefaultValue(descriptor_->field(i))) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
 }  // namespace objectivec
 }  // namespace compiler
 }  // namespace protobuf
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_field.h b/src/google/protobuf/compiler/objectivec/objectivec_field.h
index e8a20a7..a3a4b1b 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_field.h
@@ -61,7 +61,6 @@
 
   // Called by GenerateFieldDescription, exposed for classes that need custom
   // generation.
-  virtual void GenerateFieldDescriptionTypeSpecific(io::Printer* printer) const;
 
   // Exposed for subclasses to extend, base does nothing.
   virtual void GenerateCFunctionDeclarations(io::Printer* printer) const;
@@ -71,9 +70,16 @@
   virtual void DetermineForwardDeclarations(set<string>* fwd_decls) const;
 
   // Used during generation, not intended to be extended by subclasses.
-  void GenerateFieldDescription(io::Printer* printer) const;
+  void GenerateFieldDescription(
+      io::Printer* printer, bool include_default) const;
   void GenerateFieldNumberConstant(io::Printer* printer) const;
 
+  // Exposed to get and set the has bits information.
+  virtual bool RuntimeUsesHasBit(void) const = 0;
+  void SetRuntimeHasBit(int has_index);
+  void SetNoHasBit(void);
+  virtual int ExtraRuntimeHasBitsNeeded(void) const;
+  virtual void SetExtraRuntimeHasBitsBase(int index_base);
   void SetOneofIndexBase(int index_base);
 
   string variable(const char* key) const {
@@ -109,6 +115,8 @@
 
   virtual void GeneratePropertyImplementation(io::Printer* printer) const;
 
+  virtual bool RuntimeUsesHasBit(void) const;
+
  protected:
   SingleFieldGenerator(const FieldDescriptor* descriptor,
                        const Options& options);
@@ -143,6 +151,8 @@
 
   virtual void GeneratePropertyImplementation(io::Printer* printer) const;
 
+  virtual bool RuntimeUsesHasBit(void) const;
+
  protected:
   RepeatedFieldGenerator(const FieldDescriptor* descriptor,
                          const Options& options);
@@ -162,8 +172,14 @@
   const FieldGenerator& get(const FieldDescriptor* field) const;
   const FieldGenerator& get_extension(int index) const;
 
+  // Assigns the has bits and returns the number of bits needed.
+  int CalculateHasBits(void);
+
   void SetOneofIndexBase(int index_base);
 
+  // Check if any field of this message has a non zero default.
+  bool DoesAnyFieldHaveNonZeroDefault(void) const;
+
  private:
   const Descriptor* descriptor_;
   scoped_array<scoped_ptr<FieldGenerator> > field_generators_;
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_file.cc b/src/google/protobuf/compiler/objectivec/objectivec_file.cc
index 1619988..c58e753 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_file.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_file.cc
@@ -45,7 +45,7 @@
 // This is also found in GPBBootstrap.h, and needs to be kept in sync.  It
 // is the version check done to ensure generated code works with the current
 // runtime being used.
-const int32 GOOGLE_PROTOBUF_OBJC_GEN_VERSION = 30000;
+const int32 GOOGLE_PROTOBUF_OBJC_GEN_VERSION = 30001;
 
 namespace compiler {
 namespace objectivec {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
index b912ea6..fda5180 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc
@@ -220,11 +220,6 @@
   }
 }
 
-// Escape C++ trigraphs by escaping question marks to \?
-string EscapeTrigraphs(const string& to_escape) {
-  return StringReplace(to_escape, "?", "\\?", true);
-}
-
 void PathSplit(const string& path, string* directory, string* basename) {
   string::size_type last_slash = path.rfind('/');
   if (last_slash == string::npos) {
@@ -264,6 +259,11 @@
 
 }  // namespace
 
+// Escape C++ trigraphs by escaping question marks to \?
+string EscapeTrigraphs(const string& to_escape) {
+  return StringReplace(to_escape, "?", "\\?", true);
+}
+
 string StripProto(const string& filename) {
   if (HasSuffixString(filename, ".protodevel")) {
     return StripSuffixString(filename, ".protodevel");
@@ -734,7 +734,7 @@
         uint32 length = ghtonl(default_string.length());
         string bytes((const char*)&length, sizeof(length));
         bytes.append(default_string);
-        return "(NSData*)\"" + CEscape(bytes) + "\"";
+        return "(NSData*)\"" + EscapeTrigraphs(CEscape(bytes)) + "\"";
       } else {
         return "@\"" + EscapeTrigraphs(CEscape(default_string)) + "\"";
       }
@@ -751,6 +751,50 @@
   return NULL;
 }
 
+bool HasNonZeroDefaultValue(const FieldDescriptor* field) {
+  // Repeated fields don't have defaults.
+  if (field->is_repeated()) {
+    return false;
+  }
+
+  if (!field->has_default_value()) {
+    // No custom default set in the proto file.
+    return false;
+  }
+
+  // Some proto file set the default to the zero value, so make sure the value
+  // isn't the zero case.
+  switch (field->cpp_type()) {
+    case FieldDescriptor::CPPTYPE_INT32:
+      return field->default_value_int32() != 0;
+    case FieldDescriptor::CPPTYPE_UINT32:
+      return field->default_value_uint32() != 0U;
+    case FieldDescriptor::CPPTYPE_INT64:
+      return field->default_value_int64() != 0LL;
+    case FieldDescriptor::CPPTYPE_UINT64:
+      return field->default_value_uint64() != 0ULL;
+    case FieldDescriptor::CPPTYPE_DOUBLE:
+      return field->default_value_double() != 0.0;
+    case FieldDescriptor::CPPTYPE_FLOAT:
+      return field->default_value_float() != 0.0f;
+    case FieldDescriptor::CPPTYPE_BOOL:
+      return field->default_value_bool();
+    case FieldDescriptor::CPPTYPE_STRING: {
+      const string& default_string = field->default_value_string();
+      return default_string.length() != 0;
+    }
+    case FieldDescriptor::CPPTYPE_ENUM:
+      return field->default_value_enum()->number() != 0;
+    case FieldDescriptor::CPPTYPE_MESSAGE:
+      return false;
+  }
+
+  // Some compilers report reaching end of function even though all cases of
+  // the enum are handed in the switch.
+  GOOGLE_LOG(FATAL) << "Can't get here.";
+  return false;
+}
+
 string BuildFlagsString(const vector<string>& strings) {
   if (strings.size() == 0) {
     return "0";
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_helpers.h b/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
index a301493..0db9de9 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_helpers.h
@@ -48,6 +48,9 @@
   string expected_prefixes_path;
 };
 
+// Escape C++ trigraphs by escaping question marks to "\?".
+string EscapeTrigraphs(const string& to_escape);
+
 // Strips ".proto" or ".protodevel" from the end of a filename.
 string StripProto(const string& filename);
 
@@ -143,6 +146,7 @@
 
 string GPBGenericValueFieldName(const FieldDescriptor* field);
 string DefaultValue(const FieldDescriptor* field);
+bool HasNonZeroDefaultValue(const FieldDescriptor* field);
 
 string BuildFlagsString(const vector<string>& strings);
 
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
index 2751e93..ac5d8ae 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_map_field.cc
@@ -140,13 +140,18 @@
           value_field_generator_->variable("storage_type") + "*>";
     }
   }
+
+  variables_["dataTypeSpecific_name"] =
+      value_field_generator_->variable("dataTypeSpecific_name");
+  variables_["dataTypeSpecific_value"] =
+      value_field_generator_->variable("dataTypeSpecific_value");
 }
 
 MapFieldGenerator::~MapFieldGenerator() {}
 
 void MapFieldGenerator::FinishInitialization(void) {
   RepeatedFieldGenerator::FinishInitialization();
-  // Use the array_comment suport in RepeatedFieldGenerator to output what the
+  // Use the array_comment support in RepeatedFieldGenerator to output what the
   // values in the map are.
   const FieldDescriptor* value_descriptor =
       descriptor_->message_type()->FindFieldByName("value");
@@ -156,13 +161,6 @@
   }
 }
 
-void MapFieldGenerator::GenerateFieldDescriptionTypeSpecific(
-    io::Printer* printer) const {
-  // Relay it to the value generator to provide enum validator, message
-  // class, etc.
-  value_field_generator_->GenerateFieldDescriptionTypeSpecific(printer);
-}
-
 void MapFieldGenerator::DetermineForwardDeclarations(
     set<string>* fwd_decls) const {
   RepeatedFieldGenerator::DetermineForwardDeclarations(fwd_decls);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_map_field.h b/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
index 7351ea0..bc68a68 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_map_field.h
@@ -46,7 +46,6 @@
 
  public:
   virtual void FinishInitialization(void);
-  virtual void GenerateFieldDescriptionTypeSpecific(io::Printer* printer) const;
 
  protected:
   MapFieldGenerator(const FieldDescriptor* descriptor, const Options& options);
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_message.cc b/src/google/protobuf/compiler/objectivec/objectivec_message.cc
index e0ea8bd..3ebeead 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_message.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_message.cc
@@ -66,11 +66,12 @@
   // The first item in the object structure is our uint32[] for has bits.
   // We then want to order things to make the instances as small as
   // possible. So we follow the has bits with:
-  //   1. Bools (1 byte)
-  //   2. Anything always 4 bytes - float, *32, enums
-  //   3. Anything that is always a pointer (they will be 8 bytes on 64 bit
+  //   1. Anything always 4 bytes - float, *32, enums
+  //   2. Anything that is always a pointer (they will be 8 bytes on 64 bit
   //      builds and 4 bytes on 32bit builds.
-  //   4. Anything always 8 bytes - double, *64
+  //   3. Anything always 8 bytes - double, *64
+  //
+  // NOTE: Bools aren't listed, they were stored in the has bits.
   //
   // Why? Using 64bit builds as an example, this means worse case, we have
   // enough bools that we overflow 1 byte from 4 byte alignment, so 3 bytes
@@ -115,9 +116,9 @@
     case FieldDescriptor::TYPE_ENUM:
       return 2;
 
-    // 1 byte.
+    // 0 bytes. Stored in the has bits.
     case FieldDescriptor::TYPE_BOOL:
-      return 1;
+      return 99;  // End of the list (doesn't really matter).
   }
 
   // Some compilers report reaching end of function even though all cases of
@@ -404,32 +405,28 @@
     sort(sorted_extensions.begin(), sorted_extensions.end(),
          ExtensionRangeOrdering());
 
-    // TODO(thomasvl): Finish optimizing has bit. The current behavior is as
-    // follows:
-    // 1. objectivec_field.cc's SetCommonFieldVariables() defaults the has_index
-    //    to the field's index in the list of fields.
-    // 2. RepeatedFieldGenerator::RepeatedFieldGenerator() sets has_index to
-    //    GPBNoHasBit because repeated fields & map<> fields don't use the has
-    //    bit.
-    // 3. FieldGenerator::SetOneofIndexBase() overrides has_bit with a negative
-    //    index that groups all the elements on of the oneof.
-    // So in has_storage, we need enough bits for the single fields that aren't
-    // in any oneof, and then one int32 for each oneof (to store the field
-    // number).  So we could save a little space by not using the field's index
-    // and instead make a second pass only assigning indexes for the fields
-    // that would need it.  The only savings would come when messages have over
-    // a multiple of 32 fields with some number being repeated or in oneofs to
-    // drop the count below that 32 multiple; so it hasn't seemed worth doing
-    // at the moment.
-    size_t num_has_bits = descriptor_->field_count();
+    // Assign has bits:
+    // 1. FieldGeneratorMap::CalculateHasBits() loops through the fields seeing
+    //    who needs has bits and assigning them.
+    // 2. FieldGenerator::SetOneofIndexBase() overrides has_bit with a negative
+    //    index that groups all the elements in the oneof.
+    size_t num_has_bits = field_generators_.CalculateHasBits();
     size_t sizeof_has_storage = (num_has_bits + 31) / 32;
+    if (sizeof_has_storage == 0) {
+      // In the case where no field needs has bits, don't let the _has_storage_
+      // end up as zero length (zero length arrays are sort of a grey area
+      // since it has to be at the start of the struct). This also ensures a
+      // field with only oneofs keeps the required negative indices they need.
+      sizeof_has_storage = 1;
+    }
     // Tell all the fields the oneof base.
     for (vector<OneofGenerator*>::iterator iter = oneof_generators_.begin();
          iter != oneof_generators_.end(); ++iter) {
       (*iter)->SetOneofIndexBase(sizeof_has_storage);
     }
     field_generators_.SetOneofIndexBase(sizeof_has_storage);
-    // Add an int32 for each oneof to store which is set.
+    // sizeof_has_storage needs enough bits for the single fields that aren't in
+    // any oneof, and then one int32 for each oneof (to store the field number).
     sizeof_has_storage += descriptor_->oneof_decl_count();
 
     printer->Print(
@@ -456,47 +453,26 @@
         "  static GPBDescriptor *descriptor = nil;\n"
         "  if (!descriptor) {\n");
 
-    bool has_oneofs = oneof_generators_.size();
-    if (has_oneofs) {
-      printer->Print(
-          "    static GPBMessageOneofDescription oneofs[] = {\n");
-      printer->Indent();
-      printer->Indent();
-      printer->Indent();
-      for (vector<OneofGenerator*>::iterator iter = oneof_generators_.begin();
-           iter != oneof_generators_.end(); ++iter) {
-        (*iter)->GenerateDescription(printer);
-      }
-      printer->Outdent();
-      printer->Outdent();
-      printer->Outdent();
-      printer->Print(
-          "    };\n");
-    }
-
     TextFormatDecodeData text_format_decode_data;
     bool has_fields = descriptor_->field_count() > 0;
+    bool need_defaults = field_generators_.DoesAnyFieldHaveNonZeroDefault();
+    string field_description_type;
+    if (need_defaults) {
+      field_description_type = "GPBMessageFieldDescriptionWithDefault";
+    } else {
+      field_description_type = "GPBMessageFieldDescription";
+    }
     if (has_fields) {
-      // TODO(thomasvl): The plugin's FieldGenerator::GenerateFieldDescription()
-      // wraps the fieldOptions's value of this structure in an CPP gate so
-      // they can be compiled away; but that still results in a const char* in
-      // the structure for a NULL pointer for every message field.  If the
-      // fieldOptions are moved to a separate payload like the TextFormat extra
-      // data is, then it would shrink that static data shrinking the binaries
-      // a little more.
-      // TODO(thomasvl): proto3 syntax doens't need a defaultValue in the
-      // structure because primitive types are always zero.  If we add a second
-      // structure and a different initializer, we can avoid the wasted static
-      // storage for every field in a proto3 message.
       printer->Print(
-          "    static GPBMessageFieldDescription fields[] = {\n");
+          "    static $field_description_type$ fields[] = {\n",
+          "field_description_type", field_description_type);
       printer->Indent();
       printer->Indent();
       printer->Indent();
       for (int i = 0; i < descriptor_->field_count(); ++i) {
         const FieldGenerator& field_generator =
             field_generators_.get(sorted_fields[i]);
-        field_generator.GenerateFieldDescription(printer);
+        field_generator.GenerateFieldDescription(printer, need_defaults);
         if (field_generator.needs_textformat_name_support()) {
           text_format_decode_data.AddString(sorted_fields[i]->number(),
                                             field_generator.generated_objc_name(),
@@ -510,111 +486,89 @@
           "    };\n");
     }
 
-    bool has_enums = enum_generators_.size();
-    if (has_enums) {
-      printer->Print(
-          "    static GPBMessageEnumDescription enums[] = {\n");
-      printer->Indent();
-      printer->Indent();
-      printer->Indent();
-      for (vector<EnumGenerator*>::iterator iter = enum_generators_.begin();
-           iter != enum_generators_.end(); ++iter) {
-        printer->Print("{ .enumDescriptorFunc = $name$_EnumDescriptor },\n",
-                       "name", (*iter)->name());
-      }
-      printer->Outdent();
-      printer->Outdent();
-      printer->Outdent();
-      printer->Print(
-          "    };\n");
-    }
-
-    bool has_extensions = sorted_extensions.size();
-    if (has_extensions) {
-      printer->Print(
-          "    static GPBExtensionRange ranges[] = {\n");
-      printer->Indent();
-      printer->Indent();
-      printer->Indent();
-      for (int i = 0; i < sorted_extensions.size(); i++) {
-        printer->Print("{ .start = $start$, .end = $end$ },\n",
-                       "start", SimpleItoa(sorted_extensions[i]->start),
-                       "end", SimpleItoa(sorted_extensions[i]->end));
-      }
-      printer->Outdent();
-      printer->Outdent();
-      printer->Outdent();
-      printer->Print(
-          "    };\n");
-    }
-
     map<string, string> vars;
     vars["classname"] = class_name_;
     vars["rootclassname"] = root_classname_;
     vars["fields"] = has_fields ? "fields" : "NULL";
-    vars["fields_count"] =
-        has_fields ? "sizeof(fields) / sizeof(GPBMessageFieldDescription)" : "0";
-    vars["oneofs"] = has_oneofs ? "oneofs" : "NULL";
-    vars["oneof_count"] =
-        has_oneofs ? "sizeof(oneofs) / sizeof(GPBMessageOneofDescription)" : "0";
-    vars["enums"] = has_enums ? "enums" : "NULL";
-    vars["enum_count"] =
-        has_enums ? "sizeof(enums) / sizeof(GPBMessageEnumDescription)" : "0";
-    vars["ranges"] = has_extensions ? "ranges" : "NULL";
-    vars["range_count"] =
-        has_extensions ? "sizeof(ranges) / sizeof(GPBExtensionRange)" : "0";
-    vars["wireformat"] =
-        descriptor_->options().message_set_wire_format() ? "YES" : "NO";
-
-    if (text_format_decode_data.num_entries() == 0) {
-      printer->Print(
-          vars,
-          "    GPBDescriptor *localDescriptor =\n"
-          "        [GPBDescriptor allocDescriptorForClass:[$classname$ class]\n"
-          "                                     rootClass:[$rootclassname$ class]\n"
-          "                                          file:$rootclassname$_FileDescriptor()\n"
-          "                                        fields:$fields$\n"
-          "                                    fieldCount:$fields_count$\n"
-          "                                        oneofs:$oneofs$\n"
-          "                                    oneofCount:$oneof_count$\n"
-          "                                         enums:$enums$\n"
-          "                                     enumCount:$enum_count$\n"
-          "                                        ranges:$ranges$\n"
-          "                                    rangeCount:$range_count$\n"
-          "                                   storageSize:sizeof($classname$__storage_)\n"
-          "                                    wireFormat:$wireformat$];\n");
+    if (has_fields) {
+      vars["fields_count"] =
+          "(uint32_t)(sizeof(fields) / sizeof(" + field_description_type + "))";
     } else {
-      vars["extraTextFormatInfo"] = CEscape(text_format_decode_data.Data());
+      vars["fields_count"] = "0";
+    }
+
+    std::vector<string> init_flags;
+    if (need_defaults) {
+      init_flags.push_back("GPBDescriptorInitializationFlag_FieldsWithDefault");
+    }
+    if (descriptor_->options().message_set_wire_format()) {
+      init_flags.push_back("GPBDescriptorInitializationFlag_WireFormat");
+    }
+    vars["init_flags"] = BuildFlagsString(init_flags);
+
+    printer->Print(
+        vars,
+        "    GPBDescriptor *localDescriptor =\n"
+        "        [GPBDescriptor allocDescriptorForClass:[$classname$ class]\n"
+        "                                     rootClass:[$rootclassname$ class]\n"
+        "                                          file:$rootclassname$_FileDescriptor()\n"
+        "                                        fields:$fields$\n"
+        "                                    fieldCount:$fields_count$\n"
+        "                                   storageSize:sizeof($classname$__storage_)\n"
+        "                                         flags:$init_flags$];\n");
+    if (oneof_generators_.size() != 0) {
       printer->Print(
-          vars,
-          "#if GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n"
-          "    const char *extraTextFormatInfo = NULL;\n"
-          "#else\n"
-          "    static const char *extraTextFormatInfo = \"$extraTextFormatInfo$\";\n"
-          "#endif  // GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n"
-          "    GPBDescriptor *localDescriptor =\n"
-          "        [GPBDescriptor allocDescriptorForClass:[$classname$ class]\n"
-          "                                     rootClass:[$rootclassname$ class]\n"
-          "                                          file:$rootclassname$_FileDescriptor()\n"
-          "                                        fields:$fields$\n"
-          "                                    fieldCount:$fields_count$\n"
-          "                                        oneofs:$oneofs$\n"
-          "                                    oneofCount:$oneof_count$\n"
-          "                                         enums:$enums$\n"
-          "                                     enumCount:$enum_count$\n"
-          "                                        ranges:$ranges$\n"
-          "                                    rangeCount:$range_count$\n"
-          "                                   storageSize:sizeof($classname$__storage_)\n"
-          "                                    wireFormat:$wireformat$\n"
-          "                           extraTextFormatInfo:extraTextFormatInfo];\n");
+          "    static const char *oneofs[] = {\n");
+      for (vector<OneofGenerator*>::iterator iter = oneof_generators_.begin();
+           iter != oneof_generators_.end(); ++iter) {
+        printer->Print(
+            "      \"$name$\",\n",
+            "name", (*iter)->DescriptorName());
       }
       printer->Print(
-          "    NSAssert(descriptor == nil, @\"Startup recursed!\");\n"
-          "    descriptor = localDescriptor;\n"
-          "  }\n"
-          "  return descriptor;\n"
-          "}\n\n"
-          "@end\n\n");
+          "    };\n"
+          "    [localDescriptor setupOneofs:oneofs\n"
+          "                           count:(uint32_t)(sizeof(oneofs) / sizeof(char*))\n"
+          "                   firstHasIndex:$first_has_index$];\n",
+          "first_has_index", oneof_generators_[0]->HasIndexAsString());
+    }
+    if (text_format_decode_data.num_entries() != 0) {
+      const string text_format_data_str(text_format_decode_data.Data());
+      printer->Print(
+          "#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n"
+          "    static const char *extraTextFormatInfo =");
+      static const int kBytesPerLine = 40;  // allow for escaping
+      for (int i = 0; i < text_format_data_str.size(); i += kBytesPerLine) {
+        printer->Print(
+            "\n        \"$data$\"",
+            "data", EscapeTrigraphs(
+                CEscape(text_format_data_str.substr(i, kBytesPerLine))));
+      }
+      printer->Print(
+          ";\n"
+          "    [localDescriptor setupExtraTextInfo:extraTextFormatInfo];\n"
+          "#endif  // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n");
+    }
+    if (sorted_extensions.size() != 0) {
+      printer->Print(
+          "    static const GPBExtensionRange ranges[] = {\n");
+      for (int i = 0; i < sorted_extensions.size(); i++) {
+        printer->Print("      { .start = $start$, .end = $end$ },\n",
+                       "start", SimpleItoa(sorted_extensions[i]->start),
+                       "end", SimpleItoa(sorted_extensions[i]->end));
+      }
+      printer->Print(
+          "    };\n"
+          "    [localDescriptor setupExtensionRanges:ranges\n"
+          "                                    count:(uint32_t)(sizeof(ranges) / sizeof(GPBExtensionRange))];\n");
+    }
+    printer->Print(
+        "    NSAssert(descriptor == nil, @\"Startup recursed!\");\n"
+        "    descriptor = localDescriptor;\n"
+        "  }\n"
+        "  return descriptor;\n"
+        "}\n\n"
+        "@end\n\n");
 
     for (int i = 0; i < descriptor_->field_count(); i++) {
       field_generators_.get(descriptor_->field(i))
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc b/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
index 24e6df0..44bafd7 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_oneof.cc
@@ -120,17 +120,16 @@
       "void $owning_message_class$_Clear$capitalized_name$OneOfCase($owning_message_class$ *message) {\n"
       "  GPBDescriptor *descriptor = [message descriptor];\n"
       "  GPBOneofDescriptor *oneof = descriptor->oneofs_[$raw_index$];\n"
-      "  GPBMaybeClearOneof(message, oneof, 0);\n"
+      "  GPBMaybeClearOneof(message, oneof, $index$, 0);\n"
       "}\n");
 }
 
-void OneofGenerator::GenerateDescription(io::Printer* printer) {
-  printer->Print(
-      variables_,
-      "{\n"
-      "  .name = \"$name$\",\n"
-      "  .index = $index$,\n"
-      "},\n");
+string OneofGenerator::DescriptorName(void) const {
+  return variables_.find("name")->second;
+}
+
+string OneofGenerator::HasIndexAsString(void) const {
+  return variables_.find("index")->second;
 }
 
 }  // namespace objectivec
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_oneof.h b/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
index bcba82d..3d9df4d 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_oneof.h
@@ -61,7 +61,9 @@
 
   void GeneratePropertyImplementation(io::Printer* printer);
   void GenerateClearFunctionImplementation(io::Printer* printer);
-  void GenerateDescription(io::Printer* printer);
+
+  string DescriptorName(void) const;
+  string HasIndexAsString(void) const;
 
  private:
   const OneofDescriptor* descriptor_;
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
index ea7f1b9..d49350f 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
+++ b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc
@@ -134,6 +134,32 @@
 
 PrimitiveFieldGenerator::~PrimitiveFieldGenerator() {}
 
+void PrimitiveFieldGenerator::GenerateFieldStorageDeclaration(
+    io::Printer* printer) const {
+  if (GetObjectiveCType(descriptor_) == OBJECTIVECTYPE_BOOLEAN) {
+    // Nothing, BOOLs are stored in the has bits.
+  } else {
+    SingleFieldGenerator::GenerateFieldStorageDeclaration(printer);
+  }
+}
+
+int PrimitiveFieldGenerator::ExtraRuntimeHasBitsNeeded(void) const {
+  if (GetObjectiveCType(descriptor_) == OBJECTIVECTYPE_BOOLEAN) {
+    // Reserve a bit for the storage of the boolean.
+    return 1;
+  }
+  return 0;
+}
+
+void PrimitiveFieldGenerator::SetExtraRuntimeHasBitsBase(int has_base) {
+  if (GetObjectiveCType(descriptor_) == OBJECTIVECTYPE_BOOLEAN) {
+    // Set into the offset the has bit to use for the actual value.
+    variables_["storage_offset_value"] = SimpleItoa(has_base);
+    variables_["storage_offset_comment"] =
+        "  // Stored in _has_storage_ to save space.";
+  }
+}
+
 PrimitiveObjFieldGenerator::PrimitiveObjFieldGenerator(
     const FieldDescriptor* descriptor, const Options& options)
     : ObjCObjFieldGenerator(descriptor, options) {
diff --git a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h
index 87139af..69bb1fd 100644
--- a/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h
+++ b/src/google/protobuf/compiler/objectivec/objectivec_primitive_field.h
@@ -49,6 +49,11 @@
                           const Options& options);
   virtual ~PrimitiveFieldGenerator();
 
+  virtual void GenerateFieldStorageDeclaration(io::Printer* printer) const;
+
+  virtual int ExtraRuntimeHasBitsNeeded(void) const;
+  virtual void SetExtraRuntimeHasBitsBase(int index_base);
+
  private:
   GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator);
 };