diff options
author | Mikael Holmen <mikael.holmen@ericsson.com> | 2017-11-15 07:46:48 +0000 |
---|---|---|
committer | Mikael Holmen <mikael.holmen@ericsson.com> | 2017-11-15 07:46:48 +0000 |
commit | 6e60297ee6ba465197db443f8eaa88315ba36ac4 (patch) | |
tree | e2d8cb4e63415979e39deb2f3ad71e07d6357001 /llvm/lib/Analysis/Lint.cpp | |
parent | 16a91cee6c85ddbcfe9840a89456c97df8700387 (diff) | |
download | bcm5719-llvm-6e60297ee6ba465197db443f8eaa88315ba36ac4.tar.gz bcm5719-llvm-6e60297ee6ba465197db443f8eaa88315ba36ac4.zip |
[Lint] Don't warn about passing alloca'd value to tail call if using byval
Summary:
This fixes PR35241.
When using byval, the data is effectively copied as part of the call
anyway, so the pointer returned by the alloca will not be leaked to the
callee and thus there is no reason to issue a warning.
Reviewers: rnk
Reviewed By: rnk
Subscribers: Ka-Ka, llvm-commits
Differential Revision: https://reviews.llvm.org/D40009
llvm-svn: 318279
Diffstat (limited to 'llvm/lib/Analysis/Lint.cpp')
-rw-r--r-- | llvm/lib/Analysis/Lint.cpp | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/Lint.cpp b/llvm/lib/Analysis/Lint.cpp index ae92f502f5c..7b792ed0a2e 100644 --- a/llvm/lib/Analysis/Lint.cpp +++ b/llvm/lib/Analysis/Lint.cpp @@ -285,15 +285,24 @@ void Lint::visitCallSite(CallSite CS) { } } - if (CS.isCall() && cast<CallInst>(CS.getInstruction())->isTailCall()) - for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end(); - AI != AE; ++AI) { - Value *Obj = findValue(*AI, /*OffsetOk=*/true); - Assert(!isa<AllocaInst>(Obj), - "Undefined behavior: Call with \"tail\" keyword references " - "alloca", - &I); + if (CS.isCall()) { + const CallInst *CI = cast<CallInst>(CS.getInstruction()); + if (CI->isTailCall()) { + const AttributeList &PAL = CI->getAttributes(); + unsigned ArgNo = 0; + for (Value *Arg : CS.args()) { + // Skip ByVal arguments since they will be memcpy'd to the callee's + // stack anyway. + if (PAL.hasParamAttribute(ArgNo++, Attribute::ByVal)) + continue; + Value *Obj = findValue(Arg, /*OffsetOk=*/true); + Assert(!isa<AllocaInst>(Obj), + "Undefined behavior: Call with \"tail\" keyword references " + "alloca", + &I); + } } + } if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I)) |