148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===- llvm/Analysis/FindUsedTypes.h - Find all Types in use ----*- C++ -*-===//
29769ab22265b313171d201b5928688524a01bd87Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
79769ab22265b313171d201b5928688524a01bd87Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner//
10f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner// This pass is used to seek out all of the types in use by the program.
11f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner//
12f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner//===----------------------------------------------------------------------===//
13f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner
14f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner#ifndef LLVM_ANALYSIS_FINDUSEDTYPES_H
15f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner#define LLVM_ANALYSIS_FINDUSEDTYPES_H
16f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner
17eea6c95d5d9f202ccb4e90995dc8a4a4c439cec3Julien Lerouge#include "llvm/ADT/SetVector.h"
18f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner#include "llvm/Pass.h"
19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
22facd752d3afaeca7dee46648f2a2ae209a94e5e9Chris Lattnerclass Type;
23d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohmanclass Value;
24f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner
25b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattnerclass FindUsedTypes : public ModulePass {
26db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  SetVector<Type *> UsedTypes;
27f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattnerpublic:
28ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky  static char ID; // Pass identification, replacement for typeid
29081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  FindUsedTypes() : ModulePass(ID) {
30081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    initializeFindUsedTypesPass(*PassRegistry::getPassRegistry());
31081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  }
32794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel
3347b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// getTypes - After the pass has been run, return the set containing all of
3447b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// the types used in the module.
3547b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  ///
36db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  const SetVector<Type *> &getTypes() const { return UsedTypes; }
37f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner
3847b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// Print the types found in the module.  If the optional Module parameter is
3947b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// passed in, then the types are printed symbolically if possible, using the
4047b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// symbol table from the module.
4147b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  ///
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void print(raw_ostream &o, const Module *M) const override;
43f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner
44f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattnerprivate:
4547b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// IncorporateType - Incorporate one type and all of its subtypes into the
4647b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// collection of used types.
4747b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  ///
48db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  void IncorporateType(Type *Ty);
49f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner
50a3a1c2de9de8d02a53fbbe7d260aef630ec97dd0Chris Lattner  /// IncorporateValue - Incorporate all of the types used by this value.
51a3a1c2de9de8d02a53fbbe7d260aef630ec97dd0Chris Lattner  ///
52a3a1c2de9de8d02a53fbbe7d260aef630ec97dd0Chris Lattner  void IncorporateValue(const Value *V);
53a3a1c2de9de8d02a53fbbe7d260aef630ec97dd0Chris Lattner
54fe700e7e4240fa88b8d5f44d1e7d6dcc51495c26Chris Lattnerpublic:
5547b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// run - This incorporates all types used by the specified module
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool runOnModule(Module &M) override;
57f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner
5847b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner  /// getAnalysisUsage - We do not modify anything.
5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void getAnalysisUsage(AnalysisUsage &AU) const override {
60f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattner    AU.setPreservesAll();
61f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattner  }
62f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner};
63f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner
64d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
65d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
66f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner#endif
67