From 9fc0b1824bfec0a65f4e2b840b23eedd9c2de4cf Mon Sep 17 00:00:00 2001 From: alx32 <103613512+alx32@users.noreply.github.com> Date: Mon, 6 May 2024 09:46:25 -0700 Subject: [PATCH] [lld-macho] Add support for category names in ConcatInputSection's (#90850) In some cases we see strings from categories being part of "data" sections (Ex:`__objc_const`), not part of of sections marked as `cstring_literals`. Since lld treats these sections differently we need to explicitly implement support for reading strings from the non-`cstring_literals` sections. Adding a test that previously would result in an assert. --- lld/MachO/ObjC.cpp | 19 ++++++++++++++++--- ...jc-category-merging-extern-class-minimal.s | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index c60016f98ff49..f7d7e3a7ad70d 100644 --- a/lld/MachO/ObjC.cpp +++ b/lld/MachO/ObjC.cpp @@ -186,13 +186,26 @@ ObjcCategoryChecker::ObjcCategoryChecker() roClassLayout(target->wordSize), listHeaderLayout(target->wordSize), methodLayout(target->wordSize) {} -// \p r must point to an offset within a cstring section. +// \p r must point to an offset within a CStringInputSection or a +// ConcatInputSection static StringRef getReferentString(const Reloc &r) { if (auto *isec = r.referent.dyn_cast()) return cast(isec)->getStringRefAtOffset(r.addend); + auto *sym = cast(r.referent.get()); - return cast(sym->isec()) - ->getStringRefAtOffset(sym->value + r.addend); + auto *symIsec = sym->isec(); + auto symOffset = sym->value + r.addend; + + if (auto *s = dyn_cast_or_null(symIsec)) + return s->getStringRefAtOffset(symOffset); + + if (isa(symIsec)) { + auto strData = symIsec->data.slice(symOffset); + const char *pszData = reinterpret_cast(strData.data()); + return StringRef(pszData, strnlen(pszData, strData.size())); + } + + llvm_unreachable("unknown reference section in getReferentString"); } void ObjcCategoryChecker::parseMethods(const ConcatInputSection *methodsIsec, diff --git a/lld/test/MachO/objc-category-merging-extern-class-minimal.s b/lld/test/MachO/objc-category-merging-extern-class-minimal.s index 796993799f2db..5dd8924df5ad6 100644 --- a/lld/test/MachO/objc-category-merging-extern-class-minimal.s +++ b/lld/test/MachO/objc-category-merging-extern-class-minimal.s @@ -118,7 +118,7 @@ __OBJC_$_CATEGORY_MyBaseClass_$_Category01: .quad 0 .long 64 ; 0x40 .space 4 - .section __TEXT,__objc_classname,cstring_literals + .section __DATA,__objc_const l_OBJC_CLASS_NAME_.1: ; @OBJC_CLASS_NAME_.1 .asciz "Category02" .section __TEXT,__objc_methname,cstring_literals