Skip to content

Commit 0594254

Browse files
committed
Add FuncOp, ReturnOp and CallOp and lower them to the func dialect
Relates to #612 Signed-off-by: Roberto Raggi <[email protected]>
1 parent 76d1c6c commit 0594254

File tree

11 files changed

+241
-112
lines changed

11 files changed

+241
-112
lines changed

src/frontend/cxx/frontend.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,9 @@ auto runOnFile(const CLI& cli, const std::string& fileName) -> bool {
369369
auto ir = codegen(unit.ast());
370370

371371
mlir::OpPrintingFlags flags;
372-
flags.enableDebugInfo(true, true);
372+
if (cli.opt_g) {
373+
flags.enableDebugInfo(true, true);
374+
}
373375
ir.module->print(llvm::outs(), flags);
374376
}
375377
#endif

src/mlir/cxx/mlir/CxxOps.td

Lines changed: 80 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,85 @@
2020

2121
include "mlir/IR/OpBase.td"
2222
include "mlir/IR/AttrTypeBase.td"
23+
include "mlir/IR/SymbolInterfaces.td"
24+
include "mlir/Interfaces/FunctionInterfaces.td"
25+
include "mlir/Interfaces/SideEffectInterfaces.td"
2326

2427
def Cxx_Dialect : Dialect {
2528
let name = "cxx";
2629
let cppNamespace = "mlir::cxx";
2730
let useDefaultTypePrinterParser = 1;
28-
let dependentDialects = [
29-
"mlir::func::FuncDialect",
30-
"mlir::cf::ControlFlowDialect",
31-
"mlir::scf::SCFDialect",
31+
let dependentDialects = ["mlir::func::FuncDialect",
32+
"mlir::cf::ControlFlowDialect",
33+
"mlir::scf::SCFDialect",
3234
];
3335
}
3436

35-
class Cxx_Type<string name, string typeMnemonic, list<Trait> traits = []> : TypeDef<Cxx_Dialect, name, traits> {
36-
let mnemonic = typeMnemonic;
37+
class Cxx_Type<string name, string typeMnemonic, list<Trait> traits = []>
38+
: TypeDef<Cxx_Dialect, name, traits> {
39+
let mnemonic = typeMnemonic;
3740
}
3841

39-
class Cxx_Op<string mnemonic, list<Trait> traits = []> : Op<Cxx_Dialect, mnemonic, traits> {
40-
}
42+
class Cxx_Op<string mnemonic, list<Trait> traits = []>
43+
: Op<Cxx_Dialect, mnemonic, traits> {}
4144

4245
def Cxx_ExprType : Cxx_Type<"Expr", "expr">;
4346

47+
def Cxx_FuncOp : Cxx_Op<"func", [FunctionOpInterface, IsolatedFromAbove]> {
48+
let arguments = (ins SymbolNameAttr:$sym_name,
49+
TypeAttrOf<FunctionType>:$function_type,
50+
OptionalAttr<DictArrayAttr>:$arg_attrs,
51+
OptionalAttr<DictArrayAttr>:$res_attrs);
52+
53+
let regions = (region AnyRegion:$body);
54+
55+
let builders = [OpBuilder<(ins "StringRef":$name, "FunctionType":$type,
56+
CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>];
57+
58+
let extraClassDeclaration =
59+
[{
60+
auto getArgumentTypes() -> ArrayRef<Type> { return getFunctionType().getInputs(); }
61+
auto getResultTypes() -> ArrayRef<Type> { return getFunctionType().getResults(); }
62+
auto getCallableRegion() -> Region* { return &getBody(); }
63+
}];
64+
65+
let hasCustomAssemblyFormat = 1;
66+
let skipDefaultBuilders = 1;
67+
}
68+
69+
def Cxx_ReturnOp : Cxx_Op<"return", [Pure, HasParent<"FuncOp">, Terminator]> {
70+
let arguments = (ins Variadic<Cxx_ExprType>:$input);
71+
72+
let builders = [OpBuilder<(ins), [{ build($_builder, $_state, {}); }]>];
73+
74+
let extraClassDeclaration = [{
75+
bool hasOperand() { return getNumOperands() != 0; }
76+
}];
77+
78+
let hasVerifier = 0;
79+
}
80+
81+
def Cxx_CallOp : Cxx_Op<"call"> {
82+
let arguments = (ins Cxx_ExprType:$callee, Variadic<AnyType>:$arguments);
83+
let results = (outs Cxx_ExprType:$result);
84+
let assemblyFormat =
85+
"$callee `(` $arguments `:` type($arguments) `)` attr-dict `:` "
86+
"type($result)";
87+
let builders =
88+
[OpBuilder<
89+
(ins "mlir::Value":$callee, "mlir::ValueRange":$arguments),
90+
[{ build($_builder, $_state, $_builder.getType<ExprType>(), callee, arguments); }]>,
91+
];
92+
}
93+
4494
def TodoExprOp : Cxx_Op<"todo.expr"> {
4595
let arguments = (ins StrAttr:$message);
4696
let results = (outs Cxx_ExprType:$result);
4797
let assemblyFormat = "$message attr-dict `:` type($result)";
48-
let builders = [
49-
OpBuilder<(ins "::llvm::StringRef":$message),
50-
[{ build($_builder, $_state, $_builder.getType<ExprType>(), message); }]>,
98+
let builders =
99+
[OpBuilder<
100+
(ins "::llvm::StringRef":$message),
101+
[{ build($_builder, $_state, $_builder.getType<ExprType>(), message); }]>,
51102
];
52103
}
53104

@@ -67,53 +118,43 @@ def ImplicitCastOp : Cxx_Op<"implicit.cast"> {
67118
let arguments = (ins StrAttr:$cast, Cxx_ExprType:$value);
68119
let results = (outs Cxx_ExprType:$result);
69120
let assemblyFormat = "$cast `(` $value `)` attr-dict `:` type($result)";
70-
let builders = [
71-
OpBuilder<(ins "llvm::StringRef":$cast, "mlir::Value":$value),
72-
[{ build($_builder, $_state, $_builder.getType<ExprType>(), cast, value); }]>,
121+
let builders =
122+
[OpBuilder<
123+
(ins "llvm::StringRef":$cast, "mlir::Value":$value),
124+
[{ build($_builder, $_state, $_builder.getType<ExprType>(), cast, value); }]>,
73125
];
74126
}
75127

76128
def IntLiteralOp : Cxx_Op<"int.literal"> {
77129
let arguments = (ins I64Attr:$value);
78130
let results = (outs Cxx_ExprType:$result);
79131
let assemblyFormat = "$value attr-dict `:` type($result)";
80-
let builders = [
81-
OpBuilder<(ins "int64_t":$value),
82-
[{ build($_builder, $_state, $_builder.getType<ExprType>(), value); }]>,
132+
let builders =
133+
[OpBuilder<
134+
(ins "int64_t":$value),
135+
[{ build($_builder, $_state, $_builder.getType<ExprType>(), value); }]>,
83136
];
84137
}
85138

86139
def IdOp : Cxx_Op<"id"> {
87140
let arguments = (ins StrAttr:$name);
88141
let results = (outs Cxx_ExprType:$result);
89142
let assemblyFormat = "$name attr-dict `:` type($result)";
90-
let builders = [
91-
OpBuilder<(ins "llvm::StringRef":$name),
92-
[{ build($_builder, $_state, $_builder.getType<ExprType>(), name); }]>,
143+
let builders =
144+
[OpBuilder<
145+
(ins "llvm::StringRef":$name),
146+
[{ build($_builder, $_state, $_builder.getType<ExprType>(), name); }]>,
93147
];
94148
}
95149

96150
def BinOp : Cxx_Op<"binary"> {
97151
let arguments = (ins StrAttr:$op, Cxx_ExprType:$lhs, Cxx_ExprType:$rhs);
98152
let results = (outs Cxx_ExprType:$result);
99-
let assemblyFormat = "`op` $op `(` $lhs `,` $rhs `)` attr-dict `:` type($result)";
100-
let builders = [
101-
OpBuilder<(ins "llvm::StringRef":$op, "mlir::Value":$lhs, "mlir::Value":$rhs),
102-
[{ build($_builder, $_state, $_builder.getType<ExprType>(), op, lhs, rhs); }]>,
103-
];
104-
}
105-
106-
def CallOp : Cxx_Op<"call"> {
107-
let arguments = (ins Cxx_ExprType:$callee, Variadic<AnyType>:$arguments);
108-
let results = (outs Cxx_ExprType:$result);
109-
let assemblyFormat = "$callee `(` $arguments `:` type($arguments) `)` attr-dict `:` type($result)";
110-
let builders = [
111-
OpBuilder<(ins "mlir::Value":$callee, "mlir::ValueRange":$arguments),
112-
[{ build($_builder, $_state, $_builder.getType<ExprType>(), callee, arguments); }]>,
153+
let assemblyFormat =
154+
"`op` $op `(` $lhs `,` $rhs `)` attr-dict `:` type($result)";
155+
let builders =
156+
[OpBuilder<
157+
(ins "llvm::StringRef":$op, "mlir::Value":$lhs, "mlir::Value":$rhs),
158+
[{ build($_builder, $_state, $_builder.getType<ExprType>(), op, lhs, rhs); }]>,
113159
];
114160
}
115-
116-
def ReturnOp : Cxx_Op<"return"> {
117-
let arguments = (ins Optional<Cxx_ExprType>:$value);
118-
let results = (outs);
119-
}

0 commit comments

Comments
 (0)