Skip to content

Commit

Permalink
[Core] Allow hasAddressTaken to ignore "casted direct calls"
Browse files Browse the repository at this point in the history
A direct call to a function casted to a different type is still not
really an address taken event. We allow the user to opt out of these
now.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D159149
  • Loading branch information
jdoerfert committed Sep 1, 2023
1 parent 6e42f90 commit 209496b
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 8 deletions.
11 changes: 6 additions & 5 deletions llvm/include/llvm/IR/Function.h
Original file line number Diff line number Diff line change
Expand Up @@ -888,13 +888,14 @@ class LLVM_EXTERNAL_VISIBILITY Function : public GlobalObject,
/// other than direct calls or invokes to it, or blockaddress expressions.
/// Optionally passes back an offending user for diagnostic purposes,
/// ignores callback uses, assume like pointer annotation calls, references in
/// llvm.used and llvm.compiler.used variables, and operand bundle
/// "clang.arc.attachedcall".
bool hasAddressTaken(const User ** = nullptr,
bool IgnoreCallbackUses = false,
/// llvm.used and llvm.compiler.used variables, operand bundle
/// "clang.arc.attachedcall", and direct calls with a different call site
/// signature (the function is implicitly casted).
bool hasAddressTaken(const User ** = nullptr, bool IgnoreCallbackUses = false,
bool IgnoreAssumeLikeCalls = true,
bool IngoreLLVMUsed = false,
bool IgnoreARCAttachedCall = false) const;
bool IgnoreARCAttachedCall = false,
bool IgnoreCastedDirectCall = false) const;

/// isDefTriviallyDead - Return true if it is trivially safe to remove
/// this function definition from the module (because it isn't externally
Expand Down
6 changes: 4 additions & 2 deletions llvm/lib/IR/Function.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1752,7 +1752,8 @@ std::optional<Function *> Intrinsic::remangleIntrinsicFunction(Function *F) {
bool Function::hasAddressTaken(const User **PutOffender,
bool IgnoreCallbackUses,
bool IgnoreAssumeLikeCalls, bool IgnoreLLVMUsed,
bool IgnoreARCAttachedCall) const {
bool IgnoreARCAttachedCall,
bool IgnoreCastedDirectCall) const {
for (const Use &U : uses()) {
const User *FU = U.getUser();
if (isa<BlockAddress>(FU))
Expand Down Expand Up @@ -1801,7 +1802,8 @@ bool Function::hasAddressTaken(const User **PutOffender,
continue;
}

if (!Call->isCallee(&U) || Call->getFunctionType() != getFunctionType()) {
if (!Call->isCallee(&U) || (!IgnoreCastedDirectCall &&
Call->getFunctionType() != getFunctionType())) {
if (IgnoreARCAttachedCall &&
Call->isOperandBundleOfType(LLVMContext::OB_clang_arc_attachedcall,
U.getOperandNo()))
Expand Down
4 changes: 3 additions & 1 deletion llvm/lib/Transforms/IPO/Attributor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1072,7 +1072,9 @@ Attributor::Attributor(SetVector<Function *> &Functions,
if (Fn->hasAddressTaken(/*PutOffender=*/nullptr,
/*IgnoreCallbackUses=*/false,
/*IgnoreAssumeLikeCalls=*/true,
/*IgnoreLLVMUsed=*/true))
/*IgnoreLLVMUsed=*/true,
/*IgnoreARCAttachedCall=*/false,
/*IgnoreCastedDirectCall=*/true))
InfoCache.IndirectlyCallableFunctions.push_back(Fn);
}

Expand Down
13 changes: 13 additions & 0 deletions llvm/test/Transforms/Attributor/callgraph.ll
Original file line number Diff line number Diff line change
Expand Up @@ -459,6 +459,19 @@ define i32 @non_matching_unknown(i1 %c, ptr %fn) {
ret i32 %call
}

; This function is used in a "direct" call but with a different signature.
; We check that it does not show up above in any of the if-cascades because
; the address is not actually taken.
declare void @usedOnlyInCastedDirectCall(i32)
define void @usedOnlyInCastedDirectCallCaller() {
; CHECK-LABEL: @usedOnlyInCastedDirectCallCaller(
; CHECK-NEXT: call void @usedOnlyInCastedDirectCall()
; CHECK-NEXT: ret void
;
call void @usedOnlyInCastedDirectCall()
ret void
}

define void @broker(ptr %unknown) !callback !0 {
; OWRDL-LABEL: @broker(
; OWRDL-NEXT: call void [[UNKNOWN:%.*]]()
Expand Down

0 comments on commit 209496b

Please sign in to comment.