diff options
author | Lang Hames <lhames@gmail.com> | 2015-02-25 20:58:28 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2015-02-25 20:58:28 +0000 |
commit | 0db567f2adf7cc3bf7cfba39817245bb245c6f1f (patch) | |
tree | 6d636aa24b67cca2f6e8891481ea4861baee2a9f /llvm/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp | |
parent | 71b3a694333f6ade799fd6a739199a9a91229a4f (diff) | |
download | bcm5719-llvm-0db567f2adf7cc3bf7cfba39817245bb245c6f1f.tar.gz bcm5719-llvm-0db567f2adf7cc3bf7cfba39817245bb245c6f1f.zip |
[Orc][Kaleidoscope] Clean up the Orc/Kaleidoscope tutorials to minimize the diffs
between them.
llvm-svn: 230542
Diffstat (limited to 'llvm/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp')
-rw-r--r-- | llvm/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/llvm/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp b/llvm/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp index 3225a0d93b8..d7744ece655 100644 --- a/llvm/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp +++ b/llvm/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp @@ -681,13 +681,18 @@ std::string MakeLegalFunctionName(std::string Name) class SessionContext { public: - SessionContext(LLVMContext &C) : Context(C) {} + SessionContext(LLVMContext &C) + : Context(C), TM(EngineBuilder().selectTarget()) {} LLVMContext& getLLVMContext() const { return Context; } + TargetMachine& getTarget() { return *TM; } void addPrototypeAST(std::unique_ptr<PrototypeAST> P); PrototypeAST* getPrototypeAST(const std::string &Name); private: typedef std::map<std::string, std::unique_ptr<PrototypeAST>> PrototypeMap; + LLVMContext &Context; + std::unique_ptr<TargetMachine> TM; + PrototypeMap Prototypes; }; @@ -709,7 +714,9 @@ public: : Session(S), M(new Module(GenerateUniqueName("jit_module_"), Session.getLLVMContext())), - Builder(Session.getLLVMContext()) {} + Builder(Session.getLLVMContext()) { + M->setDataLayout(Session.getTarget().getDataLayout()); + } SessionContext& getSession() { return Session; } Module& getM() const { return *M; } @@ -1138,15 +1145,27 @@ static std::unique_ptr<llvm::Module> IRGen(SessionContext &S, return C.takeM(); } +template <typename T> +static std::vector<T> singletonSet(T t) { + std::vector<T> Vec; + Vec.push_back(std::move(t)); + return Vec; +} + class KaleidoscopeJIT { public: typedef ObjectLinkingLayer<> ObjLayerT; typedef IRCompileLayer<ObjLayerT> CompileLayerT; typedef LazyEmittingLayer<CompileLayerT> LazyEmitLayerT; - typedef LazyEmitLayerT::ModuleSetHandleT ModuleHandleT; - std::string Mangle(const std::string &Name) { + KaleidoscopeJIT(SessionContext &Session) + : Session(Session), + Mang(Session.getTarget().getDataLayout()), + CompileLayer(ObjectLayer, SimpleCompiler(Session.getTarget())), + LazyEmitLayer(CompileLayer) {} + + std::string mangle(const std::string &Name) { std::string MangledName; { raw_string_ostream MangledNameStream(MangledName); @@ -1155,27 +1174,18 @@ public: return MangledName; } - KaleidoscopeJIT(SessionContext &Session) - : TM(EngineBuilder().selectTarget()), - Mang(TM->getDataLayout()), Session(Session), - CompileLayer(ObjectLayer, SimpleCompiler(*TM)), - LazyEmitLayer(CompileLayer) {} + void addFunctionDefinition(std::unique_ptr<FunctionAST> FnAST) { + FunctionDefs[mangle(FnAST->Proto->Name)] = std::move(FnAST); + } ModuleHandleT addModule(std::unique_ptr<Module> M) { - if (!M->getDataLayout()) - M->setDataLayout(TM->getDataLayout()); - - // The LazyEmitLayer takes lists of modules, rather than single modules, so - // we'll just build a single-element list. - std::vector<std::unique_ptr<Module>> S; - S.push_back(std::move(M)); - // We need a memory manager to allocate memory and resolve symbols for this - // new module. Create one that resolves symbols by looking back into the JIT. + // new module. Create one that resolves symbols by looking back into the + // JIT. auto MM = createLookasideRTDyldMM<SectionMemoryManager>( [&](const std::string &Name) { // First try to find 'Name' within the JIT. - if (auto Symbol = findMangledSymbol(Name)) + if (auto Symbol = findSymbol(Name)) return Symbol.getAddress(); // If we don't already have a definition of 'Name' then search @@ -1184,25 +1194,22 @@ public: }, [](const std::string &S) { return 0; } ); - return LazyEmitLayer.addModuleSet(std::move(S), std::move(MM)); + return LazyEmitLayer.addModuleSet(singletonSet(std::move(M)), + std::move(MM)); } void removeModule(ModuleHandleT H) { LazyEmitLayer.removeModuleSet(H); } - JITSymbol findMangledSymbol(const std::string &Name) { + JITSymbol findSymbol(const std::string &Name) { return LazyEmitLayer.findSymbol(Name, true); } - JITSymbol findMangledSymbolIn(ModuleHandleT H, const std::string &Name) { + JITSymbol findSymbolIn(ModuleHandleT H, const std::string &Name) { return LazyEmitLayer.findSymbolIn(H, Name, true); } - JITSymbol findSymbol(const std::string &Name) { - return findMangledSymbol(Mangle(Name)); - } - - void addFunctionDefinition(std::unique_ptr<FunctionAST> FnAST) { - FunctionDefs[Mangle(FnAST->Proto->Name)] = std::move(FnAST); + JITSymbol findUnmangledSymbol(const std::string &Name) { + return findSymbol(mangle(Name)); } private: @@ -1224,13 +1231,11 @@ private: FunctionDefs.erase(DefI); // Return the address of the function. - return findMangledSymbolIn(H, Name).getAddress(); + return findSymbolIn(H, Name).getAddress(); } - std::unique_ptr<TargetMachine> TM; - Mangler Mang; SessionContext &Session; - + Mangler Mang; ObjLayerT ObjectLayer; CompileLayerT CompileLayer; LazyEmitLayerT LazyEmitLayer; @@ -1271,7 +1276,7 @@ static void HandleTopLevelExpression(SessionContext &S, KaleidoscopeJIT &J) { auto H = J.addModule(C.takeM()); // Get the address of the JIT'd function in memory. - auto ExprSymbol = J.findSymbol("__anon_expr"); + auto ExprSymbol = J.findUnmangledSymbol("__anon_expr"); // Cast it to the right type (takes no arguments, returns a double) so we // can call it as a native function. |