2020
2121include "mlir/IR/OpBase.td"
2222include "mlir/IR/AttrTypeBase.td"
23+ include "mlir/IR/SymbolInterfaces.td"
24+ include "mlir/Interfaces/FunctionInterfaces.td"
25+ include "mlir/Interfaces/SideEffectInterfaces.td"
2326
2427def 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
4245def 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+
4494def 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
76128def 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
86139def 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
96150def 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