diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index 4760fffebe3b3..e5197c33f5436 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 ea79f29a421c5..f7d333ef70fce 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