From 164779cd205ede66eadc45f84b9bf45891d4c014 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 22 May 2018 16:15:38 +0000 Subject: [PATCH] [ORC] Move symbol-scanning and discard from BasicIRLayerMaterializationUnit in to a base class (IRMaterializationUnit). The new class, IRMaterializationUnit, provides a convenient base for any client that wants to write a materializer for LLVM IR. llvm-svn: 332993 --- include/llvm/ExecutionEngine/Orc/Layer.h | 20 +++++++++++++----- lib/ExecutionEngine/Orc/Layer.cpp | 26 +++++++++++++----------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/include/llvm/ExecutionEngine/Orc/Layer.h b/include/llvm/ExecutionEngine/Orc/Layer.h index 5aef5a26d2a..fc8c5ade1b1 100644 --- a/include/llvm/ExecutionEngine/Orc/Layer.h +++ b/include/llvm/ExecutionEngine/Orc/Layer.h @@ -46,19 +46,29 @@ private: ExecutionSession &ES; }; -class BasicIRLayerMaterializationUnit : public MaterializationUnit { +class IRMaterializationUnit : public MaterializationUnit { +public: + IRMaterializationUnit(ExecutionSession &ES, std::unique_ptr M); + +protected: + std::unique_ptr M; + +private: + void discard(const VSO &V, SymbolStringPtr Name) override; + + std::map Discardable; +}; + +class BasicIRLayerMaterializationUnit : public IRMaterializationUnit { public: BasicIRLayerMaterializationUnit(IRLayer &L, VModuleKey K, std::unique_ptr M); - private: + void materialize(MaterializationResponsibility R) override; - void discard(const VSO &V, SymbolStringPtr Name) override; IRLayer &L; VModuleKey K; - std::unique_ptr M; - std::map Discardable; }; class ObjectLayer { diff --git a/lib/ExecutionEngine/Orc/Layer.cpp b/lib/ExecutionEngine/Orc/Layer.cpp index 2bb7b907fed..346dde4f7a8 100644 --- a/lib/ExecutionEngine/Orc/Layer.cpp +++ b/lib/ExecutionEngine/Orc/Layer.cpp @@ -35,12 +35,10 @@ Error IRLayer::add(VSO &V, VModuleKey K, std::unique_ptr M) { *this, std::move(K), std::move(M))); } -BasicIRLayerMaterializationUnit::BasicIRLayerMaterializationUnit( - IRLayer &L, VModuleKey K, std::unique_ptr M) - : MaterializationUnit(SymbolFlagsMap()), L(L), K(std::move(K)), - M(std::move(M)) { +IRMaterializationUnit::IRMaterializationUnit(ExecutionSession &ES, + std::unique_ptr M) + : MaterializationUnit(SymbolFlagsMap()), M(std::move(M)) { - auto &ES = L.getExecutionSession(); MangleAndInterner Mangle(ES, this->M->getDataLayout()); for (auto &G : this->M->global_values()) { if (G.hasName() && !G.isDeclaration() && @@ -53,13 +51,7 @@ BasicIRLayerMaterializationUnit::BasicIRLayerMaterializationUnit( } } -void BasicIRLayerMaterializationUnit::materialize( - MaterializationResponsibility R) { - L.emit(std::move(R), std::move(K), std::move(M)); -} - -void BasicIRLayerMaterializationUnit::discard(const VSO &V, - SymbolStringPtr Name) { +void IRMaterializationUnit::discard(const VSO &V, SymbolStringPtr Name) { auto I = Discardable.find(Name); assert(I != Discardable.end() && "Symbol not provided by this MU, or previously discarded"); @@ -67,6 +59,16 @@ void BasicIRLayerMaterializationUnit::discard(const VSO &V, Discardable.erase(I); } +BasicIRLayerMaterializationUnit::BasicIRLayerMaterializationUnit( + IRLayer &L, VModuleKey K, std::unique_ptr M) + : IRMaterializationUnit(L.getExecutionSession(), std::move(M)), + L(L), K(std::move(K)) {} + +void BasicIRLayerMaterializationUnit::materialize( + MaterializationResponsibility R) { + L.emit(std::move(R), std::move(K), std::move(M)); +} + ObjectLayer::ObjectLayer(ExecutionSession &ES) : ES(ES) {} ObjectLayer::~ObjectLayer() {}