Skip to content

Commit c4d5881

Browse files
committed
[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
1 parent 94bbc18 commit c4d5881

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,29 @@ identifyELFSectionStartAndEndSymbols(LinkGraph &G, Symbol &Sym) {
127127
return {};
128128
}
129129

130+
/// MachO section start/end symbol detection.
131+
inline SectionRangeSymbolDesc
132+
identifyMachOSectionStartAndEndSymbols(LinkGraph &G, Symbol &Sym) {
133+
constexpr StringRef StartSymbolPrefix = "section$start$";
134+
constexpr StringRef EndSymbolPrefix = "section$end$";
135+
136+
auto SymName = Sym.getName();
137+
if (SymName.starts_with(StartSymbolPrefix)) {
138+
auto [SegName, SecName] =
139+
SymName.drop_front(StartSymbolPrefix.size()).split('$');
140+
std::string SectionName = (SegName + "," + SecName).str();
141+
if (auto *Sec = G.findSectionByName(SectionName))
142+
return {*Sec, true};
143+
} else if (SymName.starts_with(EndSymbolPrefix)) {
144+
auto [SegName, SecName] =
145+
SymName.drop_front(EndSymbolPrefix.size()).split('$');
146+
std::string SectionName = (SegName + "," + SecName).str();
147+
if (auto *Sec = G.findSectionByName(SectionName))
148+
return {*Sec, false};
149+
}
150+
return {};
151+
}
152+
130153
} // end namespace jitlink
131154
} // end namespace llvm
132155

llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "llvm/ExecutionEngine/JITLink/DWARFRecordSectionSplitter.h"
1515
#include "llvm/ExecutionEngine/JITLink/aarch64.h"
1616

17+
#include "DefineExternalSectionStartAndEndSymbols.h"
1718
#include "MachOLinkGraphBuilder.h"
1819

1920
#define DEBUG_TYPE "jitlink"
@@ -593,6 +594,11 @@ void link_MachO_arm64(std::unique_ptr<LinkGraph> G,
593594
Config.PrePrunePasses.push_back(createEHFrameSplitterPass_MachO_arm64());
594595
Config.PrePrunePasses.push_back(createEHFrameEdgeFixerPass_MachO_arm64());
595596

597+
// Resolve any external section start / end symbols.
598+
Config.PostAllocationPasses.push_back(
599+
createDefineExternalSectionStartAndEndSymbolsPass(
600+
identifyMachOSectionStartAndEndSymbols));
601+
596602
// Add an in-place GOT/Stubs pass.
597603
Config.PostPrunePasses.push_back(buildTables_MachO_arm64);
598604
}

llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "llvm/ExecutionEngine/JITLink/DWARFRecordSectionSplitter.h"
1515
#include "llvm/ExecutionEngine/JITLink/x86_64.h"
1616

17+
#include "DefineExternalSectionStartAndEndSymbols.h"
1718
#include "MachOLinkGraphBuilder.h"
1819

1920
#define DEBUG_TYPE "jitlink"
@@ -516,6 +517,11 @@ void link_MachO_x86_64(std::unique_ptr<LinkGraph> G,
516517
else
517518
Config.PrePrunePasses.push_back(markAllSymbolsLive);
518519

520+
// Resolve any external section start / end symbols.
521+
Config.PostAllocationPasses.push_back(
522+
createDefineExternalSectionStartAndEndSymbolsPass(
523+
identifyMachOSectionStartAndEndSymbols));
524+
519525
// Add an in-place GOT/Stubs pass.
520526
Config.PostPrunePasses.push_back(buildGOTAndStubs_MachO_x86_64);
521527

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# RUN: llvm-mc -triple=arm64-apple-darwin24 -filetype=obj -o %t.o %s
2+
# RUN: llvm-jitlink -noexec -check %s %t.o
3+
4+
# jitlink-check: *{8}_z = (*{8}_y) + 4
5+
6+
.section __TEXT,__text,regular,pure_instructions
7+
.globl _main
8+
.p2align 2
9+
_main:
10+
mov w0, #0
11+
ret
12+
13+
.section __DATA,__custom_section
14+
.globl _x
15+
.p2align 2, 0x0
16+
_x:
17+
.long 42
18+
19+
.section __DATA,__data
20+
.globl _y
21+
.p2align 3, 0x0
22+
_y:
23+
.quad section$start$__DATA$__custom_section
24+
25+
.globl _z
26+
.p2align 3, 0x0
27+
_z:
28+
.quad section$end$__DATA$__custom_section
29+
30+
.subsections_via_symbols

0 commit comments

Comments
 (0)