diff --git a/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h b/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h index aef441d093a2d..4a492ee2f7d07 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 556031baaaed5..8733306bab6b5 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 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 eeca27771ad64..2c69d61316a8a 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 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 0000000000000..8862dd8a28fa5 --- /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