From 861a3dd510ef903aed2210dcd5722a7f34d3a243 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Sun, 8 Feb 2015 21:03:30 +0000 Subject: [PATCH] Kaleidoscope-Orc: Reuse the IRGen utility function in later chapters, and remove an unused parameter. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228543 91177308-0d34-0410-b5e6-96231b3b80d8 --- examples/Kaleidoscope/Orc/initial/toy.cpp | 6 ++-- .../Kaleidoscope/Orc/lazy_codegen/toy.cpp | 22 +++++++++---- examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp | 32 +++++++++++++------ 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/examples/Kaleidoscope/Orc/initial/toy.cpp b/examples/Kaleidoscope/Orc/initial/toy.cpp index 1b772259a19..f075af156c2 100644 --- a/examples/Kaleidoscope/Orc/initial/toy.cpp +++ b/examples/Kaleidoscope/Orc/initial/toy.cpp @@ -1180,8 +1180,8 @@ private: CompileLayerT CompileLayer; }; -static std::unique_ptr -IRGen(KaleidoscopeJIT &J, SessionContext &S, const FunctionAST &F) { +static std::unique_ptr IRGen(SessionContext &S, + const FunctionAST &F) { IRGenContext C(S); auto LF = F.IRGen(C); if (!LF) @@ -1195,7 +1195,7 @@ IRGen(KaleidoscopeJIT &J, SessionContext &S, const FunctionAST &F) { static void HandleDefinition(SessionContext &S, KaleidoscopeJIT &J) { if (auto F = ParseDefinition()) { - if (auto M = IRGen(J, S, *F)) { + if (auto M = IRGen(S, *F)) { S.addPrototypeAST(llvm::make_unique(*F->Proto)); J.addModule(std::move(M)); } diff --git a/examples/Kaleidoscope/Orc/lazy_codegen/toy.cpp b/examples/Kaleidoscope/Orc/lazy_codegen/toy.cpp index 41abd27d349..1a2043f5933 100644 --- a/examples/Kaleidoscope/Orc/lazy_codegen/toy.cpp +++ b/examples/Kaleidoscope/Orc/lazy_codegen/toy.cpp @@ -1182,16 +1182,24 @@ private: LazyEmitLayerT LazyEmitLayer; }; -static void HandleDefinition(SessionContext &S, KaleidoscopeJIT &J) { - if (auto F = ParseDefinition()) { - IRGenContext C(S); - if (auto LF = F->IRGen(C)) { +static std::unique_ptr IRGen(SessionContext &S, + const FunctionAST &F) { + IRGenContext C(S); + auto LF = F.IRGen(C); + if (!LF) + return nullptr; #ifndef MINIMAL_STDERR_OUTPUT - std::cerr << "Read function definition:\n"; - LF->dump(); + fprintf(stderr, "Read function definition:"); + LF->dump(); #endif - J.addModule(C.takeM()); + return C.takeM(); +} + +static void HandleDefinition(SessionContext &S, KaleidoscopeJIT &J) { + if (auto F = ParseDefinition()) { + if (auto M = IRGen(S, *F)) { S.addPrototypeAST(llvm::make_unique(*F->Proto)); + J.addModule(std::move(M)); } } else { // Skip token for error recovery. diff --git a/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp b/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp index e1e259da76c..2963f30e2ed 100644 --- a/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp +++ b/examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp @@ -1124,6 +1124,19 @@ Function *FunctionAST::IRGen(IRGenContext &C) const { // Top-Level parsing and JIT Driver //===----------------------------------------------------------------------===// +static std::unique_ptr IRGen(SessionContext &S, + const FunctionAST &F) { + IRGenContext C(S); + auto LF = F.IRGen(C); + if (!LF) + return nullptr; +#ifndef MINIMAL_STDERR_OUTPUT + fprintf(stderr, "Read function definition:"); + LF->dump(); +#endif + return C.takeM(); +} + class KaleidoscopeJIT { public: typedef ObjectLinkingLayer<> ObjLayerT; @@ -1166,20 +1179,19 @@ public: // If we don't find 'Name' in the JIT, see if we have some AST // for it. - if (!Session.FunctionDefs.count(Name)) + auto DefI = Session.FunctionDefs.find(Name); + if (DefI == Session.FunctionDefs.end()) return 0; // We have AST for 'Name'. IRGen it, add it to the JIT, and // return the address for it. - IRGenContext C(Session); - { - // Take ownership of the AST: We can release the memory as - // soon as we've IRGen'd it. - auto FuncAST = std::move(Session.FunctionDefs[Name]); - FuncAST->IRGen(C); - } - - addModule(C.takeM()); + // FIXME: What happens if IRGen fails? + addModule(IRGen(Session, *DefI->second)); + + // Remove the function definition's AST now that we've + // finished with it. + Session.FunctionDefs.erase(DefI); + return getMangledSymbolAddress(Name); }, [](const std::string &S) { return 0; } ); -- 2.34.1