From 1345552d278754db7d21e2e8236d11bb0ad3f4a2 Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Mon, 20 Sep 2021 19:58:08 +0100 Subject: [PATCH] Finish up the episode 9 --- docs/videos.org | 20 ++++++++++++------- include/serene/slir/CMakeLists.txt | 2 ++ include/serene/slir/dialect.td | 32 +----------------------------- src/serene/exprs/fn.cpp | 1 - src/serene/namespace.cpp | 9 ++++----- 5 files changed, 20 insertions(+), 44 deletions(-) diff --git a/docs/videos.org b/docs/videos.org index 10c9aef..b7be908 100644 --- a/docs/videos.org +++ b/docs/videos.org @@ -377,13 +377,19 @@ define i64 @main1(i64 %0, i64 %1, i64 %2) !dbg !9 { - https://mlir.llvm.org/docs/LangRef - https://en.wikipedia.org/wiki/Basic_block -* Episode 9 - Code Generation +* Episode 9 - IR (SLIR) generation ** Updates: -There will be an episode dedicated to eache of these - - Source manager - Diagnostic Engine - JIT + +There will be an episode dedicated to eache of these +** How does IR generation works +- Pass around MLIR context +- Create Builder objects that creates operations in specific + locations +- ModuleOp +- Namespace ** How to define a new dialect - Pure C++ - Tablegen @@ -392,7 +398,7 @@ There will be an episode dedicated to eache of these - An IR that follows the AST - Rename? *** Steps -- [ ] Define the new dialect -- [ ] Setup the tablegen -- [ ] Define the operations -- [ ] Walk the AST and generate the operations +- [X] Define the new dialect +- [X] Setup the tablegen +- [X] Define the operations +- [X] Walk the AST and generate the operations diff --git a/include/serene/slir/CMakeLists.txt b/include/serene/slir/CMakeLists.txt index 2d751f2..1b1a328 100644 --- a/include/serene/slir/CMakeLists.txt +++ b/include/serene/slir/CMakeLists.txt @@ -1,6 +1,8 @@ set(LLVM_TARGET_DEFINITIONS dialect.td) + mlir_tablegen(ops.h.inc -gen-op-decls) mlir_tablegen(ops.cpp.inc -gen-op-defs) mlir_tablegen(dialect.h.inc -gen-dialect-decls) mlir_tablegen(dialect.cpp.inc -gen-dialect-defs) + add_public_tablegen_target(SereneDialectGen) diff --git a/include/serene/slir/dialect.td b/include/serene/slir/dialect.td index 01c7641..6307dbf 100644 --- a/include/serene/slir/dialect.td +++ b/include/serene/slir/dialect.td @@ -47,7 +47,7 @@ def ValueOp: Serene_Op<"value"> { let arguments = (ins I64Attr:$value); let results = (outs I64); - // let verifier = [{ return serene::sir::verify(*this); }]; + //let verifier = [{ return serene::sir::verify(*this); }]; let builders = [ OpBuilder<(ins "int":$value), [{ @@ -80,26 +80,8 @@ def FnOp: Serene_Op<"fn", [ let regions = (region AnyRegion:$body); let results = (outs I64); - // let builders = [ - // OpBuilder<(ins - // "llvm::StringRef":$name, "mlir::FunctionType":$type, - // CArg<"llvm::ArrayRef", "{}">:$attrs, - // CArg<"llvm::ArrayRef", "{}">:$argAttrs) - // >]; - - // let extraClassDeclaration = [{ - // static FnOp create(mlir::Location location, llvm::StringRef name, mlir::FunctionType type, - // llvm::ArrayRef attrs = {}); - // static FnOp create(mlir::Location location, llvm::StringRef name, mlir::FunctionType type, - // mlir::Operation::dialect_attr_range attrs); - // static FnOp create(mlir::Location location, llvm::StringRef name, mlir::FunctionType type, - // llvm::ArrayRef attrs, - // llvm::ArrayRef argAttrs); - // }]; } - - def ReturnOp: Serene_Op<"return", [NoSideEffect, HasParent<"FnOp">, ReturnLike, Terminator]> { @@ -111,18 +93,6 @@ def ReturnOp: Serene_Op<"return", [NoSideEffect, HasParent<"FnOp">, let arguments = (ins AnyType:$operand); let assemblyFormat = [{ attr-dict $operand `:` type($operand) }]; - - // let verifier = [{ return serene::sir::verify(*this); }]; - - // let builders = [ - // OpBuilder<(ins "int":$value), [{ - // // Build from fix 64 bit int - // build(odsBuilder, odsState, odsBuilder.getI64Type(), (uint64_t) value); - // }]>, - // ]; } - - - #endif // SERENE_DIALECT diff --git a/src/serene/exprs/fn.cpp b/src/serene/exprs/fn.cpp index e067ec5..5319429 100644 --- a/src/serene/exprs/fn.cpp +++ b/src/serene/exprs/fn.cpp @@ -127,7 +127,6 @@ void Fn::generateIR(serene::Namespace &ns, mlir::ModuleOp &m) { argSym->name, mlir::TypeAttr::get(builder.getI64Type()))); } - // auto funcType = builder.getFunctionType(arg_types, builder.getI64Type()); auto fn = builder.create( loc, builder.getI64Type(), name, mlir::DictionaryAttr::get(builder.getContext(), arguments), diff --git a/src/serene/namespace.cpp b/src/serene/namespace.cpp index 9748331..1269bc8 100644 --- a/src/serene/namespace.cpp +++ b/src/serene/namespace.cpp @@ -111,11 +111,10 @@ void Namespace::dump() { return; } - // mlir::OpPrintingFlags flags; - // flags.enableDebugInfo(); + mlir::OpPrintingFlags flags; + flags.enableDebugInfo(); - // maybeModuleOp.getValue()->print(llvm::outs(), flags); - maybeModuleOp.getValue()->dump(); + maybeModuleOp.getValue()->print(llvm::outs(), flags); }; MaybeModule Namespace::compileToLLVM() { @@ -134,7 +133,7 @@ MaybeModule Namespace::compileToLLVM() { return MaybeModule::error(true); }; -Namespace::~Namespace(){}; + Namespace::~Namespace(){}; std::shared_ptr makeNamespace(SereneContext &ctx, llvm::StringRef name,