Skip to content

Commit 1dfdd1e

Browse files
authored
[mlir][emitC] Add support to emitter for classop, fieldop and getfieldop (#145605)
Add support to the emitter for `ClassOp`, `FieldOp` and `GetFieldOp`. These ops were introduced in #141158
1 parent fb138a6 commit 1dfdd1e

File tree

2 files changed

+77
-8
lines changed

2 files changed

+77
-8
lines changed

mlir/lib/Target/Cpp/TranslateToCpp.cpp

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,47 @@ static LogicalResult printOperation(CppEmitter &emitter, ModuleOp moduleOp) {
997997
return success();
998998
}
999999

1000+
static LogicalResult printOperation(CppEmitter &emitter, ClassOp classOp) {
1001+
CppEmitter::Scope classScope(emitter);
1002+
raw_indented_ostream &os = emitter.ostream();
1003+
os << "class " << classOp.getSymName() << " {\n";
1004+
os << "public:\n";
1005+
os.indent();
1006+
1007+
for (Operation &op : classOp) {
1008+
if (failed(emitter.emitOperation(op, /*trailingSemicolon=*/false)))
1009+
return failure();
1010+
}
1011+
1012+
os.unindent();
1013+
os << "};";
1014+
return success();
1015+
}
1016+
1017+
static LogicalResult printOperation(CppEmitter &emitter, FieldOp fieldOp) {
1018+
raw_ostream &os = emitter.ostream();
1019+
if (failed(emitter.emitType(fieldOp->getLoc(), fieldOp.getType())))
1020+
return failure();
1021+
os << " " << fieldOp.getSymName() << ";";
1022+
return success();
1023+
}
1024+
1025+
static LogicalResult printOperation(CppEmitter &emitter,
1026+
GetFieldOp getFieldOp) {
1027+
raw_indented_ostream &os = emitter.ostream();
1028+
1029+
Value result = getFieldOp.getResult();
1030+
if (failed(emitter.emitType(getFieldOp->getLoc(), result.getType())))
1031+
return failure();
1032+
os << " ";
1033+
if (failed(emitter.emitOperand(result)))
1034+
return failure();
1035+
os << " = ";
1036+
1037+
os << getFieldOp.getFieldName().str();
1038+
return success();
1039+
}
1040+
10001041
static LogicalResult printOperation(CppEmitter &emitter, FileOp file) {
10011042
if (!emitter.shouldEmitFile(file))
10021043
return success();
@@ -1605,14 +1646,16 @@ LogicalResult CppEmitter::emitOperation(Operation &op, bool trailingSemicolon) {
16051646
emitc::BitwiseAndOp, emitc::BitwiseLeftShiftOp,
16061647
emitc::BitwiseNotOp, emitc::BitwiseOrOp,
16071648
emitc::BitwiseRightShiftOp, emitc::BitwiseXorOp, emitc::CallOp,
1608-
emitc::CallOpaqueOp, emitc::CastOp, emitc::CmpOp,
1609-
emitc::ConditionalOp, emitc::ConstantOp, emitc::DeclareFuncOp,
1610-
emitc::DivOp, emitc::ExpressionOp, emitc::FileOp, emitc::ForOp,
1611-
emitc::FuncOp, emitc::GlobalOp, emitc::IfOp, emitc::IncludeOp,
1612-
emitc::LoadOp, emitc::LogicalAndOp, emitc::LogicalNotOp,
1613-
emitc::LogicalOrOp, emitc::MulOp, emitc::RemOp, emitc::ReturnOp,
1614-
emitc::SubOp, emitc::SwitchOp, emitc::UnaryMinusOp,
1615-
emitc::UnaryPlusOp, emitc::VariableOp, emitc::VerbatimOp>(
1649+
emitc::CallOpaqueOp, emitc::CastOp, emitc::ClassOp,
1650+
emitc::CmpOp, emitc::ConditionalOp, emitc::ConstantOp,
1651+
emitc::DeclareFuncOp, emitc::DivOp, emitc::ExpressionOp,
1652+
emitc::FieldOp, emitc::FileOp, emitc::ForOp, emitc::FuncOp,
1653+
emitc::GetFieldOp, emitc::GlobalOp, emitc::IfOp,
1654+
emitc::IncludeOp, emitc::LoadOp, emitc::LogicalAndOp,
1655+
emitc::LogicalNotOp, emitc::LogicalOrOp, emitc::MulOp,
1656+
emitc::RemOp, emitc::ReturnOp, emitc::SubOp, emitc::SwitchOp,
1657+
emitc::UnaryMinusOp, emitc::UnaryPlusOp, emitc::VariableOp,
1658+
emitc::VerbatimOp>(
16161659

16171660
[&](auto op) { return printOperation(*this, op); })
16181661
// Func ops.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// RUN: mlir-translate --mlir-to-cpp %s | FileCheck %s
2+
3+
emitc.class @modelClass {
4+
emitc.field @fieldName0 : !emitc.array<1xf32>
5+
emitc.field @fieldName1 : !emitc.array<1xf32>
6+
emitc.func @execute() {
7+
%0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t
8+
%1 = get_field @fieldName0 : !emitc.array<1xf32>
9+
%2 = get_field @fieldName1 : !emitc.array<1xf32>
10+
%3 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue<f32>
11+
return
12+
}
13+
}
14+
15+
// CHECK: class modelClass {
16+
// CHECK-NEXT: public:
17+
// CHECK-NEXT: float[1] fieldName0;
18+
// CHECK-NEXT: float[1] fieldName1;
19+
// CHECK-NEXT: void execute() {
20+
// CHECK-NEXT: size_t v1 = 0;
21+
// CHECK-NEXT: float[1] v2 = fieldName0;
22+
// CHECK-NEXT: float[1] v3 = fieldName1;
23+
// CHECK-NEXT: return;
24+
// CHECK-NEXT: }
25+
// CHECK-EMPTY:
26+
// CHECK-NEXT: };

0 commit comments

Comments
 (0)