FindUsedTypes.h revision 081c34b725980f995be9080eaec24cd3dfaaf065
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 17f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner#include "llvm/Pass.h" 18f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner#include <set> 19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 21d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 22facd752d3afaeca7dee46648f2a2ae209a94e5e9Chris Lattnerclass Type; 23d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohmanclass Value; 24f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner 25b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattnerclass FindUsedTypes : public ModulePass { 26697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner std::set<const 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 /// 365d549083e2dc55cc1aa035f1069480d052717061Chris Lattner const std::set<const 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 /// 4245cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner void print(raw_ostream &o, const Module *M) const; 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 /// 48f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner void IncorporateType(const 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 56b12914bfc0f76a7a48357162d5f4c39a1343e69bChris Lattner bool runOnModule(Module &M); 57f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner 5847b6f84736197b5ece84860e6cb6052ebc60c646Chris Lattner /// getAnalysisUsage - We do not modify anything. 59f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattner virtual void getAnalysisUsage(AnalysisUsage &AU) const { 60f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattner AU.setPreservesAll(); 61f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattner } 62f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner}; 63f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner 64d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 65d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 66f26e28711bcc10536036e0c10c931a8ca28b778cChris Lattner#endif 67