diff options
author | Jon Chesterfield <jonathanchesterfield@gmail.com> | 2024-04-16 11:24:45 +0100 |
---|---|---|
committer | Jon Chesterfield <jonathanchesterfield@gmail.com> | 2024-04-16 11:24:45 +0100 |
commit | f4960da6023b8034ae68925c3223d51624621b37 (patch) | |
tree | f37c4467d715812733d7b64a493c4ab9e8165eea | |
parent | b0194d2894db49d7cf4d36aed87952c3e0c6a390 (diff) |
Revert "[Verifier] Reject va_start in non-variadic function (#88809)"
This reverts commit 61717c1aa1f08eb57839a21fb2d9004739022e0d. Failed a MLIR test
-rw-r--r-- | llvm/lib/Analysis/Lint.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 5 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll | 2 | ||||
-rw-r--r-- | llvm/test/Other/lint.ll | 7 | ||||
-rw-r--r-- | llvm/test/Verifier/variadic.ll | 8 |
5 files changed, 12 insertions, 15 deletions
diff --git a/llvm/lib/Analysis/Lint.cpp b/llvm/lib/Analysis/Lint.cpp index 1ab856ac8830..0694c2995dfc 100644 --- a/llvm/lib/Analysis/Lint.cpp +++ b/llvm/lib/Analysis/Lint.cpp @@ -350,7 +350,10 @@ void Lint::visitCallBase(CallBase &I) { } case Intrinsic::vastart: - // vastart in non-varargs function is rejected by the verifier + Check(I.getParent()->getParent()->isVarArg(), + "Undefined behavior: va_start called in a non-varargs function", + &I); + visitMemoryReference(I, MemoryLocation::getForArgument(&I, 0, TLI), std::nullopt, nullptr, MemRef::Read | MemRef::Write); break; diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 4cd61e6e531b..516d4a051556 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -5798,11 +5798,6 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { break; } - case Intrinsic::vastart: { - Check(Call.getFunction()->isVarArg(), - "va_start called in a non-varargs function"); - break; - } case Intrinsic::vector_reduce_and: case Intrinsic::vector_reduce_or: case Intrinsic::vector_reduce_xor: diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll b/llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll index 8c6e01d934c2..bd576d0f70e9 100644 --- a/llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll +++ b/llvm/test/CodeGen/AArch64/GlobalISel/vastart.ll @@ -3,7 +3,7 @@ declare void @llvm.va_start(ptr) -define void @test_va_start(ptr %list, ...) { +define void @test_va_start(ptr %list) { ; CHECK-LABEL: name: test_va_start ; CHECK: [[LIST:%[0-9]+]]:_(p0) = COPY $x0 ; CHECK-IOS: G_VASTART [[LIST]](p0) :: (store (s64) into %ir.list, align 1) diff --git a/llvm/test/Other/lint.ll b/llvm/test/Other/lint.ll index 6fd2d40cd2f2..6b31b31a78c9 100644 --- a/llvm/test/Other/lint.ll +++ b/llvm/test/Other/lint.ll @@ -124,6 +124,13 @@ define void @0() nounwind { ret void } +; CHECK: va_start called in a non-varargs function +declare void @llvm.va_start(ptr) +define void @not_vararg(ptr %p) nounwind { + call void @llvm.va_start(ptr %p) + ret void +} + ; CHECK: Undefined behavior: Branch to non-blockaddress define void @use_indbr() { indirectbr ptr @foo, [label %block] diff --git a/llvm/test/Verifier/variadic.ll b/llvm/test/Verifier/variadic.ll deleted file mode 100644 index 55e4a4da0a92..000000000000 --- a/llvm/test/Verifier/variadic.ll +++ /dev/null @@ -1,8 +0,0 @@ -; RUN: not opt -S -passes=verify 2>&1 < %s | FileCheck %s - -; CHECK: va_start called in a non-varargs function -declare void @llvm.va_start(ptr) -define void @not_vararg(ptr %p) nounwind { - call void @llvm.va_start(ptr %p) - ret void -} |