Method.h no longer includes BasicBlock.h
[oota-llvm.git] / include / llvm / Analysis / FindUsedTypes.h
1 //===- llvm/Analysis/FindUsedTypes.h - Find all Types in use -----*- C++ -*--=//
2 //
3 // This pass is used to seek out all of the types in use by the program.
4 //
5 //===----------------------------------------------------------------------===//
6
7 #ifndef LLVM_ANALYSIS_FINDUSEDTYPES_H
8 #define LLVM_ANALYSIS_FINDUSEDTYPES_H
9
10 #include "llvm/Pass.h"
11 #include <set>
12 class SymbolTable;
13 class Type;
14
15 class FindUsedTypes : public Pass {
16   std::set<const Type *> UsedTypes;
17
18   bool IncludeSymbolTables;
19 public:
20   // FindUsedTypes ctor - This pass can optionally include types that are
21   // referenced only in symbol tables, but the default is not to.
22   //
23   static AnalysisID ID;
24   static AnalysisID IncludeSymbolTableID;
25
26   FindUsedTypes(AnalysisID id) : IncludeSymbolTables(id != ID) {}
27
28   // getTypes - After the pass has been run, return the set containing all of
29   // the types used in the module.
30   //
31   inline const std::set<const Type *> &getTypes() const { return UsedTypes; }
32
33   // Print the types found in the module.  If the optional Module parameter is
34   // passed in, then the types are printed symbolically if possible, using the
35   // symbol table from the module.
36   //
37   void printTypes(std::ostream &o, const Module *M = 0) const;
38
39 private:
40   // IncorporateType - Incorporate one type and all of its subtypes into the
41   // collection of used types.
42   //
43   void IncorporateType(const Type *Ty);
44
45   // IncorporateSymbolTable - Add all types referenced by the specified symtab
46   // into the collection of used types.
47   //
48   void IncorporateSymbolTable(const SymbolTable *ST);
49
50 public:
51   // run - This incorporates all types used by the specified module
52   //
53   bool run(Module *M);
54
55   // getAnalysisUsageInfo - This function needs FindUsedTypes to do its job...
56   //
57   virtual void getAnalysisUsageInfo(Pass::AnalysisSet &Required,
58                                     Pass::AnalysisSet &Destroyed,
59                                     Pass::AnalysisSet &Provided);
60 };
61
62 #endif