[llvm] c4d5881 - [JITLink][MachO] Handle MachO section start/end symbols.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 25 09:41:03 PDT 2024
Author: Lang Hames
Date: 2024-03-25T11:40:52-05:00
New Revision: c4d58815506ece1a5e5e001fadbaf34b0266fd37
URL: https://github.com/llvm/llvm-project/commit/c4d58815506ece1a5e5e001fadbaf34b0266fd37
DIFF: https://github.com/llvm/llvm-project/commit/c4d58815506ece1a5e5e001fadbaf34b0266fd37.diff
LOG: [JITLink][MachO] Handle MachO section start/end symbols.
Transform section$start$<section-name> and section$end$<section-name> external
symbols into defined symbols when a section named <section-name> is present.
rdar://125357048
Coding my way home: 8.98112N, 79.52094W
Added:
llvm/test/ExecutionEngine/JITLink/AArch64/MachO_section_start_and_stop_symbols.s
Modified:
llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h
llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h b/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h
index aef441d093a2d3..4a492ee2f7d07b 100644
--- a/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h
+++ b/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h
@@ -127,6 +127,29 @@ identifyELFSectionStartAndEndSymbols(LinkGraph &G, Symbol &Sym) {
return {};
}
+/// MachO section start/end symbol detection.
+inline SectionRangeSymbolDesc
+identifyMachOSectionStartAndEndSymbols(LinkGraph &G, Symbol &Sym) {
+ constexpr StringRef StartSymbolPrefix = "section$start$";
+ constexpr StringRef EndSymbolPrefix = "section$end$";
+
+ auto SymName = Sym.getName();
+ if (SymName.starts_with(StartSymbolPrefix)) {
+ auto [SegName, SecName] =
+ SymName.drop_front(StartSymbolPrefix.size()).split('$');
+ std::string SectionName = (SegName + "," + SecName).str();
+ if (auto *Sec = G.findSectionByName(SectionName))
+ return {*Sec, true};
+ } else if (SymName.starts_with(EndSymbolPrefix)) {
+ auto [SegName, SecName] =
+ SymName.drop_front(EndSymbolPrefix.size()).split('$');
+ std::string SectionName = (SegName + "," + SecName).str();
+ if (auto *Sec = G.findSectionByName(SectionName))
+ return {*Sec, false};
+ }
+ return {};
+}
+
} // end namespace jitlink
} // end namespace llvm
diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
index 556031baaaed50..8733306bab6b5f 100644
--- a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp
@@ -14,6 +14,7 @@
#include "llvm/ExecutionEngine/JITLink/DWARFRecordSectionSplitter.h"
#include "llvm/ExecutionEngine/JITLink/aarch64.h"
+#include "DefineExternalSectionStartAndEndSymbols.h"
#include "MachOLinkGraphBuilder.h"
#define DEBUG_TYPE "jitlink"
@@ -593,6 +594,11 @@ void link_MachO_arm64(std::unique_ptr<LinkGraph> G,
Config.PrePrunePasses.push_back(createEHFrameSplitterPass_MachO_arm64());
Config.PrePrunePasses.push_back(createEHFrameEdgeFixerPass_MachO_arm64());
+ // Resolve any external section start / end symbols.
+ Config.PostAllocationPasses.push_back(
+ createDefineExternalSectionStartAndEndSymbolsPass(
+ identifyMachOSectionStartAndEndSymbols));
+
// Add an in-place GOT/Stubs pass.
Config.PostPrunePasses.push_back(buildTables_MachO_arm64);
}
diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
index eeca27771ad646..2c69d61316a8ad 100644
--- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp
@@ -14,6 +14,7 @@
#include "llvm/ExecutionEngine/JITLink/DWARFRecordSectionSplitter.h"
#include "llvm/ExecutionEngine/JITLink/x86_64.h"
+#include "DefineExternalSectionStartAndEndSymbols.h"
#include "MachOLinkGraphBuilder.h"
#define DEBUG_TYPE "jitlink"
@@ -516,6 +517,11 @@ void link_MachO_x86_64(std::unique_ptr<LinkGraph> G,
else
Config.PrePrunePasses.push_back(markAllSymbolsLive);
+ // Resolve any external section start / end symbols.
+ Config.PostAllocationPasses.push_back(
+ createDefineExternalSectionStartAndEndSymbolsPass(
+ identifyMachOSectionStartAndEndSymbols));
+
// Add an in-place GOT/Stubs pass.
Config.PostPrunePasses.push_back(buildGOTAndStubs_MachO_x86_64);
diff --git a/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_section_start_and_stop_symbols.s b/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_section_start_and_stop_symbols.s
new file mode 100644
index 00000000000000..8862dd8a28fa54
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_section_start_and_stop_symbols.s
@@ -0,0 +1,30 @@
+# RUN: llvm-mc -triple=arm64-apple-darwin24 -filetype=obj -o %t.o %s
+# RUN: llvm-jitlink -noexec -check %s %t.o
+
+# jitlink-check: *{8}_z = (*{8}_y) + 4
+
+ .section __TEXT,__text,regular,pure_instructions
+ .globl _main
+ .p2align 2
+_main:
+ mov w0, #0
+ ret
+
+ .section __DATA,__custom_section
+ .globl _x
+ .p2align 2, 0x0
+_x:
+ .long 42
+
+ .section __DATA,__data
+ .globl _y
+ .p2align 3, 0x0
+_y:
+ .quad section$start$__DATA$__custom_section
+
+ .globl _z
+ .p2align 3, 0x0
+_z:
+ .quad section$end$__DATA$__custom_section
+
+.subsections_via_symbols
More information about the llvm-commits
mailing list