LLVM 23.0.0git
StackSafetyAnalysis.h
Go to the documentation of this file.
1//===- StackSafetyAnalysis.h - Stack memory safety analysis -----*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Stack Safety Analysis detects allocas and arguments with safe access.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_ANALYSIS_STACKSAFETYANALYSIS_H
14#define LLVM_ANALYSIS_STACKSAFETYANALYSIS_H
15
17#include "llvm/IR/PassManager.h"
18#include "llvm/Pass.h"
19
20namespace llvm {
21
22class AllocaInst;
23class ScalarEvolution;
24
25/// Interface to access stack safety analysis results for single function.
27public:
28 struct InfoTy;
29
30private:
31 Function *F = nullptr;
32 std::function<ScalarEvolution &()> GetSE;
33 mutable std::unique_ptr<InfoTy> Info;
34
35public:
37 StackSafetyInfo(Function *F, std::function<ScalarEvolution &()> GetSE);
41
42 const InfoTy &getInfo() const;
43
44 // TODO: Add useful for client methods.
45 void print(raw_ostream &O) const;
46
47 /// Parameters use for a FunctionSummary.
48 /// Function collects access information of all pointer parameters.
49 /// Information includes a range of direct access of parameters by the
50 /// functions and all call sites accepting the parameter.
51 /// StackSafety assumes that missing parameter information means possibility
52 /// of access to the parameter with any offset, so we can correctly link
53 /// code without StackSafety information, e.g. non-ThinLTO.
54 std::vector<FunctionSummary::ParamAccess>
56};
57
59public:
60 struct InfoTy;
61
62private:
63 Module *M = nullptr;
64 std::function<const StackSafetyInfo &(Function &F)> GetSSI;
65 const ModuleSummaryIndex *Index = nullptr;
66 mutable std::unique_ptr<InfoTy> Info;
67 const InfoTy &getInfo() const;
68
69public:
72 Module *M, std::function<const StackSafetyInfo &(Function &F)> GetSSI,
73 const ModuleSummaryIndex *Index);
77
78 // Whether we can prove that all accesses to this Alloca are in-range and
79 // during its lifetime.
80 bool isSafe(const AllocaInst &AI) const;
81
82 // Returns true if the instruction can be proven to do only two types of
83 // memory accesses:
84 // (1) live stack locations in-bounds or
85 // (2) non-stack locations.
86 bool stackAccessIsSafe(const Instruction &I) const;
87 void print(raw_ostream &O) const;
88 void dump() const;
89};
90
91/// StackSafetyInfo wrapper for the new pass manager.
92class StackSafetyAnalysis : public AnalysisInfoMixin<StackSafetyAnalysis> {
94 static AnalysisKey Key;
95
96public:
99};
100
101/// Printer pass for the \c StackSafetyAnalysis results.
103 : public RequiredPassInfoMixin<StackSafetyPrinterPass> {
104 raw_ostream &OS;
105
106public:
107 explicit StackSafetyPrinterPass(raw_ostream &OS) : OS(OS) {}
109};
110
111/// StackSafetyInfo wrapper for the legacy pass manager
113 StackSafetyInfo SSI;
114
115public:
116 static char ID;
118
119 const StackSafetyInfo &getResult() const { return SSI; }
120
121 void print(raw_ostream &O, const Module *M) const override;
122 void getAnalysisUsage(AnalysisUsage &AU) const override;
123
124 bool runOnFunction(Function &F) override;
125};
126
127/// This pass performs the global (interprocedural) stack safety analysis (new
128/// pass manager).
130 : public AnalysisInfoMixin<StackSafetyGlobalAnalysis> {
132 static AnalysisKey Key;
133
134public:
137};
138
139/// Printer pass for the \c StackSafetyGlobalAnalysis results.
141 : public RequiredPassInfoMixin<StackSafetyGlobalPrinterPass> {
142 raw_ostream &OS;
143
144public:
147};
148
149/// This pass performs the global (interprocedural) stack safety analysis
150/// (legacy pass manager).
153
154public:
155 static char ID;
156
159
160 const StackSafetyGlobalInfo &getResult() const { return SSGI; }
161
162 void print(raw_ostream &O, const Module *M) const override;
163 void getAnalysisUsage(AnalysisUsage &AU) const override;
164
165 bool runOnModule(Module &M) override;
166};
167
168bool needsParamAccessSummary(const Module &M);
169
170void generateParamAccessSummary(ModuleSummaryIndex &Index);
171
172} // end namespace llvm
173
174#endif // LLVM_ANALYSIS_STACKSAFETYANALYSIS_H
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Machine Check Debug Module
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
an instruction to allocate memory on the stack
Represent the analysis usage information of a pass.
FunctionPass(char &pid)
Definition Pass.h:316
ModulePass(char &pid)
Definition Pass.h:257
Class to hold module path string table and global value map, and encapsulate methods for operating on...
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
The main scalar evolution driver.
StackSafetyInfo wrapper for the new pass manager.
StackSafetyInfo run(Function &F, FunctionAnalysisManager &AM)
This pass performs the global (interprocedural) stack safety analysis (new pass manager).
Result run(Module &M, ModuleAnalysisManager &AM)
bool runOnModule(Module &M) override
runOnModule - Virtual method overriden by subclasses to process the module being operated on.
const StackSafetyGlobalInfo & getResult() const
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
void print(raw_ostream &O, const Module *M) const override
print - Print out the internal state of the pass.
StackSafetyGlobalInfo(StackSafetyGlobalInfo &&)
void print(raw_ostream &O) const
bool stackAccessIsSafe(const Instruction &I) const
bool isSafe(const AllocaInst &AI) const
StackSafetyGlobalInfo & operator=(StackSafetyGlobalInfo &&)
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
void print(raw_ostream &O, const Module *M) const override
print - Print out the internal state of the pass.
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
const StackSafetyInfo & getResult() const
Interface to access stack safety analysis results for single function.
void print(raw_ostream &O) const
const InfoTy & getInfo() const
StackSafetyInfo(StackSafetyInfo &&)
StackSafetyInfo & operator=(StackSafetyInfo &&)
std::vector< FunctionSummary::ParamAccess > getParamAccesses(ModuleSummaryIndex &Index) const
Parameters use for a FunctionSummary.
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
This is an optimization pass for GlobalISel generic memory operations.
void generateParamAccessSummary(ModuleSummaryIndex &Index)
bool needsParamAccessSummary(const Module &M)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
Definition MIRParser.h:39
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
A CRTP mix-in for passes that should not be skipped.