[llvm] 12cd4a5 - [NFC,StackSafety] Add StackSafetyGlobalInfo class
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Wed May 27 20:08:00 PDT 2020
Author: Vitaly Buka
Date: 2020-05-27T20:07:12-07:00
New Revision: 12cd4a51640f5e025043c45a004df66b678ffa9d
URL: https://github.com/llvm/llvm-project/commit/12cd4a51640f5e025043c45a004df66b678ffa9d
DIFF: https://github.com/llvm/llvm-project/commit/12cd4a51640f5e025043c45a004df66b678ffa9d.diff
LOG: [NFC,StackSafety] Add StackSafetyGlobalInfo class
Added:
Modified:
llvm/include/llvm/Analysis/StackSafetyAnalysis.h
llvm/lib/Analysis/StackSafetyAnalysis.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/StackSafetyAnalysis.h b/llvm/include/llvm/Analysis/StackSafetyAnalysis.h
index 33a4b2c149c3..df7ccac5b4b9 100644
--- a/llvm/include/llvm/Analysis/StackSafetyAnalysis.h
+++ b/llvm/include/llvm/Analysis/StackSafetyAnalysis.h
@@ -18,6 +18,8 @@
namespace llvm {
+class AllocaInst;
+
/// Interface to access stack safety analysis results for single function.
class StackSafetyInfo {
public:
@@ -38,6 +40,22 @@ class StackSafetyInfo {
void print(raw_ostream &O, const GlobalValue &F) const;
};
+class StackSafetyGlobalInfo {
+public:
+ using GVToSSI = std::map<const GlobalValue *, StackSafetyInfo>;
+
+private:
+ GVToSSI SSGI;
+
+public:
+ StackSafetyGlobalInfo() = default;
+ StackSafetyGlobalInfo(GVToSSI SSGI) : SSGI(std::move(SSGI)) {}
+
+ bool setMetadata(Module &M) const;
+ void print(raw_ostream &O) const;
+ void dump() const;
+};
+
/// StackSafetyInfo wrapper for the new pass manager.
class StackSafetyAnalysis : public AnalysisInfoMixin<StackSafetyAnalysis> {
friend AnalysisInfoMixin<StackSafetyAnalysis>;
@@ -74,8 +92,6 @@ class StackSafetyInfoWrapperPass : public FunctionPass {
bool runOnFunction(Function &F) override;
};
-using StackSafetyGlobalInfo = std::map<const GlobalValue *, StackSafetyInfo>;
-
/// This pass performs the global (interprocedural) stack safety analysis (new
/// pass manager).
class StackSafetyGlobalAnalysis
diff --git a/llvm/lib/Analysis/StackSafetyAnalysis.cpp b/llvm/lib/Analysis/StackSafetyAnalysis.cpp
index d33efa5d1d04..6eeffe6066df 100644
--- a/llvm/lib/Analysis/StackSafetyAnalysis.cpp
+++ b/llvm/lib/Analysis/StackSafetyAnalysis.cpp
@@ -33,6 +33,8 @@ static cl::opt<int> StackSafetyMaxIterations("stack-safety-max-iterations",
namespace {
+using GVToSSI = StackSafetyGlobalInfo::GVToSSI;
+
/// Rewrite an SCEV expression for a memory access address to an expression that
/// represents offset from the given alloca.
class AllocaOffsetRewriter : public SCEVRewriteVisitor<AllocaOffsetRewriter> {
@@ -457,7 +459,7 @@ class StackSafetyDataFlowAnalysis {
public:
StackSafetyDataFlowAnalysis(
Module &M, std::function<const FunctionInfo &(Function &)> FI);
- StackSafetyGlobalInfo run();
+ GVToSSI run();
};
StackSafetyDataFlowAnalysis::StackSafetyDataFlowAnalysis(
@@ -571,19 +573,18 @@ void StackSafetyDataFlowAnalysis::verifyFixedPoint() {
}
#endif
-StackSafetyGlobalInfo StackSafetyDataFlowAnalysis::run() {
+GVToSSI StackSafetyDataFlowAnalysis::run() {
runDataFlow();
LLVM_DEBUG(verifyFixedPoint());
- StackSafetyGlobalInfo SSI;
+ GVToSSI SSI;
for (auto &F : Functions)
SSI.emplace(F.first, makeSSI(F.second));
return SSI;
}
-bool setStackSafetyMetadata(Module &M, const StackSafetyGlobalInfo &SSGI) {
+bool setStackSafetyMetadata(Module &M, const GVToSSI &SSGI) {
bool Changed = false;
- unsigned Width = M.getDataLayout().getPointerSizeInBits();
for (auto &F : M.functions()) {
if (F.isDeclaration() || F.hasOptNone())
continue;
@@ -621,23 +622,28 @@ void StackSafetyInfo::print(raw_ostream &O, const GlobalValue &F) const {
Info->Info.print(O, F.getName(), dyn_cast<Function>(&F));
}
-static void print(const StackSafetyGlobalInfo &SSI, raw_ostream &O,
- const Module &M) {
- size_t Count = 0;
- for (auto &F : M.functions())
+bool StackSafetyGlobalInfo::setMetadata(Module &M) const {
+ return setStackSafetyMetadata(M, SSGI);
+}
+
+void StackSafetyGlobalInfo::print(raw_ostream &O) const {
+ if (SSGI.empty())
+ return;
+ const Module &M = *SSGI.begin()->first->getParent();
+ for (auto &F : M.functions()) {
if (!F.isDeclaration()) {
- SSI.find(&F)->second.print(O, F);
+ SSGI.find(&F)->second.print(O, F);
O << "\n";
- ++Count;
}
+ }
for (auto &A : M.aliases()) {
- SSI.find(&A)->second.print(O, A);
+ SSGI.find(&A)->second.print(O, A);
O << "\n";
- ++Count;
}
- assert(Count == SSI.size() && "Unexpected functions in the result");
}
+LLVM_DUMP_METHOD void StackSafetyGlobalInfo::dump() const { print(dbgs()); }
+
AnalysisKey StackSafetyAnalysis::Key;
StackSafetyInfo StackSafetyAnalysis::run(Function &F,
@@ -693,14 +699,14 @@ StackSafetyGlobalAnalysis::run(Module &M, ModuleAnalysisManager &AM) {
PreservedAnalyses StackSafetyGlobalPrinterPass::run(Module &M,
ModuleAnalysisManager &AM) {
OS << "'Stack Safety Analysis' for module '" << M.getName() << "'\n";
- print(AM.getResult<StackSafetyGlobalAnalysis>(M), OS, M);
+ AM.getResult<StackSafetyGlobalAnalysis>(M).print(OS);
return PreservedAnalyses::all();
}
PreservedAnalyses
StackSafetyGlobalAnnotatorPass::run(Module &M, ModuleAnalysisManager &AM) {
auto &SSGI = AM.getResult<StackSafetyGlobalAnalysis>(M);
- (void)setStackSafetyMetadata(M, SSGI);
+ SSGI.setMetadata(M);
return PreservedAnalyses::all();
}
@@ -715,7 +721,7 @@ StackSafetyGlobalInfoWrapperPass::StackSafetyGlobalInfoWrapperPass(
void StackSafetyGlobalInfoWrapperPass::print(raw_ostream &O,
const Module *M) const {
- ::print(SSGI, O, *M);
+ SSGI.print(O);
}
void StackSafetyGlobalInfoWrapperPass::getAnalysisUsage(
@@ -732,7 +738,7 @@ bool StackSafetyGlobalInfoWrapperPass::runOnModule(Module &M) {
.Info;
});
SSGI = SSDFA.run();
- return SetMetadata ? setStackSafetyMetadata(M, SSGI) : false;
+ return SetMetadata ? SSGI.setMetadata(M) : false;
}
ModulePass *llvm::createStackSafetyGlobalInfoWrapperPass(bool SetMetadata) {
More information about the llvm-commits
mailing list