123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- #ifndef LLVM_PASS_H
- #define LLVM_PASS_H
- #include <string>
- namespace llvm {
- class AnalysisResolver;
- class AnalysisUsage;
- class Function;
- class ImmutablePass;
- class Module;
- class PassInfo;
- class PMDataManager;
- class PMStack;
- class raw_ostream;
- class StringRef;
- using AnalysisID = const void *;
- enum PassManagerType {
- PMT_Unknown = 0,
- PMT_ModulePassManager = 1,
- PMT_CallGraphPassManager,
- PMT_FunctionPassManager,
- PMT_LoopPassManager,
- PMT_RegionPassManager,
- PMT_Last
- };
- enum PassKind {
- PT_Region,
- PT_Loop,
- PT_Function,
- PT_CallGraphSCC,
- PT_Module,
- PT_PassManager
- };
- enum class ThinOrFullLTOPhase {
-
- None,
-
- ThinLTOPreLink,
-
- ThinLTOPostLink,
-
- FullLTOPreLink,
-
- FullLTOPostLink
- };
- class Pass {
- AnalysisResolver *Resolver = nullptr;
- const void *PassID;
- PassKind Kind;
- public:
- explicit Pass(PassKind K, char &pid) : PassID(&pid), Kind(K) {}
- Pass(const Pass &) = delete;
- Pass &operator=(const Pass &) = delete;
- virtual ~Pass();
- PassKind getPassKind() const { return Kind; }
-
-
-
- virtual StringRef getPassName() const;
-
- AnalysisID getPassID() const {
- return PassID;
- }
-
-
- virtual bool doInitialization(Module &) { return false; }
-
-
- virtual bool doFinalization(Module &) { return false; }
-
-
-
-
-
-
- virtual void print(raw_ostream &OS, const Module *M) const;
- void dump() const;
-
-
- virtual Pass *createPrinterPass(raw_ostream &OS,
- const std::string &Banner) const = 0;
-
-
- virtual void assignPassManager(PMStack &,
- PassManagerType) {}
-
- virtual void preparePassManager(PMStack &);
-
- virtual PassManagerType getPotentialPassManagerType() const;
-
- void setResolver(AnalysisResolver *AR);
- AnalysisResolver *getResolver() const { return Resolver; }
-
-
-
-
- virtual void getAnalysisUsage(AnalysisUsage &) const;
-
-
-
-
-
-
-
-
-
-
- virtual void releaseMemory();
-
-
-
-
- virtual void *getAdjustedAnalysisPointer(AnalysisID ID);
- virtual ImmutablePass *getAsImmutablePass();
- virtual PMDataManager *getAsPMDataManager();
-
-
- virtual void verifyAnalysis() const;
-
- virtual void dumpPassStructure(unsigned Offset = 0);
-
-
- static const PassInfo *lookupPassInfo(const void *TI);
-
-
- static const PassInfo *lookupPassInfo(StringRef Arg);
-
-
- static Pass *createPass(AnalysisID ID);
-
-
-
-
-
-
-
- template<typename AnalysisType> AnalysisType *
- getAnalysisIfAvailable() const;
-
-
-
-
-
- bool mustPreserveAnalysisID(char &AID) const;
-
-
-
- template<typename AnalysisType>
- AnalysisType &getAnalysis() const;
- template <typename AnalysisType>
- AnalysisType &
- getAnalysis(Function &F,
- bool *Changed = nullptr);
- template<typename AnalysisType>
- AnalysisType &getAnalysisID(AnalysisID PI) const;
- template <typename AnalysisType>
- AnalysisType &getAnalysisID(AnalysisID PI, Function &F,
- bool *Changed = nullptr);
- #ifdef EXPENSIVE_CHECKS
-
-
- uint64_t structuralHash(Module &M) const;
-
-
- virtual uint64_t structuralHash(Function &F) const;
- #endif
- };
- class ModulePass : public Pass {
- public:
- explicit ModulePass(char &pid) : Pass(PT_Module, pid) {}
-
- ~ModulePass() override;
-
- Pass *createPrinterPass(raw_ostream &OS,
- const std::string &Banner) const override;
-
-
- virtual bool runOnModule(Module &M) = 0;
- void assignPassManager(PMStack &PMS, PassManagerType T) override;
-
- PassManagerType getPotentialPassManagerType() const override;
- protected:
-
-
- bool skipModule(Module &M) const;
- };
- class ImmutablePass : public ModulePass {
- public:
- explicit ImmutablePass(char &pid) : ModulePass(pid) {}
-
- ~ImmutablePass() override;
-
-
-
-
-
- virtual void initializePass();
- ImmutablePass *getAsImmutablePass() override { return this; }
-
- bool runOnModule(Module &) override { return false; }
- };
- class FunctionPass : public Pass {
- public:
- explicit FunctionPass(char &pid) : Pass(PT_Function, pid) {}
-
- Pass *createPrinterPass(raw_ostream &OS,
- const std::string &Banner) const override;
-
-
- virtual bool runOnFunction(Function &F) = 0;
- void assignPassManager(PMStack &PMS, PassManagerType T) override;
-
- PassManagerType getPotentialPassManagerType() const override;
- protected:
-
-
-
- bool skipFunction(const Function &F) const;
- };
- extern bool TimePassesIsEnabled;
- extern bool TimePassesPerRun;
- }
- #include "llvm/PassAnalysisSupport.h"
- #include "llvm/PassSupport.h"
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|