forked from OSchip/llvm-project
Kaleidoscope-Orc: Reuse the IRGen utility function in later chapters, and remove an unused parameter.
llvm-svn: 228543
This commit is contained in:
parent
bae16b3f53
commit
9c4c23b32e
|
@ -1180,8 +1180,8 @@ private:
|
|||
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)
|
||||
|
@ -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<PrototypeAST>(*F->Proto));
|
||||
J.addModule(std::move(M));
|
||||
}
|
||||
|
|
|
@ -1182,16 +1182,24 @@ private:
|
|||
LazyEmitLayerT LazyEmitLayer;
|
||||
};
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
static void HandleDefinition(SessionContext &S, KaleidoscopeJIT &J) {
|
||||
if (auto F = ParseDefinition()) {
|
||||
IRGenContext C(S);
|
||||
if (auto LF = F->IRGen(C)) {
|
||||
#ifndef MINIMAL_STDERR_OUTPUT
|
||||
std::cerr << "Read function definition:\n";
|
||||
LF->dump();
|
||||
#endif
|
||||
J.addModule(C.takeM());
|
||||
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.
|
||||
|
|
|
@ -1124,6 +1124,19 @@ Function *FunctionAST::IRGen(IRGenContext &C) const {
|
|||
// 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;
|
||||
|
@ -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);
|
||||
}
|
||||
// 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);
|
||||
|
||||
addModule(C.takeM());
|
||||
return getMangledSymbolAddress(Name);
|
||||
},
|
||||
[](const std::string &S) { return 0; } );
|
||||
|
|
Loading…
Reference in New Issue