[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