[lld] [lld-macho] dead-strip objc stubs (PR #79726)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 27 22:13:35 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lld
Author: Kyungwoo Lee (kyulee-com)
<details>
<summary>Changes</summary>
This supports -dead-strip for objc stubs.
---
Full diff: https://github.com/llvm/llvm-project/pull/79726.diff
5 Files Affected:
- (modified) lld/MachO/Driver.cpp (+2-3)
- (modified) lld/MachO/SyntheticSections.cpp (+13-2)
- (modified) lld/MachO/SyntheticSections.h (+2)
- (modified) lld/MachO/Writer.cpp (+9-1)
- (added) lld/test/MachO/arm64-objc-stubs-dead.s (+27)
``````````diff
diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index 411fbcfcf233eb8..519bd483dacb688 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -1275,11 +1275,10 @@ static void foldIdenticalLiterals() {
static void addSynthenticMethnames() {
std::string &data = *make<std::string>();
llvm::raw_string_ostream os(data);
- const int prefixLength = ObjCStubsSection::symbolPrefix.size();
for (Symbol *sym : symtab->getSymbols())
if (isa<Undefined>(sym))
- if (sym->getName().starts_with(ObjCStubsSection::symbolPrefix))
- os << sym->getName().drop_front(prefixLength) << '\0';
+ if (ObjCStubsSection::isObjCStubSymbol(sym))
+ os << ObjCStubsSection::getMethName(sym) << '\0';
if (data.empty())
return;
diff --git a/lld/MachO/SyntheticSections.cpp b/lld/MachO/SyntheticSections.cpp
index 53220ad04b842c1..bea510c3f7eed9f 100644
--- a/lld/MachO/SyntheticSections.cpp
+++ b/lld/MachO/SyntheticSections.cpp
@@ -814,9 +814,20 @@ ObjCStubsSection::ObjCStubsSection()
: target->objcStubsSmallAlignment;
}
+bool ObjCStubsSection::isObjCStubSymbol(Symbol *sym) {
+ return sym->getName().startswith(symbolPrefix);
+}
+
+StringRef ObjCStubsSection::getMethName(Symbol *sym) {
+ assert(isObjCStubSymbol(sym) && "not an objc stub");
+ auto name = sym->getName();
+ StringRef methname = name.drop_front(symbolPrefix.size());
+ return methname;
+}
+
void ObjCStubsSection::addEntry(Symbol *sym) {
- assert(sym->getName().starts_with(symbolPrefix) && "not an objc stub");
- StringRef methname = sym->getName().drop_front(symbolPrefix.size());
+ assert(isObjCStubSymbol(sym) && "not an objc stub");
+ StringRef methname = getMethName(sym);
offsets.push_back(
in.objcMethnameSection->getStringOffset(methname).outSecOff);
diff --git a/lld/MachO/SyntheticSections.h b/lld/MachO/SyntheticSections.h
index 5fb7b6e09e8e63e..aee96b9819e58a4 100644
--- a/lld/MachO/SyntheticSections.h
+++ b/lld/MachO/SyntheticSections.h
@@ -332,6 +332,8 @@ class ObjCStubsSection final : public SyntheticSection {
void setUp();
static constexpr llvm::StringLiteral symbolPrefix = "_objc_msgSend$";
+ static bool isObjCStubSymbol(Symbol *sym);
+ static StringRef getMethName(Symbol *sym);
private:
std::vector<Defined *> symbols;
diff --git a/lld/MachO/Writer.cpp b/lld/MachO/Writer.cpp
index 1b0e64abe843adf..3634c626f0692d1 100644
--- a/lld/MachO/Writer.cpp
+++ b/lld/MachO/Writer.cpp
@@ -736,8 +736,16 @@ void Writer::scanSymbols() {
dysym->getFile()->refState =
std::max(dysym->getFile()->refState, dysym->getRefState());
} else if (isa<Undefined>(sym)) {
- if (sym->getName().starts_with(ObjCStubsSection::symbolPrefix))
+ if (ObjCStubsSection::isObjCStubSymbol(sym)) {
+ // When -dead_strip is enabled, we don't want to emit any dead stubs.
+ // Although this stub symbol is yet undefined, addSym() was called
+ // during MarkLive.
+ if (config->deadStrip) {
+ if (!sym->isLive())
+ continue;
+ }
in.objcStubs->addEntry(sym);
+ }
}
}
diff --git a/lld/test/MachO/arm64-objc-stubs-dead.s b/lld/test/MachO/arm64-objc-stubs-dead.s
new file mode 100644
index 000000000000000..5dcb171c17eac58
--- /dev/null
+++ b/lld/test/MachO/arm64-objc-stubs-dead.s
@@ -0,0 +1,27 @@
+# REQUIRES: aarch64
+
+# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %s -o %t.o
+
+# RUN: %lld -arch arm64 -lSystem -U _objc_msgSend -o %t.out %t.o
+# RUN: llvm-nm %t.out | FileCheck %s
+# RUN: %lld -arch arm64 -lSystem -U _objc_msgSend -dead_strip -o %t.out %t.o
+# RUN: llvm-nm %t.out | FileCheck %s --check-prefix=DEAD
+
+# CHECK: _foo
+# CHECK: _objc_msgSend$length
+
+# DEAD-NOT: _foo
+# DEAD-NOT: _objc_msgSend$length
+
+.section __TEXT,__text
+
+.globl _foo
+_foo:
+ bl _objc_msgSend$length
+ ret
+
+.globl _main
+_main:
+ ret
+
+.subsections_via_symbols
``````````
</details>
https://github.com/llvm/llvm-project/pull/79726
More information about the llvm-commits
mailing list