| 10 | namespace ftg { |
| 11 | |
| 12 | class ArrayAnalyzer : public ArgFlowAnalyzer { |
| 13 | |
| 14 | public: |
| 15 | ArrayAnalyzer(IndCallSolverMgr *Solver, |
| 16 | std::vector<const llvm::Function *> Funcs, |
| 17 | llvm::FunctionAnalysisManager &FAM, |
| 18 | const ArrayAnalysisReport *PreReport = nullptr); |
| 19 | |
| 20 | std::unique_ptr<AnalyzerReport> getReport() override; |
| 21 | const ArrayAnalysisReport &result() const; |
| 22 | |
| 23 | private: |
| 24 | llvm::FunctionAnalysisManager &FAM; |
| 25 | std::unique_ptr<ArrayAnalysisReport> Report; |
| 26 | |
| 27 | void analyzeProperty(llvm::Argument &A) override; |
| 28 | void analyzeArray(llvm::Argument &A); |
| 29 | void analyzeArrayLen(llvm::Instruction &I, ArgFlow &AF); |
| 30 | llvm::Value *getTrackingVariable(llvm::Loop &L); |
| 31 | llvm::Value *getRelatedIndV(llvm::Loop &L, llvm::ScalarEvolution &SEA); |
| 32 | void handleStackFrame(StackFrame &Frame, std::stack<StackFrame> &DefUseChains, |
| 33 | std::set<llvm::Value *> &VisitedNodes); |
| 34 | void handleUser(StackFrame &Frame, llvm::Value &User, |
| 35 | std::stack<StackFrame> &DefUseChains, |
| 36 | std::set<llvm::Value *> &VisitedNodes); |
| 37 | bool updateArgFlow(llvm::Argument &A); |
| 38 | void updateFieldFlow(ArgFlow &AF, std::vector<int> Indices = {}); |
| 39 | void updateDefault(const llvm::Module &M); |
| 40 | void updateDefault(const llvm::Function &F, |
| 41 | const std::map<unsigned, int> &Values); |
| 42 | }; |
| 43 | |
| 44 | } // namespace ftg |
| 45 |
nothing calls this directly
no outgoing calls
no test coverage detected