diff options
author | Jaden Angella <ajaden@google.com> | 2025-06-26 13:54:05 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-26 13:54:05 -0700 |
commit | 1dfdd1e6dea1f52eab9968ca9ce817018d499de5 (patch) | |
tree | 6daf15041e45588343a485eba68920e8e2472f83 | |
parent | fb138a675e4acb23caf276e4a51f45b8ee67e7bf (diff) | |
download | llvm-1dfdd1e6dea1f52eab9968ca9ce817018d499de5.zip llvm-1dfdd1e6dea1f52eab9968ca9ce817018d499de5.tar.gz llvm-1dfdd1e6dea1f52eab9968ca9ce817018d499de5.tar.bz2 |
[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
-rw-r--r-- | mlir/lib/Target/Cpp/TranslateToCpp.cpp | 59 | ||||
-rw-r--r-- | mlir/test/mlir-translate/emitc_classops.mlir | 26 |
2 files changed, 77 insertions, 8 deletions
diff --git a/mlir/lib/Target/Cpp/TranslateToCpp.cpp b/mlir/lib/Target/Cpp/TranslateToCpp.cpp index 067a047..c045486 100644 --- a/mlir/lib/Target/Cpp/TranslateToCpp.cpp +++ b/mlir/lib/Target/Cpp/TranslateToCpp.cpp @@ -997,6 +997,47 @@ static LogicalResult printOperation(CppEmitter &emitter, ModuleOp moduleOp) { return success(); } +static LogicalResult printOperation(CppEmitter &emitter, ClassOp classOp) { + CppEmitter::Scope classScope(emitter); + raw_indented_ostream &os = emitter.ostream(); + os << "class " << classOp.getSymName() << " {\n"; + os << "public:\n"; + os.indent(); + + for (Operation &op : classOp) { + if (failed(emitter.emitOperation(op, /*trailingSemicolon=*/false))) + return failure(); + } + + os.unindent(); + os << "};"; + return success(); +} + +static LogicalResult printOperation(CppEmitter &emitter, FieldOp fieldOp) { + raw_ostream &os = emitter.ostream(); + if (failed(emitter.emitType(fieldOp->getLoc(), fieldOp.getType()))) + return failure(); + os << " " << fieldOp.getSymName() << ";"; + return success(); +} + +static LogicalResult printOperation(CppEmitter &emitter, + GetFieldOp getFieldOp) { + raw_indented_ostream &os = emitter.ostream(); + + Value result = getFieldOp.getResult(); + if (failed(emitter.emitType(getFieldOp->getLoc(), result.getType()))) + return failure(); + os << " "; + if (failed(emitter.emitOperand(result))) + return failure(); + os << " = "; + + os << getFieldOp.getFieldName().str(); + return success(); +} + static LogicalResult printOperation(CppEmitter &emitter, FileOp file) { if (!emitter.shouldEmitFile(file)) return success(); @@ -1605,14 +1646,16 @@ LogicalResult CppEmitter::emitOperation(Operation &op, bool trailingSemicolon) { emitc::BitwiseAndOp, emitc::BitwiseLeftShiftOp, emitc::BitwiseNotOp, emitc::BitwiseOrOp, emitc::BitwiseRightShiftOp, emitc::BitwiseXorOp, emitc::CallOp, - emitc::CallOpaqueOp, emitc::CastOp, emitc::CmpOp, - emitc::ConditionalOp, emitc::ConstantOp, emitc::DeclareFuncOp, - emitc::DivOp, emitc::ExpressionOp, emitc::FileOp, emitc::ForOp, - emitc::FuncOp, emitc::GlobalOp, emitc::IfOp, emitc::IncludeOp, - emitc::LoadOp, emitc::LogicalAndOp, emitc::LogicalNotOp, - emitc::LogicalOrOp, emitc::MulOp, emitc::RemOp, emitc::ReturnOp, - emitc::SubOp, emitc::SwitchOp, emitc::UnaryMinusOp, - emitc::UnaryPlusOp, emitc::VariableOp, emitc::VerbatimOp>( + emitc::CallOpaqueOp, emitc::CastOp, emitc::ClassOp, + emitc::CmpOp, emitc::ConditionalOp, emitc::ConstantOp, + emitc::DeclareFuncOp, emitc::DivOp, emitc::ExpressionOp, + emitc::FieldOp, emitc::FileOp, emitc::ForOp, emitc::FuncOp, + emitc::GetFieldOp, emitc::GlobalOp, emitc::IfOp, + emitc::IncludeOp, emitc::LoadOp, emitc::LogicalAndOp, + emitc::LogicalNotOp, emitc::LogicalOrOp, emitc::MulOp, + emitc::RemOp, emitc::ReturnOp, emitc::SubOp, emitc::SwitchOp, + emitc::UnaryMinusOp, emitc::UnaryPlusOp, emitc::VariableOp, + emitc::VerbatimOp>( [&](auto op) { return printOperation(*this, op); }) // Func ops. diff --git a/mlir/test/mlir-translate/emitc_classops.mlir b/mlir/test/mlir-translate/emitc_classops.mlir new file mode 100644 index 0000000..e428444 --- /dev/null +++ b/mlir/test/mlir-translate/emitc_classops.mlir @@ -0,0 +1,26 @@ +// RUN: mlir-translate --mlir-to-cpp %s | FileCheck %s + +emitc.class @modelClass { + emitc.field @fieldName0 : !emitc.array<1xf32> + emitc.field @fieldName1 : !emitc.array<1xf32> + emitc.func @execute() { + %0 = "emitc.constant"() <{value = 0 : index}> : () -> !emitc.size_t + %1 = get_field @fieldName0 : !emitc.array<1xf32> + %2 = get_field @fieldName1 : !emitc.array<1xf32> + %3 = subscript %1[%0] : (!emitc.array<1xf32>, !emitc.size_t) -> !emitc.lvalue<f32> + return + } +} + +// CHECK: class modelClass { +// CHECK-NEXT: public: +// CHECK-NEXT: float[1] fieldName0; +// CHECK-NEXT: float[1] fieldName1; +// CHECK-NEXT: void execute() { +// CHECK-NEXT: size_t v1 = 0; +// CHECK-NEXT: float[1] v2 = fieldName0; +// CHECK-NEXT: float[1] v3 = fieldName1; +// CHECK-NEXT: return; +// CHECK-NEXT: } +// CHECK-EMPTY: +// CHECK-NEXT: }; |