[JITLink][MachO/x86_64] Expose API for creating eh-frame fixing passes.
authorLang Hames <lhames@gmail.com>
Tue, 11 May 2021 21:47:40 +0000 (14:47 -0700)
committerLang Hames <lhames@gmail.com>
Tue, 11 May 2021 22:26:16 +0000 (15:26 -0700)
These can be used to create eh-frame section fixing passes outside the usual
linker pipeline, which can be useful for tests and tools that just want to
verify or dump graphs.

llvm/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h
llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp

index 09a39bf..6aee8c3 100644 (file)
@@ -38,6 +38,14 @@ createLinkGraphFromMachOObject_x86_64(MemoryBufferRef ObjectBuffer);
 void link_MachO_x86_64(std::unique_ptr<LinkGraph> G,
                        std::unique_ptr<JITLinkContext> Ctx);
 
+/// Returns a pass suitable for splitting __eh_frame sections in MachO/x86-64
+/// objects.
+LinkGraphPassFunction createEHFrameSplitterPass_MachO_x86_64();
+
+/// Returns a pass suitable for fixing missing edges in an __eh_frame section
+/// in a MachO/x86-64 object.
+LinkGraphPassFunction createEHFrameEdgeFixerPass_MachO_x86_64();
+
 } // end namespace jitlink
 } // end namespace llvm
 
index 7d7c0fd..9e9b71d 100644 (file)
@@ -598,11 +598,8 @@ void link_MachO_x86_64(std::unique_ptr<LinkGraph> G,
 
   if (Ctx->shouldAddDefaultTargetPasses(G->getTargetTriple())) {
     // Add eh-frame passses.
-    StringRef EHFrameSectionName = "__TEXT,__eh_frame";
-    Config.PrePrunePasses.push_back(EHFrameSplitter(EHFrameSectionName));
-    Config.PrePrunePasses.push_back(
-        EHFrameEdgeFixer(EHFrameSectionName, G->getPointerSize(),
-                         x86_64::Delta64, x86_64::Delta32, x86_64::NegDelta32));
+    Config.PrePrunePasses.push_back(createEHFrameSplitterPass_MachO_x86_64());
+    Config.PrePrunePasses.push_back(createEHFrameEdgeFixerPass_MachO_x86_64());
 
     // Add a mark-live pass.
     if (auto MarkLive = Ctx->getMarkLivePass(G->getTargetTriple()))
@@ -625,5 +622,14 @@ void link_MachO_x86_64(std::unique_ptr<LinkGraph> G,
   MachOJITLinker_x86_64::link(std::move(Ctx), std::move(G), std::move(Config));
 }
 
+LinkGraphPassFunction createEHFrameSplitterPass_MachO_x86_64() {
+  return EHFrameSplitter("__TEXT,__eh_frame");
+}
+
+LinkGraphPassFunction createEHFrameEdgeFixerPass_MachO_x86_64() {
+  return EHFrameEdgeFixer("__TEXT,__eh_frame", x86_64::PointerSize,
+                          x86_64::Delta64, x86_64::Delta32, x86_64::NegDelta32);
+}
+
 } // end namespace jitlink
 } // end namespace llvm