CompileLayerT CompileLayer;
};
-static std::unique_ptr<llvm::Module>
-IRGen(KaleidoscopeJIT &J, SessionContext &S, const FunctionAST &F) {
+static std::unique_ptr<llvm::Module> IRGen(SessionContext &S,
+ const FunctionAST &F) {
IRGenContext C(S);
auto LF = F.IRGen(C);
if (!LF)
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<PrototypeAST>(*F->Proto));
J.addModule(std::move(M));
}
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<llvm::Module> 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<PrototypeAST>(*F->Proto));
+ J.addModule(std::move(M));
}
} else {
// Skip token for error recovery.
// Top-Level parsing and JIT Driver
//===----------------------------------------------------------------------===//
+static std::unique_ptr<llvm::Module> 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;
// 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; } );