summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/Lint.cpp
diff options
context:
space:
mode:
authorMikael Holmen <mikael.holmen@ericsson.com>2017-11-15 07:46:48 +0000
committerMikael Holmen <mikael.holmen@ericsson.com>2017-11-15 07:46:48 +0000
commit6e60297ee6ba465197db443f8eaa88315ba36ac4 (patch)
treee2d8cb4e63415979e39deb2f3ad71e07d6357001 /llvm/lib/Analysis/Lint.cpp
parent16a91cee6c85ddbcfe9840a89456c97df8700387 (diff)
downloadbcm5719-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.cpp25
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))
OpenPOWER on IntegriCloud