https://gcc.gnu.org/g:75fdb6f800321836a801a4197321bc486e198b0c
commit r17-2072-g75fdb6f800321836a801a4197321bc486e198b0c Author: Iain Sandoe <[email protected]> Date: Sat Jun 27 20:39:39 2026 +0100 Darwin: Updates to handling of NeXT metadata [PR124260]. Darwin-specific preparations for changes to handle the PR: Allow metadata to reside in const_data. Add ClassList to the cases where we want the symbols to be linker-visible. This adds expanded comments on the meaning of the flag fields in the ImageInfo metadata. PR objc/124260 gcc/ChangeLog: * config/darwin.cc (darwin_objc2_section): Also allow meta data in const_data. (darwin_label_is_anonymous_local_objc_name): Make ClassList linker- visible. (darwin_file_end): Update comments on the ImageInfo flags. Do not claim we have signed pointers. gcc/testsuite/ChangeLog: * objc.dg/image-info.m: Test revised flags value for ABI-2. Signed-off-by: Iain Sandoe <[email protected]> Diff: --- gcc/config/darwin.cc | 20 ++++++++++++++------ gcc/testsuite/objc.dg/image-info.m | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/gcc/config/darwin.cc b/gcc/config/darwin.cc index b83e96f20fc1..f4726ab0e57e 100644 --- a/gcc/config/darwin.cc +++ b/gcc/config/darwin.cc @@ -1530,7 +1530,7 @@ darwin_objc2_section (tree decl ATTRIBUTE_UNUSED, tree meta, section * base) objc_metadata_seen = 1; - if (base == data_section) + if (base == data_section || base == darwin_sections[const_data_section]) base = darwin_sections[objc2_metadata_section]; /* Most of the OBJC2 META-data end up in the base section, so check it @@ -2041,6 +2041,8 @@ darwin_label_is_anonymous_local_objc_name (const char *name) p += 6; if (startswith ((const char *)p, "ClassRef")) return false; + else if (startswith ((const char *)p, "ClassList")) + return false; else if (startswith ((const char *)p, "SelRef")) return false; else if (startswith ((const char *)p, "Category")) @@ -3188,21 +3190,27 @@ darwin_file_end (void) { unsigned int flags = 0; if (flag_objc_abi >= 2) - { - flags = 16; - switch_to_section (darwin_sections[objc2_image_info_section]); - } + switch_to_section (darwin_sections[objc2_image_info_section]); else switch_to_section (darwin_sections[objc_image_info_section]); ASM_OUTPUT_ALIGN (asm_out_file, 2); fputs ("L_OBJC_ImageInfo:\n", asm_out_file); + /* Bit 0 - Fix and continue (no longer supported by clang). */ flags |= (flag_replace_objc_classes && classes_seen) ? 1 : 0; + /* Bit 1 - ObjC "hybrid" GC. */ flags |= flag_objc_gc ? 2 : 0; + /* Bit 2 - Objc GC only. */ + /* Bit 3 - is reserved for dyld. */ + /* Bit 4 - is for signed pointers, we cannot yet implement. + The original meaning _CorrectedSynthesize has been replaced. */ + /* Bit 5 - is built for a simulator (not relevant yet). */ + /* Bit 6 - indicates we are generating class properties. Our code- + gen is not yet suited to this. */ fprintf (asm_out_file, "\t.long\t0\n\t.long\t%u\n", flags); - } + } machopic_finish (asm_out_file); if (flag_apple_kext) diff --git a/gcc/testsuite/objc.dg/image-info.m b/gcc/testsuite/objc.dg/image-info.m index b2effe5dc861..50d931866165 100644 --- a/gcc/testsuite/objc.dg/image-info.m +++ b/gcc/testsuite/objc.dg/image-info.m @@ -39,4 +39,4 @@ extern void abort(void); @end /* { dg-final { scan-assembler "\t.section __OBJC, __image_info.*\n\t.align.*\nL_OBJC_ImageInfo.*:\n\t.long\t0\n\t.long\t1" { target { *-*-darwin* && { ! lp64 } } } } } */ -/* { dg-final { scan-assembler "\t.section __DATA, __objc_imageinfo.*\n\t.align.*\nL_OBJC_ImageInfo.*:\n\t.long\t0\n\t.long\t17" { target { *-*-darwin* && { lp64 } } } } } */ +/* { dg-final { scan-assembler "\t.section __DATA, __objc_imageinfo.*\n\t.align.*\nL_OBJC_ImageInfo.*:\n\t.long\t0\n\t.long\t1" { target { *-*-darwin* && { lp64 } } } } } */
