================ @@ -2406,6 +2406,208 @@ OpFoldResult RotateOp::fold(FoldAdaptor adaptor) { return IntAttr::get(input.getContext(), input.getType(), resultValue); } +//===----------------------------------------------------------------------===// +// InlineAsmOp +//===----------------------------------------------------------------------===// + +void cir::InlineAsmOp::print(OpAsmPrinter &p) { + p << '(' << getAsmFlavor() << ", "; + p.increaseIndent(); + p.printNewline(); + + llvm::SmallVector<std::string, 3> names{"out", "in", "in_out"}; + auto *nameIt = names.begin(); + auto *attrIt = getOperandAttrs().begin(); + + for (auto ops : getAsmOperands()) { + p << *nameIt << " = "; + + p << '['; + llvm::interleaveComma(llvm::make_range(ops.begin(), ops.end()), p, + [&](Value value) { + p.printOperand(value); + p << " : " << value.getType(); + if (*attrIt) + p << " (maybe_memory)"; + attrIt++; + }); + p << "],"; + p.printNewline(); + ++nameIt; + } + + p << "{"; + p.printString(getAsmString()); + p << " "; + p.printString(getConstraints()); + p << "}"; + p.decreaseIndent(); + p << ')'; + if (getSideEffects()) + p << " side_effects"; + + llvm::SmallVector<::llvm::StringRef, 2> elidedAttrs; + elidedAttrs.push_back("asm_flavor"); + elidedAttrs.push_back("asm_string"); + elidedAttrs.push_back("constraints"); + elidedAttrs.push_back("operand_attrs"); + elidedAttrs.push_back("operands_segments"); + elidedAttrs.push_back("side_effects"); + p.printOptionalAttrDict(getOperation()->getAttrs(), elidedAttrs); + + if (auto v = getRes()) + p << " -> " << v.getType(); +} + +void cir::InlineAsmOp::build(OpBuilder &odsBuilder, OperationState &odsState, + ArrayRef<ValueRange> asmOperands, + StringRef asmString, StringRef constraints, + bool sideEffects, cir::AsmFlavor asmFlavor, + ArrayRef<Attribute> operandAttrs) { + // Set up the operands_segments for VariadicOfVariadic + SmallVector<int32_t> segments; + for (auto operandRange : asmOperands) { + segments.push_back(operandRange.size()); + odsState.addOperands(operandRange); + } + + odsState.addAttribute( + "operands_segments", + DenseI32ArrayAttr::get(odsBuilder.getContext(), segments)); + odsState.addAttribute("asm_string", odsBuilder.getStringAttr(asmString)); + odsState.addAttribute("constraints", odsBuilder.getStringAttr(constraints)); + odsState.addAttribute("asm_flavor", + AsmFlavorAttr::get(odsBuilder.getContext(), asmFlavor)); + + if (sideEffects) + odsState.addAttribute("side_effects", odsBuilder.getUnitAttr()); + + odsState.addAttribute("operand_attrs", odsBuilder.getArrayAttr(operandAttrs)); +} + +ParseResult cir::InlineAsmOp::parse(OpAsmParser &parser, + OperationState &result) { + llvm::SmallVector<mlir::Attribute> operandAttrs; + llvm::SmallVector<int32_t> operandsGroupSizes; + std::string asmString, constraints; + Type resType; + auto *ctxt = parser.getBuilder().getContext(); + + auto error = [&](const Twine &msg) -> LogicalResult { + return parser.emitError(parser.getCurrentLocation(), msg); + }; + + auto expected = [&](const std::string &c) { + return error("expected '" + c + "'"); + }; + + if (parser.parseLParen().failed()) + return expected("("); + + auto flavor = FieldParser<AsmFlavor, AsmFlavor>::parse(parser); + if (failed(flavor)) + return error("Unknown AsmFlavor"); + + if (parser.parseComma().failed()) + return expected(","); + + auto parseValue = [&](Value &v) { + OpAsmParser::UnresolvedOperand op; + + if (parser.parseOperand(op) || parser.parseColon()) + return mlir::failure(); + + Type typ; + if (parser.parseType(typ).failed()) + return error("can't parse operand type"); + llvm::SmallVector<mlir::Value> tmp; + if (parser.resolveOperand(op, typ, tmp)) + return error("can't resolve operand"); + v = tmp[0]; + return mlir::success(); + }; + + auto parseOperands = [&](llvm::StringRef name) { + if (parser.parseKeyword(name).failed()) + return error("expected " + name + " operands here"); + if (parser.parseEqual().failed()) + return expected("="); + if (parser.parseLSquare().failed()) + return expected("["); + + int size = 0; + if (parser.parseOptionalRSquare().succeeded()) { + operandsGroupSizes.push_back(size); + if (parser.parseComma()) + return expected(","); + return mlir::success(); + } + + if (parser.parseCommaSeparatedList([&]() { + Value val; ---------------- bcardosolopes wrote:
The indentation here is super odd, needs fixing. https://github.com/llvm/llvm-project/pull/153362 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits