Setup a very basic IR generation process

This commit is contained in:
Sameer Rahmani 2021-06-09 13:29:14 +01:00
parent d52c6adc1d
commit 36eef7222f
4 changed files with 41 additions and 18 deletions

View File

@ -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: {

View File

@ -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();

View File

@ -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(){};

View File

@ -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();