[lld] 9fc0b18 - [lld-macho] Add support for category names in ConcatInputSection's (#90850)
via llvm-commits
llvm-commits at lists.llvm.org
Mon May 6 09:46:29 PDT 2024
Author: alx32
Date: 2024-05-06T09:46:25-07:00
New Revision: 9fc0b1824bfec0a65f4e2b840b23eedd9c2de4cf
URL: https://github.com/llvm/llvm-project/commit/9fc0b1824bfec0a65f4e2b840b23eedd9c2de4cf
DIFF: https://github.com/llvm/llvm-project/commit/9fc0b1824bfec0a65f4e2b840b23eedd9c2de4cf.diff
LOG: [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.
Added:
Modified:
lld/MachO/ObjC.cpp
lld/test/MachO/objc-category-merging-extern-class-minimal.s
Removed:
################################################################################
diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp
index c60016f98ff492..f7d7e3a7ad70dc 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<InputSection *>())
return cast<CStringInputSection>(isec)->getStringRefAtOffset(r.addend);
+
auto *sym = cast<Defined>(r.referent.get<Symbol *>());
- return cast<CStringInputSection>(sym->isec())
- ->getStringRefAtOffset(sym->value + r.addend);
+ auto *symIsec = sym->isec();
+ auto symOffset = sym->value + r.addend;
+
+ if (auto *s = dyn_cast_or_null<CStringInputSection>(symIsec))
+ return s->getStringRefAtOffset(symOffset);
+
+ if (isa<ConcatInputSection>(symIsec)) {
+ auto strData = symIsec->data.slice(symOffset);
+ const char *pszData = reinterpret_cast<const char *>(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 796993799f2db0..5dd8924df5ad68 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
More information about the llvm-commits
mailing list