From 3d5275fc05d54a8f951e034bcb7bcd48b0e46eb8 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Thu, 30 Apr 2020 13:48:43 -0700 Subject: [PATCH] Handle indirect calls in preallocated verification Summary: getCalledFunction() returns null for indirect function invocations. Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D79203 --- llvm/lib/IR/Verifier.cpp | 6 +++--- llvm/test/Verifier/preallocated-valid.ll | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 77e0054..df6b2bd 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -4485,7 +4485,7 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { Assert(UseCall != nullptr, "Uses of llvm.call.preallocated.setup must be calls"); const Function *Fn = UseCall->getCalledFunction(); - if (Fn->getIntrinsicID() == Intrinsic::call_preallocated_arg) { + if (Fn && Fn->getIntrinsicID() == Intrinsic::call_preallocated_arg) { auto *AllocArgIndex = dyn_cast(UseCall->getArgOperand(1)); Assert(AllocArgIndex != nullptr, "llvm.call.preallocated.alloc arg index must be a constant"); @@ -4500,8 +4500,8 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { "llvm.call.preallocated.setup"); FoundCall = true; size_t NumPreallocatedArgs = 0; - for (auto &Arg : Fn->args()) { - if (Arg.hasAttribute(Attribute::Preallocated)) { + for (unsigned i = 0; i < UseCall->getNumArgOperands(); i++) { + if (UseCall->paramHasAttr(i, Attribute::Preallocated)) { ++NumPreallocatedArgs; } } diff --git a/llvm/test/Verifier/preallocated-valid.ll b/llvm/test/Verifier/preallocated-valid.ll index a296acd..07f748c 100644 --- a/llvm/test/Verifier/preallocated-valid.ll +++ b/llvm/test/Verifier/preallocated-valid.ll @@ -14,6 +14,14 @@ define void @preallocated() { ret void } +define void @preallocated_indirect(void (i32*)* %f) { + %cs = call token @llvm.call.preallocated.setup(i32 1) + %x = call i8* @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32) + %y = bitcast i8* %x to i32* + call void %f(i32* preallocated(i32) %y) ["preallocated"(token %cs)] + ret void +} + define void @preallocated_setup_without_call() { %cs = call token @llvm.call.preallocated.setup(i32 1) %a0 = call i8* @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32) -- 2.7.4