File indexing completed on 2026-05-10 08:43:13
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_ANALYSIS_GLOBALSMODREF_H
0014 #define LLVM_ANALYSIS_GLOBALSMODREF_H
0015
0016 #include "llvm/Analysis/AliasAnalysis.h"
0017 #include "llvm/IR/PassManager.h"
0018 #include "llvm/IR/ValueHandle.h"
0019 #include "llvm/Pass.h"
0020 #include <list>
0021
0022 namespace llvm {
0023 class CallGraph;
0024 class Function;
0025
0026
0027
0028
0029
0030 class GlobalsAAResult : public AAResultBase {
0031 class FunctionInfo;
0032
0033 const DataLayout &DL;
0034 std::function<const TargetLibraryInfo &(Function &F)> GetTLI;
0035
0036
0037 SmallPtrSet<const GlobalValue *, 8> NonAddressTakenGlobals;
0038
0039
0040 bool UnknownFunctionsWithLocalLinkage = false;
0041
0042
0043
0044 SmallPtrSet<const GlobalValue *, 8> IndirectGlobals;
0045
0046
0047
0048 DenseMap<const Value *, const GlobalValue *> AllocsForIndirectGlobals;
0049
0050
0051 DenseMap<const Function *, FunctionInfo> FunctionInfos;
0052
0053
0054
0055
0056 DenseMap<const Function *, unsigned> FunctionToSCCMap;
0057
0058
0059 struct DeletionCallbackHandle final : CallbackVH {
0060 GlobalsAAResult *GAR;
0061 std::list<DeletionCallbackHandle>::iterator I;
0062
0063 DeletionCallbackHandle(GlobalsAAResult &GAR, Value *V)
0064 : CallbackVH(V), GAR(&GAR) {}
0065
0066 void deleted() override;
0067 };
0068
0069
0070
0071
0072
0073 std::list<DeletionCallbackHandle> Handles;
0074
0075 explicit GlobalsAAResult(
0076 const DataLayout &DL,
0077 std::function<const TargetLibraryInfo &(Function &F)> GetTLI);
0078
0079 friend struct RecomputeGlobalsAAPass;
0080
0081 public:
0082 GlobalsAAResult(GlobalsAAResult &&Arg);
0083 ~GlobalsAAResult();
0084
0085 bool invalidate(Module &M, const PreservedAnalyses &PA,
0086 ModuleAnalysisManager::Invalidator &);
0087
0088 static GlobalsAAResult
0089 analyzeModule(Module &M,
0090 std::function<const TargetLibraryInfo &(Function &F)> GetTLI,
0091 CallGraph &CG);
0092
0093
0094
0095
0096 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB,
0097 AAQueryInfo &AAQI, const Instruction *CtxI);
0098
0099 using AAResultBase::getModRefInfo;
0100 ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc,
0101 AAQueryInfo &AAQI);
0102
0103 using AAResultBase::getMemoryEffects;
0104
0105
0106
0107 MemoryEffects getMemoryEffects(const Function *F);
0108
0109 private:
0110 FunctionInfo *getFunctionInfo(const Function *F);
0111
0112 void AnalyzeGlobals(Module &M);
0113 void AnalyzeCallGraph(CallGraph &CG, Module &M);
0114 bool AnalyzeUsesOfPointer(Value *V,
0115 SmallPtrSetImpl<Function *> *Readers = nullptr,
0116 SmallPtrSetImpl<Function *> *Writers = nullptr,
0117 GlobalValue *OkayStoreDest = nullptr);
0118 bool AnalyzeIndirectGlobalMemory(GlobalVariable *GV);
0119 void CollectSCCMembership(CallGraph &CG);
0120
0121 bool isNonEscapingGlobalNoAlias(const GlobalValue *GV, const Value *V);
0122 ModRefInfo getModRefInfoForArgument(const CallBase *Call,
0123 const GlobalValue *GV, AAQueryInfo &AAQI);
0124 };
0125
0126
0127 class GlobalsAA : public AnalysisInfoMixin<GlobalsAA> {
0128 friend AnalysisInfoMixin<GlobalsAA>;
0129 static AnalysisKey Key;
0130
0131 public:
0132 typedef GlobalsAAResult Result;
0133
0134 GlobalsAAResult run(Module &M, ModuleAnalysisManager &AM);
0135 };
0136
0137 struct RecomputeGlobalsAAPass : PassInfoMixin<RecomputeGlobalsAAPass> {
0138 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
0139 };
0140
0141
0142 class GlobalsAAWrapperPass : public ModulePass {
0143 std::unique_ptr<GlobalsAAResult> Result;
0144
0145 public:
0146 static char ID;
0147
0148 GlobalsAAWrapperPass();
0149
0150 GlobalsAAResult &getResult() { return *Result; }
0151 const GlobalsAAResult &getResult() const { return *Result; }
0152
0153 bool runOnModule(Module &M) override;
0154 bool doFinalization(Module &M) override;
0155 void getAnalysisUsage(AnalysisUsage &AU) const override;
0156 };
0157
0158
0159
0160
0161
0162
0163 ModulePass *createGlobalsAAWrapperPass();
0164 }
0165
0166 #endif