diff --git a/include/circt/Dialect/Arc/ArcOps.td b/include/circt/Dialect/Arc/ArcOps.td index d143bed1788d..0590cf6334e1 100644 --- a/include/circt/Dialect/Arc/ArcOps.td +++ b/include/circt/Dialect/Arc/ArcOps.td @@ -237,6 +237,16 @@ def StateOp : ArcOp<"state", [ void setCalleeFromCallable(mlir::CallInterfaceCallable callee) { (*this)->setAttr(getArcAttrName(), llvm::cast(callee)); } + + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; } @@ -278,6 +288,16 @@ def CallOp : ArcOp<"call", [ void setCalleeFromCallable(mlir::CallInterfaceCallable callee) { (*this)->setAttr(getArcAttrName(), llvm::cast(callee)); } + + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; } @@ -367,6 +387,16 @@ def MemoryWritePortOp : ArcOp<"memory_write_port", [ void setCalleeFromCallable(mlir::CallInterfaceCallable callee) { (*this)->setAttr(getArcAttrName(), llvm::cast(callee)); } + + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; } diff --git a/include/circt/Dialect/Handshake/HandshakeOps.td b/include/circt/Dialect/Handshake/HandshakeOps.td index 8cdd6dd91ddd..cf2950a6eb67 100644 --- a/include/circt/Dialect/Handshake/HandshakeOps.td +++ b/include/circt/Dialect/Handshake/HandshakeOps.td @@ -186,6 +186,16 @@ def ESIInstanceOp : Op. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; } @@ -263,6 +273,15 @@ def InstanceOp : Handshake_Op<"instance", [ return getOpOperandsMutable(); } + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; let assemblyFormat = [{ diff --git a/include/circt/Dialect/Kanagawa/KanagawaOps.td b/include/circt/Dialect/Kanagawa/KanagawaOps.td index 821de78721a7..743c9ddfcf67 100644 --- a/include/circt/Dialect/Kanagawa/KanagawaOps.td +++ b/include/circt/Dialect/Kanagawa/KanagawaOps.td @@ -464,6 +464,16 @@ def CallOp : KanagawaOp<"call", [ /// Return the callee of this operation. MethodOp getTarget(const hw::InnerRefNamespace &symbolTable); + + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; let assemblyFormat = [{ diff --git a/include/circt/Dialect/SV/SVStatements.td b/include/circt/Dialect/SV/SVStatements.td index eecf04fc7660..f1e16e67e16d 100644 --- a/include/circt/Dialect/SV/SVStatements.td +++ b/include/circt/Dialect/SV/SVStatements.td @@ -1002,6 +1002,16 @@ def FuncOp : SVOp<"func", void getAsmBlockArgumentNames(mlir::Region ®ion, mlir::OpAsmSetValueNameFn setNameFn); SmallVector getPortList(bool excludeExplicitReturn); + + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; let extraClassDefinition = [{ hw::ModuleType $cppClass::getHWModuleType() { @@ -1066,6 +1076,16 @@ class SVFuncCallBase traits = []>: SVOpsetAttr(getCalleeAttrName(), llvm::cast(callee)); } + + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; } diff --git a/include/circt/Dialect/Sim/SimOps.td b/include/circt/Dialect/Sim/SimOps.td index f3a0508caf4e..b13c6d0588ec 100644 --- a/include/circt/Dialect/Sim/SimOps.td +++ b/include/circt/Dialect/Sim/SimOps.td @@ -95,6 +95,16 @@ def DPIFuncOp : SimOp<"func.dpi", ArrayRef getResultTypes() { return getFunctionType().getResults(); } ::mlir::Region *getCallableRegion() { return nullptr; } + + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; } @@ -145,6 +155,16 @@ def DPICallOp : SimOp<"func.dpi.call", void setCalleeFromCallable(mlir::CallInterfaceCallable callee) { (*this)->setAttr(getCalleeAttrName(), llvm::cast(callee)); } + + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; } diff --git a/include/circt/Dialect/SystemC/SystemCStatements.td b/include/circt/Dialect/SystemC/SystemCStatements.td index 3caf0f05e34f..20c04369c03d 100644 --- a/include/circt/Dialect/SystemC/SystemCStatements.td +++ b/include/circt/Dialect/SystemC/SystemCStatements.td @@ -286,6 +286,15 @@ def CallIndirectOp : SystemCOp<"cpp.call_indirect", [ abort(); } + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; let assemblyFormat = [{ @@ -364,6 +373,15 @@ def CallOp : SystemCOp<"cpp.call", [ (*this)->setAttr(getCalleeAttrName(), llvm::cast(callee)); } + /// Stub implementations for ArgumentAttributesMethods. If desired, + /// implement these by defining arg_attrs and res_attrs as arguments to the + /// operation as OptionalAttr. + mlir::ArrayAttr getArgAttrsAttr() { return nullptr; } + mlir::ArrayAttr getResAttrsAttr() { return nullptr; } + void setArgAttrsAttr(mlir::ArrayAttr args) {} + void setResAttrsAttr(mlir::ArrayAttr args) {} + mlir::Attribute removeArgAttrsAttr() { return nullptr; } + mlir::Attribute removeResAttrsAttr() { return nullptr; } }]; let assemblyFormat = [{ diff --git a/integration_test/CMakeLists.txt b/integration_test/CMakeLists.txt index 341dc218632b..2a3037100413 100644 --- a/integration_test/CMakeLists.txt +++ b/integration_test/CMakeLists.txt @@ -19,7 +19,7 @@ set(CIRCT_INTEGRATION_TEST_DEPENDS ) if (MLIR_ENABLE_EXECUTION_ENGINE) - list(APPEND CIRCT_INTEGRATION_TEST_DEPENDS mlir-cpu-runner) + list(APPEND CIRCT_INTEGRATION_TEST_DEPENDS mlir-runner) endif() # If Python bindings are available to build then enable the tests. diff --git a/lib/Conversion/ArcToLLVM/LowerArcToLLVM.cpp b/lib/Conversion/ArcToLLVM/LowerArcToLLVM.cpp index 8d8f80c17941..5bc5c261fcd2 100644 --- a/lib/Conversion/ArcToLLVM/LowerArcToLLVM.cpp +++ b/lib/Conversion/ArcToLLVM/LowerArcToLLVM.cpp @@ -381,17 +381,22 @@ struct SimInstantiateOpLowering // sizeof(size_t) on the target architecture. Type convertedIndex = typeConverter->convertType(rewriter.getIndexType()); - LLVM::LLVMFuncOp mallocFunc = + FailureOr mallocFunc = LLVM::lookupOrCreateMallocFn(moduleOp, convertedIndex); - LLVM::LLVMFuncOp freeFunc = LLVM::lookupOrCreateFreeFn(moduleOp); + if (failed(mallocFunc)) + return mallocFunc; + + FailureOr freeFunc = LLVM::lookupOrCreateFreeFn(moduleOp); + if (failed(freeFunc)) + return freeFunc; Location loc = op.getLoc(); Value numStateBytes = rewriter.create( loc, convertedIndex, model.numStateBytes); - Value allocated = - rewriter - .create(loc, mallocFunc, ValueRange{numStateBytes}) - .getResult(); + Value allocated = rewriter + .create(loc, mallocFunc.value(), + ValueRange{numStateBytes}) + .getResult(); Value zero = rewriter.create(loc, rewriter.getI8Type(), 0); rewriter.create(loc, allocated, zero, numStateBytes, false); @@ -418,7 +423,7 @@ struct SimInstantiateOpLowering ValueRange{allocated}); } - rewriter.create(loc, freeFunc, ValueRange{allocated}); + rewriter.create(loc, freeFunc.value(), ValueRange{allocated}); rewriter.eraseOp(op); return success(); @@ -550,6 +555,8 @@ struct SimEmitValueOpLowering auto printfFunc = LLVM::lookupOrCreateFn( moduleOp, "printf", LLVM::LLVMPointerType::get(getContext()), LLVM::LLVMVoidType::get(getContext()), true); + if (failed(printfFunc)) + return printfFunc; // Insert the format string if not already available. SmallString<16> formatStrName{"_arc_sim_emit_"}; @@ -580,7 +587,7 @@ struct SimEmitValueOpLowering Value formatStrGlobalPtr = rewriter.create(loc, formatStrGlobal); rewriter.replaceOpWithNewOp( - op, printfFunc, ValueRange{formatStrGlobalPtr, toPrint}); + op, printfFunc.value(), ValueRange{formatStrGlobalPtr, toPrint}); return success(); } diff --git a/lib/Conversion/SMTToZ3LLVM/LowerSMTToZ3LLVM.cpp b/lib/Conversion/SMTToZ3LLVM/LowerSMTToZ3LLVM.cpp index 07a7b0d731ee..d1a9fa0a51d2 100644 --- a/lib/Conversion/SMTToZ3LLVM/LowerSMTToZ3LLVM.cpp +++ b/lib/Conversion/SMTToZ3LLVM/LowerSMTToZ3LLVM.cpp @@ -149,9 +149,11 @@ class SMTLoweringPattern : public OpConversionPattern { auto module = builder.getBlock()->getParent()->getParentOfType(); builder.setInsertionPointToEnd(module.getBody()); - funcOp = LLVM::lookupOrCreateFn(module, name, funcType.getParams(), - funcType.getReturnType(), - funcType.getVarArg()); + auto funcOpResult = LLVM::lookupOrCreateFn( + module, name, funcType.getParams(), funcType.getReturnType(), + funcType.getVarArg()); + assert(succeeded(funcOpResult) && "expected to lookup or create printf"); + funcOp = funcOpResult.value(); } return builder.create(loc, funcOp, args); } diff --git a/lib/Dialect/FSM/FSMOps.cpp b/lib/Dialect/FSM/FSMOps.cpp index 0045d48953e2..9eea42c515cb 100644 --- a/lib/Dialect/FSM/FSMOps.cpp +++ b/lib/Dialect/FSM/FSMOps.cpp @@ -44,7 +44,7 @@ void MachineOp::build(OpBuilder &builder, OperationState &state, StringRef name, if (argAttrs.empty()) return; assert(type.getNumInputs() == argAttrs.size()); - function_interface_impl::addArgAndResultAttrs( + call_interface_impl::addArgAndResultAttrs( builder, state, argAttrs, /*resultAttrs=*/std::nullopt, MachineOp::getArgAttrsAttrName(state.name), MachineOp::getResAttrsAttrName(state.name)); diff --git a/lib/Dialect/Handshake/HandshakeOps.cpp b/lib/Dialect/Handshake/HandshakeOps.cpp index e293e9e387e9..b20a6668100a 100644 --- a/lib/Dialect/Handshake/HandshakeOps.cpp +++ b/lib/Dialect/Handshake/HandshakeOps.cpp @@ -550,7 +550,7 @@ parseFuncOpArgs(OpAsmParser &parser, SmallVectorImpl &resTypes, SmallVectorImpl &resAttrs) { bool isVariadic; - if (mlir::function_interface_impl::parseFunctionSignature( + if (mlir::function_interface_impl::parseFunctionSignatureWithArguments( parser, /*allowVariadic=*/true, entryArgs, isVariadic, resTypes, resAttrs) .failed()) @@ -641,7 +641,7 @@ ParseResult FuncOp::parse(OpAsmParser &parser, OperationState &result) { result.attributes) || parseFuncOpArgs(parser, args, resTypes, resAttributes)) return failure(); - mlir::function_interface_impl::addArgAndResultAttrs( + mlir::call_interface_impl::addArgAndResultAttrs( builder, result, args, resAttributes, handshake::FuncOp::getArgAttrsAttrName(result.name), handshake::FuncOp::getResAttrsAttrName(result.name)); diff --git a/lib/Dialect/SystemC/SystemCOps.cpp b/lib/Dialect/SystemC/SystemCOps.cpp index 5915a348e472..3f7664dee239 100644 --- a/lib/Dialect/SystemC/SystemCOps.cpp +++ b/lib/Dialect/SystemC/SystemCOps.cpp @@ -171,7 +171,7 @@ ParseResult SCModuleOp::parse(OpAsmParser &parser, OperationState &result) { result.addAttribute(SCModuleOp::getFunctionTypeAttrName(result.name), functionType); - mlir::function_interface_impl::addArgAndResultAttrs( + mlir::call_interface_impl::addArgAndResultAttrs( parser.getBuilder(), result, entryArgs, resultAttrs, SCModuleOp::getArgAttrsAttrName(result.name), SCModuleOp::getResAttrsAttrName(result.name)); @@ -855,7 +855,7 @@ void FuncOp::build(OpBuilder &odsBuilder, OperationState &odsState, if (argAttrs.empty()) return; assert(type.getNumInputs() == argAttrs.size()); - mlir::function_interface_impl::addArgAndResultAttrs( + mlir::call_interface_impl::addArgAndResultAttrs( odsBuilder, odsState, argAttrs, /*resultAttrs=*/std::nullopt, FuncOp::getArgAttrsAttrName(odsState.name), FuncOp::getResAttrsAttrName(odsState.name)); @@ -893,7 +893,7 @@ ParseResult FuncOp::parse(OpAsmParser &parser, OperationState &result) { // Parse the function signature. mlir::SMLoc signatureLocation = parser.getCurrentLocation(); bool isVariadic = false; - if (mlir::function_interface_impl::parseFunctionSignature( + if (mlir::function_interface_impl::parseFunctionSignatureWithArguments( parser, false, entryArgs, isVariadic, resultTypes, resultAttrs)) return failure(); @@ -935,7 +935,7 @@ ParseResult FuncOp::parse(OpAsmParser &parser, OperationState &result) { // Add the attributes to the function arguments. assert(resultAttrs.size() == resultTypes.size()); - mlir::function_interface_impl::addArgAndResultAttrs( + mlir::call_interface_impl::addArgAndResultAttrs( builder, result, entryArgs, resultAttrs, FuncOp::getArgAttrsAttrName(result.name), FuncOp::getResAttrsAttrName(result.name)); diff --git a/lib/Tools/circt-bmc/LowerToBMC.cpp b/lib/Tools/circt-bmc/LowerToBMC.cpp index ddf5d970d7a5..4b9b04155bb6 100644 --- a/lib/Tools/circt-bmc/LowerToBMC.cpp +++ b/lib/Tools/circt-bmc/LowerToBMC.cpp @@ -77,6 +77,10 @@ void LowerToBMCPass::runOnOperation() { // Lookup or declare printf function. auto printfFunc = LLVM::lookupOrCreateFn(moduleOp, "printf", ptrTy, voidTy, true); + if (failed(printfFunc)) { + moduleOp->emitError("failed to lookup or create printf"); + return signalPassFailure(); + } // Replace the top-module with a function performing the BMC auto entryFunc = builder.create( @@ -203,7 +207,8 @@ void LowerToBMCPass::runOnOperation() { auto formatString = builder.create( loc, bmcOp.getResult(), successStrAddr.value(), failureStrAddr.value()); - builder.create(loc, printfFunc, ValueRange{formatString}); + builder.create(loc, printfFunc.value(), + ValueRange{formatString}); builder.create(loc); if (insertMainFunc) { diff --git a/lib/Tools/circt-lec/ConstructLEC.cpp b/lib/Tools/circt-lec/ConstructLEC.cpp index d4f50df53167..a44f9949f701 100644 --- a/lib/Tools/circt-lec/ConstructLEC.cpp +++ b/lib/Tools/circt-lec/ConstructLEC.cpp @@ -75,6 +75,10 @@ void ConstructLECPass::runOnOperation() { // Lookup or declare printf function. auto printfFunc = LLVM::lookupOrCreateFn(getOperation(), "printf", ptrTy, voidTy, true); + if (failed(printfFunc)) { + getOperation()->emitError("failed to lookup or create printf"); + return signalPassFailure(); + } // Lookup the modules. auto moduleA = lookupModule(firstModule); @@ -144,7 +148,8 @@ void ConstructLECPass::runOnOperation() { lookupOrCreateStringGlobal(builder, getOperation(), "c1 != c2\n"); Value formatString = builder.create( loc, areEquivalent, eqFormatString, neqFormatString); - builder.create(loc, printfFunc, ValueRange{formatString}); + builder.create(loc, printfFunc.value(), + ValueRange{formatString}); builder.create(loc, ValueRange{}); } diff --git a/llvm b/llvm index aa580c2ec5eb..289b17635958 160000 --- a/llvm +++ b/llvm @@ -1 +1 @@ -Subproject commit aa580c2ec5eb4217c945a47a561181be7e7b1032 +Subproject commit 289b17635958d986b74683c932df6b1d12f37b70 diff --git a/test/Conversion/ArcToLLVM/lower-arc-to-llvm.mlir b/test/Conversion/ArcToLLVM/lower-arc-to-llvm.mlir index 7ad14ed5e0d8..206255b07b13 100644 --- a/test/Conversion/ArcToLLVM/lower-arc-to-llvm.mlir +++ b/test/Conversion/ArcToLLVM/lower-arc-to-llvm.mlir @@ -164,7 +164,7 @@ func.func @funcCallOp(%arg0: i32) -> (i32, i32) { // CHECK-NEXT: [[V1:%.+]] = llvm.extractvalue [[V0]][0] : !llvm.struct<(i32, i32)> // CHECK-NEXT: [[V2:%.+]] = llvm.extractvalue [[V0]][1] : !llvm.struct<(i32, i32)> %0:2 = func.call @dummyFuncCallee(%arg0) : (i32) -> (i32, i32) - // CHECK-NEXT: [[V3:%.+]] = llvm.mlir.undef : !llvm.struct<(i32, i32)> + // CHECK-NEXT: [[V3:%.+]] = llvm.mlir.poison : !llvm.struct<(i32, i32)> // CHECK-NEXT: [[V4:%.+]] = llvm.insertvalue [[V1]], [[V3]][0] : !llvm.struct<(i32, i32)> // CHECK-NEXT: [[V5:%.+]] = llvm.insertvalue [[V2]], [[V4]][1] : !llvm.struct<(i32, i32)> // CHECK-NEXT: llvm.return [[V5]] :