diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h --- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h @@ -18,6 +18,7 @@ #include "llvm/ADT/Optional.h" #include "llvm/ADT/Triple.h" #include "llvm/ExecutionEngine/JITSymbol.h" +#include "llvm/Object/ObjectFile.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" @@ -862,6 +863,8 @@ /// This method can not be called once takeObjectBuffer has been called. virtual MemoryBufferRef getObjectBuffer() const = 0; + virtual void storeObjFile(std::unique_ptr O) = 0; + /// Notify this context that linking failed. /// Called by JITLink if linking cannot be completed. virtual void notifyFailed(Error Err) = 0; diff --git a/llvm/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h --- a/llvm/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h @@ -46,7 +46,8 @@ public: /// Function object for receiving object-loaded notifications. - using NotifyLoadedFunction = std::function; + using NotifyLoadedFunction = + std::function; /// Function object for receiving finalization notifications. using NotifyEmittedFunction = std::function; diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.h b/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.h --- a/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.h +++ b/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.h @@ -82,7 +82,7 @@ // Build a graph from the given object buffer. // To be implemented by the client. virtual Expected> - buildGraph(MemoryBufferRef ObjBuffer) = 0; + buildGraph(JITLinkContext &Ctx) = 0; // For debug dumping of the atom graph. virtual StringRef getEdgeKindName(Edge::Kind K) const = 0; diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp --- a/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp @@ -26,7 +26,7 @@ void JITLinkerBase::linkPhase1(std::unique_ptr Self) { // Build the atom graph. - if (auto GraphOrErr = buildGraph(Ctx->getObjectBuffer())) + if (auto GraphOrErr = buildGraph(*Ctx)) G = std::move(*GraphOrErr); else return Ctx->notifyFailed(GraphOrErr.takeError()); diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp --- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp @@ -440,11 +440,16 @@ } Expected> - buildGraph(MemoryBufferRef ObjBuffer) override { + buildGraph(JITLinkContext &Ctx) override { + MemoryBufferRef ObjBuffer = Ctx.getObjectBuffer(); auto MachOObj = object::ObjectFile::createMachOObjectFile(ObjBuffer); if (!MachOObj) return MachOObj.takeError(); - return MachOAtomGraphBuilder_x86_64(**MachOObj).buildGraph(); + auto Graph = MachOAtomGraphBuilder_x86_64(**MachOObj).buildGraph(); + if (!Graph) + return Graph.takeError(); + Ctx.storeObjFile(std::move(*MachOObj)); + return Graph; } static Error targetOutOfRangeError(const Edge &E) { diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp --- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp @@ -27,7 +27,8 @@ ObjectLinkingLayerJITLinkContext(ObjectLinkingLayer &Layer, MaterializationResponsibility MR, std::unique_ptr ObjBuffer) - : Layer(Layer), MR(std::move(MR)), ObjBuffer(std::move(ObjBuffer)) {} + : Layer(Layer), MR(std::move(MR)), ObjBuffer(std::move(ObjBuffer)), + ObjFile(nullptr) {} JITLinkMemoryManager &getMemoryManager() override { return Layer.MemMgr; } @@ -35,6 +36,11 @@ return ObjBuffer->getMemBufferRef(); } + void storeObjFile(std::unique_ptr O) override { + assert(ObjFile == nullptr); + ObjFile = std::move(O); + } + void notifyFailed(Error Err) override { Layer.getExecutionSession().reportError(std::move(Err)); MR.failMaterialization(); @@ -134,7 +140,7 @@ MR.resolve(InternedResult); if (Layer.NotifyLoaded) - Layer.NotifyLoaded(MR.getVModuleKey()); + Layer.NotifyLoaded(MR.getVModuleKey(), ObjFile.get()); } void notifyFinalized( @@ -327,6 +333,7 @@ ObjectLinkingLayer &Layer; MaterializationResponsibility MR; std::unique_ptr ObjBuffer; + std::unique_ptr ObjFile; DenseMap NamedSymbolDeps; JITTargetAddress EHFrameAddr = 0; };