From 778c11c82acfb6c2cd7673e0fc77c6e740a07d3c Mon Sep 17 00:00:00 2001 From: Alex Borcan Date: Thu, 2 May 2024 05:22:23 -0700 Subject: [PATCH 1/7] [lld-macho] Add support for category names in ConcatInputSection's --- lld/MachO/ObjC.cpp | 17 ++++++++++++++--- ...objc-category-merging-extern-class-minimal.s | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index 4760fffebe3b3..9907441087138 100644 --- a/lld/MachO/ObjC.cpp +++ b/lld/MachO/ObjC.cpp @@ -186,13 +186,24 @@ 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); + if (isa(sym->isec())) + return cast(sym->isec()) + ->getStringRefAtOffset(sym->value + r.addend); + + if (isa(sym->isec())) { + auto &data = sym->isec()->data; + const char *pDataStart = reinterpret_cast(data.data()); + uint32_t len = strnlen(pDataStart + sym->value, data.size() - sym->value); + return StringRef(pDataStart + sym->value, len); + } + + 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 From 248eb26853cc21ac9bcb050a50f877b5953f2164 Mon Sep 17 00:00:00 2001 From: alx32 <103613512+alx32@users.noreply.github.com> Date: Thu, 2 May 2024 13:56:33 -0700 Subject: [PATCH 2/7] Apply suggestions from code review Address Feedback nr.1 Co-authored-by: Ellis Hoag --- lld/MachO/ObjC.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index 9907441087138..75581f315c99e 100644 --- a/lld/MachO/ObjC.cpp +++ b/lld/MachO/ObjC.cpp @@ -192,9 +192,8 @@ 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()); - if (isa(sym->isec())) - return cast(sym->isec()) - ->getStringRefAtOffset(sym->value + r.addend); + if (auto *s = dyn_cast_or_null(sym->isec())) + return s->getStringRefAtOffset(sym->value + r.addend); if (isa(sym->isec())) { auto &data = sym->isec()->data; From c101bc0e64246ff2880a39def0dd4f3739821a60 Mon Sep 17 00:00:00 2001 From: Alex Borcan Date: Thu, 2 May 2024 15:54:57 -0700 Subject: [PATCH 3/7] Address Feedback nr.2 --- lld/MachO/ObjC.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index 75581f315c99e..e0a6a49837918 100644 --- a/lld/MachO/ObjC.cpp +++ b/lld/MachO/ObjC.cpp @@ -196,10 +196,10 @@ static StringRef getReferentString(const Reloc &r) { return s->getStringRefAtOffset(sym->value + r.addend); if (isa(sym->isec())) { - auto &data = sym->isec()->data; - const char *pDataStart = reinterpret_cast(data.data()); - uint32_t len = strnlen(pDataStart + sym->value, data.size() - sym->value); - return StringRef(pDataStart + sym->value, len); + auto paddedData = sym->isec()->data.slice(sym->value); + uint32_t len = strnlen((const char *)paddedData.data(), paddedData.size()); + auto strData = paddedData.slice(0, len); + return StringRef((const char *)strData.data(), strData.size()); } llvm_unreachable("unknown reference section in getReferentString"); From 927f1bbe63fb7216257ed5041dabb3400dd2250c Mon Sep 17 00:00:00 2001 From: Alex Borcan Date: Fri, 3 May 2024 11:37:20 -0700 Subject: [PATCH 4/7] Address feedback nr.3 --- lld/MachO/ObjC.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index e0a6a49837918..d630b85c81ff1 100644 --- a/lld/MachO/ObjC.cpp +++ b/lld/MachO/ObjC.cpp @@ -196,10 +196,9 @@ static StringRef getReferentString(const Reloc &r) { return s->getStringRefAtOffset(sym->value + r.addend); if (isa(sym->isec())) { - auto paddedData = sym->isec()->data.slice(sym->value); - uint32_t len = strnlen((const char *)paddedData.data(), paddedData.size()); - auto strData = paddedData.slice(0, len); - return StringRef((const char *)strData.data(), strData.size()); + auto strData = sym->isec()->data.slice(sym->value); + uint32_t len = strnlen((const char *)strData.data(), strData.size()); + return StringRef((const char *)strData.data(), len); } llvm_unreachable("unknown reference section in getReferentString"); From 4b38aa139de2575c0f422fb2d27ca00a72ae87d7 Mon Sep 17 00:00:00 2001 From: Alex Borcan Date: Fri, 3 May 2024 15:32:27 -0700 Subject: [PATCH 5/7] Address feedback nr.4 --- lld/MachO/ObjC.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index d630b85c81ff1..24f7607066d11 100644 --- a/lld/MachO/ObjC.cpp +++ b/lld/MachO/ObjC.cpp @@ -196,7 +196,7 @@ static StringRef getReferentString(const Reloc &r) { return s->getStringRefAtOffset(sym->value + r.addend); if (isa(sym->isec())) { - auto strData = sym->isec()->data.slice(sym->value); + auto strData = sym->isec()->data.slice(sym->value + r.addend); uint32_t len = strnlen((const char *)strData.data(), strData.size()); return StringRef((const char *)strData.data(), len); } From c9e060de3cfb77fac2cac0e7cf00c50bd3751c85 Mon Sep 17 00:00:00 2001 From: Alex Borcan Date: Sun, 5 May 2024 15:06:13 -0700 Subject: [PATCH 6/7] Address feedback nr.5 --- lld/MachO/ObjC.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index 24f7607066d11..347e786648bb0 100644 --- a/lld/MachO/ObjC.cpp +++ b/lld/MachO/ObjC.cpp @@ -191,12 +191,16 @@ ObjcCategoryChecker::ObjcCategoryChecker() 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()); - if (auto *s = dyn_cast_or_null(sym->isec())) - return s->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(sym->isec())) { - auto strData = sym->isec()->data.slice(sym->value + r.addend); + if (isa(symIsec)) { + auto strData = symIsec->data.slice(symOffset); uint32_t len = strnlen((const char *)strData.data(), strData.size()); return StringRef((const char *)strData.data(), len); } From d2f3439823880f13d3770e5686699f36ed053244 Mon Sep 17 00:00:00 2001 From: Alex Borcan Date: Mon, 6 May 2024 05:32:17 -0700 Subject: [PATCH 7/7] Address feedback nr.6 --- lld/MachO/ObjC.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lld/MachO/ObjC.cpp b/lld/MachO/ObjC.cpp index 347e786648bb0..e5197c33f5436 100644 --- a/lld/MachO/ObjC.cpp +++ b/lld/MachO/ObjC.cpp @@ -201,8 +201,8 @@ static StringRef getReferentString(const Reloc &r) { if (isa(symIsec)) { auto strData = symIsec->data.slice(symOffset); - uint32_t len = strnlen((const char *)strData.data(), strData.size()); - return StringRef((const char *)strData.data(), len); + const char *pszData = reinterpret_cast(strData.data()); + return StringRef(pszData, strnlen(pszData, strData.size())); } llvm_unreachable("unknown reference section in getReferentString");