================ @@ -441,6 +441,87 @@ OpFoldResult cir::CastOp::fold(FoldAdaptor adaptor) { return tryFoldCastChain(*this); } +//===----------------------------------------------------------------------===// +// CallOp +//===----------------------------------------------------------------------===// + +static mlir::ParseResult parseCallCommon(mlir::OpAsmParser &parser, + mlir::OperationState &result) { + mlir::FlatSymbolRefAttr calleeAttr; + + if (!parser.parseOptionalAttribute(calleeAttr, "callee", result.attributes) + .has_value()) + return mlir::failure(); + + if (parser.parseLParen()) + return mlir::failure(); + + // TODO(cir): parse argument list here + + if (parser.parseRParen()) + return mlir::failure(); + + if (parser.parseOptionalAttrDict(result.attributes)) + return ::mlir::failure(); + + if (parser.parseColon()) + return ::mlir::failure(); + + mlir::FunctionType opsFnTy; + if (parser.parseType(opsFnTy)) + return mlir::failure(); + + return mlir::success(); +} + +static void printCallCommon(mlir::Operation *op, + mlir::FlatSymbolRefAttr calleeSym, + mlir::OpAsmPrinter &printer) { + printer << ' '; + + printer.printAttributeWithoutType(calleeSym); + printer << "("; + // TODO(cir): print call args here + printer << ")"; + + printer.printOptionalAttrDict(op->getAttrs(), {"callee"}); + + printer << " : "; + printer.printFunctionalType(op->getOperands().getTypes(), + op->getResultTypes()); +} + +mlir::ParseResult cir::CallOp::parse(mlir::OpAsmParser &parser, + mlir::OperationState &result) { + return parseCallCommon(parser, result); +} + +void cir::CallOp::print(mlir::OpAsmPrinter &p) { + printCallCommon(*this, getCalleeAttr(), p); +} + +static LogicalResult +verifyCallCommInSymbolUses(mlir::Operation *op, + SymbolTableCollection &symbolTable) { + auto fnAttr = op->getAttrOfType<FlatSymbolRefAttr>("callee"); + if (!fnAttr) + return mlir::failure(); + + auto fn = symbolTable.lookupNearestSymbolFrom<cir::FuncOp>(op, fnAttr); + if (!fn) + return op->emitOpError() << "'" << fnAttr.getValue() + << "' does not reference a valid function"; + + // TODO(cir): verify function arguments and return type ---------------- Lancern wrote:
Updated. https://github.com/llvm/llvm-project/pull/134673 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits