diff options
author | Vitaly Buka <vitalybuka@google.com> | 2020-06-01 00:26:29 -0700 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2020-06-03 01:16:39 -0700 |
commit | d3b7f90d00fc23f5e5576e28fe4290b5f1dd0a9d (patch) | |
tree | 77b16e6215670ab1f1e280f23e89cabf8b7c903b /llvm/lib/Analysis/StackSafetyAnalysis.cpp | |
parent | e128f01be996f5f9a0e0cf5565d8a0696783b85d (diff) | |
download | llvm-d3b7f90d00fc23f5e5576e28fe4290b5f1dd0a9d.zip llvm-d3b7f90d00fc23f5e5576e28fe4290b5f1dd0a9d.tar.gz llvm-d3b7f90d00fc23f5e5576e28fe4290b5f1dd0a9d.tar.bz2 |
[StackSafety] Skip non-pointer parameters
Summary: Depends on D80908.
Reviewers: eugenis, pcc
Reviewed By: eugenis
Subscribers: hiraditya, steven_wu, dexonsmith, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D80956
Diffstat (limited to 'llvm/lib/Analysis/StackSafetyAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/StackSafetyAnalysis.cpp | 66 |
1 files changed, 31 insertions, 35 deletions
diff --git a/llvm/lib/Analysis/StackSafetyAnalysis.cpp b/llvm/lib/Analysis/StackSafetyAnalysis.cpp index 0c00701..b48550c 100644 --- a/llvm/lib/Analysis/StackSafetyAnalysis.cpp +++ b/llvm/lib/Analysis/StackSafetyAnalysis.cpp @@ -21,6 +21,7 @@ #include "llvm/InitializePasses.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> #include <memory> @@ -141,7 +142,7 @@ ConstantRange getStaticAllocaSizeRange(const AllocaInst &AI) { struct FunctionInfo { std::map<const AllocaInst *, UseInfo> Allocas; - SmallVector<UseInfo, 4> Params; + std::map<uint32_t, UseInfo> Params; // TODO: describe return value as depending on one or more of its arguments. // StackSafetyDataFlowAnalysis counter stored here for faster access. @@ -154,13 +155,13 @@ struct FunctionInfo { << ((F && F->isInterposable()) ? " interposable" : "") << "\n"; O << " args uses:\n"; - size_t Pos = 0; - for (auto &P : Params) { - StringRef Name = "<N/A>"; + for (auto &KV : Params) { + O << " "; if (F) - Name = F->getArg(Pos)->getName(); - O << " " << Name << "[]: " << P << "\n"; - ++Pos; + O << F->getArg(KV.first)->getName(); + else + O << formatv("arg{0}", KV.first); + O << "[]: " << KV.second << "\n"; } O << " allocas uses:\n"; @@ -389,15 +390,16 @@ FunctionInfo StackSafetyLocalAnalysis::run() { for (auto &I : instructions(F)) { if (auto *AI = dyn_cast<AllocaInst>(&I)) { - UseInfo &AS = Info.Allocas.emplace(AI, PointerSize).first->second; - analyzeAllUses(AI, AS); + auto &UI = Info.Allocas.emplace(AI, PointerSize).first->second; + analyzeAllUses(AI, UI); } } for (Argument &A : make_range(F.arg_begin(), F.arg_end())) { - Info.Params.emplace_back(PointerSize); - UseInfo &PS = Info.Params.back(); - analyzeAllUses(&A, PS); + if (A.getType()->isPointerTy()) { + auto &UI = Info.Params.emplace(A.getArgNo(), PointerSize).first->second; + analyzeAllUses(&A, UI); + } } LLVM_DEBUG(Info.print(dbgs(), F.getName(), &F)); @@ -415,7 +417,6 @@ class StackSafetyDataFlowAnalysis { DenseMap<const GlobalValue *, SmallVector<const GlobalValue *, 4>> Callers; SetVector<const GlobalValue *> WorkList; - bool updateOneUse(UseInfo &US, bool UpdateToFullSet); void updateOneNode(const GlobalValue *Callee, FunctionInfo &FS); void updateOneNode(const GlobalValue *Callee) { @@ -445,17 +446,18 @@ public: ConstantRange StackSafetyDataFlowAnalysis::getArgumentAccessRange( const GlobalValue *Callee, unsigned ParamNo, const ConstantRange &Offsets) const { - auto IT = Functions.find(Callee); + auto FnIt = Functions.find(Callee); // Unknown callee (outside of LTO domain or an indirect call). - if (IT == Functions.end()) + if (FnIt == Functions.end()) return UnknownRange; - const FunctionInfo &FS = IT->second; - if (ParamNo >= FS.Params.size()) // possibly vararg + auto &FS = FnIt->second; + auto ParamIt = FS.Params.find(ParamNo); + if (ParamIt == FS.Params.end()) return UnknownRange; - auto &Access = FS.Params[ParamNo].Range; + auto &Access = ParamIt->second.Range; if (Access.isEmptySet()) return Access; - if (Access.isFullSet() || Offsets.isFullSet()) + if (Access.isFullSet()) return UnknownRange; if (Offsets.signedAddMayOverflow(Access) != ConstantRange::OverflowResult::NeverOverflows) @@ -487,8 +489,8 @@ void StackSafetyDataFlowAnalysis::updateOneNode(const GlobalValue *Callee, FunctionInfo &FS) { bool UpdateToFullSet = FS.UpdateCount > StackSafetyMaxIterations; bool Changed = false; - for (auto &PS : FS.Params) - Changed |= updateOneUse(PS, UpdateToFullSet); + for (auto &KV : FS.Params) + Changed |= updateOneUse(KV.second, UpdateToFullSet); if (Changed) { LLVM_DEBUG(dbgs() << "=== update [" << FS.UpdateCount @@ -509,9 +511,8 @@ void StackSafetyDataFlowAnalysis::runDataFlow() { SmallVector<const GlobalValue *, 16> Callees; for (auto &F : Functions) { Callees.clear(); - FunctionInfo &FS = F.second; - for (auto &PS : FS.Params) - for (auto &CS : PS.Calls) + for (auto &KV : F.second.Params) + for (auto &CS : KV.second.Calls) Callees.push_back(CS.Callee); llvm::sort(Callees); @@ -574,11 +575,6 @@ void resolveAllCalls(UseInfo &Use) { } } -void resolveAllCalls(SmallVectorImpl<UseInfo> &Values) { - for (auto &V : Values) - resolveAllCalls(V); -} - GVToSSI createGlobalStackSafetyInfo( std::map<const GlobalValue *, FunctionInfo> Functions) { GVToSSI SSI; @@ -588,8 +584,9 @@ GVToSSI createGlobalStackSafetyInfo( // FIXME: Simplify printing and remove copying here. auto Copy = Functions; - for (auto &FI : Copy) - resolveAllCalls(FI.second.Params); + for (auto &FnKV : Copy) + for (auto &KV : FnKV.second.Params) + resolveAllCalls(KV.second); uint32_t PointerSize = Copy.begin() ->first->getParent() @@ -610,10 +607,9 @@ GVToSSI createGlobalStackSafetyInfo( // FIXME: This is needed only to preserve calls in print() results. A.Calls = SrcF.Allocas.find(KV.first)->second.Calls; } - size_t Pos = 0; - for (auto &P : FI.Params) { - P.Calls = SrcF.Params[Pos].Calls; - ++Pos; + for (auto &KV : FI.Params) { + auto &P = KV.second; + P.Calls = SrcF.Params.find(KV.first)->second.Calls; } SSI[F.first] = std::move(FI); } |