Fix class_ro layout for non-LP64. On LP64, the requisite padding is added at a lower level. For non-LP64, this fixes binary compatibility with clang-built classes/runtimes.
Tested by examining the generated assembly for a class_ro in both cases (and in the case of clang), for both x86_64 (64-bit pointers) and AVR (16-bit pointers). Tested by running a program on AVR with a GCC-built class using a clang-built Objective-C runtime. Tested by running a program on x86_64/Darwin with a GCC- built class and the clang-built system Objective-C runtime. Patch also available at: <https://github.com/mhjacobson/gcc/commit/917dc8bb2f3265c2ca899ad750c5833b0161a11e> I don't have commit access, so if this patch is suitable, I'd need someone else to commit it for me. Thanks. gcc/objc/ChangeLog: 2021-09-21 Matt Jacobson <mhjacob...@me.com> * objc-next-runtime-abi-02.c (struct class_ro_t): Remove explicit alignment padding. (build_v2_class_templates): Remove explicit alignment padding. (build_v2_class_ro_t_initializer): Adjust initializer. diff --git a/gcc/objc/objc-next-runtime-abi-02.c b/gcc/objc/objc-next-runtime-abi-02.c index 42645e22316..c3af369ff0d 100644 --- a/gcc/objc/objc-next-runtime-abi-02.c +++ b/gcc/objc/objc-next-runtime-abi-02.c @@ -632,9 +632,7 @@ struct class_ro_t uint32_t const flags; uint32_t const instanceStart; uint32_t const instanceSize; -#ifdef __LP64__ - uint32_t const reserved; -#endif + // [32 bits of reserved space here on LP64 platforms] const uint8_t * const ivarLayout; const char *const name; const struct method_list_t * const baseMethods; @@ -677,11 +675,6 @@ build_v2_class_templates (void) /* uint32_t const instanceSize; */ add_field_decl (integer_type_node, "instanceSize", &chain); - /* This ABI is currently only used on m64 NeXT. We always - explicitly declare the alignment padding. */ - /* uint32_t const reserved; */ - add_field_decl (integer_type_node, "reserved", &chain); - /* const uint8_t * const ivarLayout; */ cnst_strg_type = build_pointer_type (unsigned_char_type_node); add_field_decl (cnst_strg_type, "ivarLayout", &chain); @@ -3225,12 +3218,6 @@ build_v2_class_ro_t_initializer (tree type, tree name, CONSTRUCTOR_APPEND_ELT (initlist, NULL_TREE, build_int_cst (integer_type_node, instanceSize)); - /* This ABI is currently only used on m64 NeXT. We always - explicitly declare the alignment padding. */ - /* reserved, pads alignment. */ - CONSTRUCTOR_APPEND_ELT (initlist, NULL_TREE, - build_int_cst (integer_type_node, 0)); - /* ivarLayout */ unsigned_char_star = build_pointer_type (unsigned_char_type_node); if (ivarLayout)