52 auto className = funcOp.getSymNameAttr().str() +
"Class";
53 ClassOp newClassOp = ClassOp::create(rewriter, funcOp.getLoc(), className);
59 auto argAttrs = funcOp.getArgAttrs();
60 for (
auto [idx, val] : llvm::enumerate(funcOp.getArguments())) {
61 StringAttr fieldName =
64 TypeAttr typeAttr = TypeAttr::get(val.getType());
65 fields.push_back({fieldName, typeAttr});
67 FieldOp fieldop = emitc::FieldOp::create(rewriter, funcOp->getLoc(),
68 fieldName, typeAttr,
nullptr);
70 if (argAttrs && idx < argAttrs->size()) {
71 fieldop->setDiscardableAttrs(funcOp.getArgAttrDict(idx));
76 FunctionType funcType = funcOp.getFunctionType();
79 emitc::FuncOp::create(rewriter, loc, (
"execute"), funcType);
82 newFuncOp.getBody().takeBody(funcOp.getBody());
85 std::vector<Value> newArguments;
86 newArguments.reserve(fields.size());
87 for (
auto &[fieldName, attr] : fields) {
89 emitc::GetFieldOp::create(rewriter, loc, attr.getValue(), fieldName);
90 newArguments.push_back(arg);
93 for (
auto [oldArg, newArg] :
94 llvm::zip(newFuncOp.getArguments(), newArguments)) {
98 llvm::BitVector argsToErase(newFuncOp.getNumArguments(),
true);
99 if (failed(newFuncOp.eraseArguments(argsToErase)))
100 newFuncOp->emitOpError(
"failed to erase all arguments using BitVector");