From a0162a81b1377331c3e0ebb58ac349b2ffd7b598 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 11 May 2021 14:47:40 -0700 Subject: [PATCH] [JITLink][MachO/x86_64] Expose API for creating eh-frame fixing passes. 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 | 8 ++++++++ llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp | 16 +++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h b/llvm/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h index 09a39bf..6aee8c3 100644 --- a/llvm/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/MachO_x86_64.h @@ -38,6 +38,14 @@ createLinkGraphFromMachOObject_x86_64(MemoryBufferRef ObjectBuffer); void link_MachO_x86_64(std::unique_ptr G, std::unique_ptr 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 diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp index 7d7c0fd..9e9b71d 100644 --- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp @@ -598,11 +598,8 @@ void link_MachO_x86_64(std::unique_ptr 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 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 -- 2.7.4