From 5cac85c931d95f3c94f79837a3bf406eb68edaeb Mon Sep 17 00:00:00 2001 From: Alex Zinenko Date: Thu, 3 Sep 2020 10:05:25 +0200 Subject: [PATCH] [mlir] Check for type conversion success in std->llvm function conversion Type converter may fail and return nullptr on unconvertible types. The function conversion did not include a check and was attempting to use a nullptr type to construct an LLVM function, leading to a crash. Add a check and return early. The rest of the call stack propagates errors properly. Fixes PR47403. Reviewed By: mehdi_amini Differential Revision: https://reviews.llvm.org/D87075 --- mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp | 2 ++ mlir/test/Conversion/StandardToLLVM/invalid.mlir | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp index 2aa589a0fb7..62b787153d8 100644 --- a/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp +++ b/mlir/lib/Conversion/StandardToLLVM/StandardToLLVM.cpp @@ -1112,6 +1112,8 @@ protected: TypeConverter::SignatureConversion result(funcOp.getNumArguments()); auto llvmType = typeConverter.convertFunctionSignature( funcOp.getType(), varargsAttr && varargsAttr.getValue(), result); + if (!llvmType) + return nullptr; // Propagate argument attributes to all converted arguments obtained after // converting a given original argument. diff --git a/mlir/test/Conversion/StandardToLLVM/invalid.mlir b/mlir/test/Conversion/StandardToLLVM/invalid.mlir index 469bb9753ec..5f79cef68ba 100644 --- a/mlir/test/Conversion/StandardToLLVM/invalid.mlir +++ b/mlir/test/Conversion/StandardToLLVM/invalid.mlir @@ -29,3 +29,8 @@ func @mlir_cast_to_llvm_vec(%0 : vector<1x1xf32>) -> !llvm.vec<1 x float> { %1 = llvm.mlir.cast %0 : vector<1x1xf32> to !llvm.vec<1 x float> return %1 : !llvm.vec<1 x float> } + +// ----- + +// Should not crash on unsupported types in function signatures. +func @unsupported_signature() -> tensor<10 x i32> -- 2.11.0