Adjusted options of PL/0

This commit is contained in:
yhirose 2017-08-08 12:01:51 -04:00
parent 0388e3e6c4
commit d4fabb04ad

View File

@ -495,10 +495,35 @@ struct Interpreter {
* LLVM * LLVM
*/ */
struct LLVM { struct LLVM {
LLVM() : builder_(context_) { LLVM(const shared_ptr<AstPL0> ast) : builder_(context_) {
module_ = make_unique<Module>("pl0", context_); module_ = make_unique<Module>("pl0", context_);
compile(ast);
} }
void dump() { module_->dump(); }
void exec() {
unique_ptr<ExecutionEngine> ee(EngineBuilder(std::move(module_)).create());
std::vector<GenericValue> noargs;
auto fn = ee->FindFunctionNamed("__main__");
auto ret = ee->runFunction(fn, noargs);
}
static void dump(const shared_ptr<AstPL0> ast) {
LLVM compiler(ast);
compiler.dump();
}
static void exec(const shared_ptr<AstPL0> ast) {
LLVM compiler(ast);
compiler.exec();
}
private:
LLVMContext context_;
IRBuilder<> builder_;
unique_ptr<Module> module_;
void compile(const shared_ptr<AstPL0> ast) { void compile(const shared_ptr<AstPL0> ast) {
InitializeNativeTarget(); InitializeNativeTarget();
InitializeNativeTargetAsmPrinter(); InitializeNativeTargetAsmPrinter();
@ -506,26 +531,6 @@ struct LLVM {
compile_program(ast); compile_program(ast);
} }
void dump() { module_->dump(); }
static void exec(const shared_ptr<AstPL0> ast) {
LLVM compiler;
compiler.compile(ast);
// compiler.dump();
auto EE = EngineBuilder(std::move(compiler.module_)).create();
std::unique_ptr<ExecutionEngine> ExecutionEngineOwner(EE);
std::vector<GenericValue> noargs;
auto fn = EE->FindFunctionNamed("__main__");
auto ret = EE->runFunction(fn, noargs);
}
private:
LLVMContext context_;
IRBuilder<> builder_;
unique_ptr<Module> module_;
void compile_switch(const shared_ptr<AstPL0> ast) { void compile_switch(const shared_ptr<AstPL0> ast) {
switch (ast->tag) { switch (ast->tag) {
case "assignment"_: case "assignment"_:
@ -878,13 +883,16 @@ int main(int argc, const char** argv) {
// Parse the source and make an AST // Parse the source and make an AST
shared_ptr<AstPL0> ast; shared_ptr<AstPL0> ast;
if (parser.parse_n(source.data(), source.size(), ast, path)) { if (parser.parse_n(source.data(), source.size(), ast, path)) {
bool opt_llvm = false; bool opt_jit = false;
bool opt_ast = false; bool opt_ast = false;
bool opt_llvm = false;
{ {
auto argi = 2; auto argi = 2;
while (argi < argc) { while (argi < argc) {
if (string("--ast") == argv[argi]) { if (string("--ast") == argv[argi]) {
opt_ast = true; opt_ast = true;
} else if (string("--jit") == argv[argi]) {
opt_jit = true;
} else if (string("--llvm") == argv[argi]) { } else if (string("--llvm") == argv[argi]) {
opt_llvm = true; opt_llvm = true;
} }
@ -898,11 +906,18 @@ int main(int argc, const char** argv) {
try { try {
SymbolTable::build_on_ast(ast); SymbolTable::build_on_ast(ast);
if (opt_llvm) {
LLVM::exec(ast); if (opt_llvm || opt_jit) {
if (opt_llvm) {
LLVM::dump(ast);
}
if (opt_jit) {
LLVM::exec(ast);
}
} else { } else {
Interpreter::exec(ast); Interpreter::exec(ast);
} }
} catch (const runtime_error& e) { } catch (const runtime_error& e) {
cerr << e.what() << endl; cerr << e.what() << endl;
} }