From ff59a1cfe64c0b619c1a8e9ae14406a47897b98d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 15 Jul 2021 20:34:56 +0200 Subject: [PATCH] [Verifier] Extend address taken check for unknown intrinsics Intrinsics can only be called directly, taking their address is not legal. This is currently only enforced for intrinsics that have an ID, rather than all intrinsics. Adjust the check to cover all intrinsics. This came up in D106013. Differential Revision: https://reviews.llvm.org/D106095 --- llvm/lib/IR/Verifier.cpp | 2 +- llvm/test/Verifier/intrinsic-addr-taken.ll | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 llvm/test/Verifier/intrinsic-addr-taken.ll diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 2c005c9..67ed73f 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -2521,7 +2521,7 @@ void Verifier::visitFunction(const Function &F) { // direct call/invokes, never having its "address taken". // Only do this if the module is materialized, otherwise we don't have all the // uses. - if (F.getIntrinsicID() && F.getParent()->isMaterialized()) { + if (F.isIntrinsic() && F.getParent()->isMaterialized()) { const User *U; if (F.hasAddressTaken(&U)) Assert(false, "Invalid user of intrinsic instruction!", U); diff --git a/llvm/test/Verifier/intrinsic-addr-taken.ll b/llvm/test/Verifier/intrinsic-addr-taken.ll new file mode 100644 index 0000000..630f5fe --- /dev/null +++ b/llvm/test/Verifier/intrinsic-addr-taken.ll @@ -0,0 +1,9 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +declare i32 @llvm.umax.i32(i32, i32) +declare i32 @llvm.my.custom.intrinsic() + +; CHECK: Invalid user of intrinsic instruction! +@g1 = global i32(i32, i32)* @llvm.umax.i32 +; CHECK: Invalid user of intrinsic instruction! +@g2 = global i32()* @llvm.my.custom.intrinsic -- 2.7.4