Setup a very basic IR generation process
This commit is contained in:
parent
d52c6adc1d
commit
36eef7222f
|
@ -23,11 +23,11 @@
|
|||
*/
|
||||
|
||||
#include "serene/serene.h"
|
||||
#include "serene/context.h"
|
||||
#include "serene/namespace.h"
|
||||
#include "serene/reader/reader.h"
|
||||
#include "serene/reader/semantics.h"
|
||||
// #include "serene/sir/sir.hpp"
|
||||
#include "serene/context.h"
|
||||
#include "serene/slir/slir.h"
|
||||
#include <iostream>
|
||||
#include <llvm/Support/CommandLine.h>
|
||||
|
||||
|
@ -49,7 +49,7 @@ static cl::opt<enum Action> emitAction(
|
|||
"emit", cl::desc("Select what to dump."),
|
||||
cl::values(clEnumValN(DumpSemantic, "ast1",
|
||||
"Output the AST after one level of analysis only")),
|
||||
cl::values(clEnumValN(DumpIR, "sir", "Output the SLIR only")),
|
||||
cl::values(clEnumValN(DumpIR, "slir", "Output the SLIR only")),
|
||||
cl::values(clEnumValN(DumpAST, "ast", "Output the AST only"))
|
||||
|
||||
);
|
||||
|
@ -91,15 +91,38 @@ int main(int argc, char *argv[]) {
|
|||
return 0;
|
||||
};
|
||||
case Action::DumpIR: {
|
||||
// reader::FileReader *r = new reader::FileReader(inputFile);
|
||||
// auto ast = r->read();
|
||||
reader::FileReader *r = new reader::FileReader(inputFile);
|
||||
|
||||
// if (!ast) {
|
||||
// throw std::move(ast.getError());
|
||||
// }
|
||||
auto maybeAst = r->read();
|
||||
|
||||
// serene::sir::dumpSIR(ast.getValue());
|
||||
// delete r;
|
||||
if (!maybeAst) {
|
||||
throw std::move(maybeAst.getError());
|
||||
}
|
||||
|
||||
// TODO: Move all this to a compile fn
|
||||
auto &ast = maybeAst.getValue();
|
||||
|
||||
auto ctx = makeSereneContext();
|
||||
auto ns = makeNamespace(*ctx, "user", llvm::None);
|
||||
auto afterAst = reader::analyze(*ctx, ast);
|
||||
|
||||
if (afterAst) {
|
||||
auto isSet = ns->setTree(afterAst.getValue());
|
||||
|
||||
if (isSet.succeeded()) {
|
||||
ctx->insertNS(ns);
|
||||
serene::slir::dumpSLIR(*ctx, ns->name);
|
||||
} else {
|
||||
llvm::outs() << "Can't set the tree of the namespace!\n";
|
||||
}
|
||||
|
||||
delete r;
|
||||
return 0;
|
||||
} else {
|
||||
throw std::move(afterAst.getError());
|
||||
}
|
||||
|
||||
delete r;
|
||||
return 0;
|
||||
}
|
||||
default: {
|
||||
|
|
|
@ -48,7 +48,7 @@ private:
|
|||
std::shared_ptr<serene::Namespace> ns;
|
||||
|
||||
// TODO: Should we use builder here? maybe there is a better option
|
||||
mlir::Location toMLIRLocation(serene::reader::Location *);
|
||||
mlir::Location toMLIRLocation(serene::reader::Location &);
|
||||
|
||||
public:
|
||||
Generator(serene::SereneContext &ctx, llvm::StringRef ns_name)
|
||||
|
@ -57,7 +57,7 @@ public:
|
|||
this->ns = ctx.getNS(ns_name);
|
||||
};
|
||||
|
||||
mlir::Operation *generate(exprs::Number *);
|
||||
mlir::Operation *generate(exprs::Number &);
|
||||
mlir::Operation *generate(exprs::Expression *);
|
||||
mlir::Value generate(exprs::List *);
|
||||
mlir::ModuleOp generate();
|
||||
|
|
|
@ -179,19 +179,19 @@ mlir::Value Generator::generate(exprs::List *l) {
|
|||
// return fn;
|
||||
// }
|
||||
|
||||
mlir::Operation *Generator::generate(exprs::Number *x) {
|
||||
return builder.create<ValueOp>(builder.getUnknownLoc(), x->toI64());
|
||||
mlir::Operation *Generator::generate(exprs::Number &x) {
|
||||
return builder.create<ValueOp>(toMLIRLocation(x.location.start), x.toI64());
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert a Serene location to MLIR FileLineLoc Location
|
||||
*/
|
||||
::mlir::Location Generator::toMLIRLocation(serene::reader::Location *loc) {
|
||||
::mlir::Location Generator::toMLIRLocation(serene::reader::Location &loc) {
|
||||
auto file = this->ns->filename;
|
||||
std::string filename{file.getValueOr("REPL")};
|
||||
|
||||
return mlir::FileLineColLoc::get(builder.getIdentifier(filename), loc->line,
|
||||
loc->col);
|
||||
return mlir::FileLineColLoc::get(builder.getIdentifier(filename), loc.line,
|
||||
loc.col);
|
||||
}
|
||||
|
||||
Generator::~Generator(){};
|
||||
|
|
|
@ -49,7 +49,7 @@ void dumpSLIR(serene::SereneContext &ctx, llvm::StringRef ns_name) {
|
|||
SLIR s(ctx);
|
||||
auto ns = ctx.getNS(ns_name);
|
||||
|
||||
assert(!ns && "No such a namespace to dump!");
|
||||
assert(ns && "No such a namespace to dump!");
|
||||
|
||||
auto module = s.generate(ns_name);
|
||||
module->dump();
|
||||
|
|
Loading…
Reference in New Issue