13e58d9bb320f247740672aeb3129c4755d02b599Chris Lattner//===- Pass.cpp - LLVM Pass Infrastructure Implementation -----------------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner// 10d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner// This file implements the LLVM Pass infrastructure. It is primarily 11d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner// responsible with ensuring that passes are executed and batched together 12d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner// optimally. 13d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner// 14d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner//===----------------------------------------------------------------------===// 15d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner 16ee335e35acf20d1ed5b781546d647c19b608890eDan Gohman#include "llvm/Pass.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Function.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/LegacyPassNameParser.h" 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/PassRegistry.h" 21840d41e7d15937f139ccbf5300abab1729ea16d0David Greene#include "llvm/Support/Debug.h" 2245cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattner#include "llvm/Support/raw_ostream.h" 2331f8499e83dc4dccbb57ea7e76d1fd49b7010d0cChris Lattnerusing namespace llvm; 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "ir" 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2727ad137d5ef5bb08f95c388e825b02e9c074b667Chris Lattner//===----------------------------------------------------------------------===// 2841300863c5e73edd0228e2486c01a46eb2a153e0Chris Lattner// Pass Implementation 2941300863c5e73edd0228e2486c01a46eb2a153e0Chris Lattner// 30e21206268d267b8eaa416e21ac8e12353cf6bda9Chris Lattner 31c7d0f4be88cc7fa33d51736e0f53d3e00e69efb4Devang Patel// Force out-of-line virtual method. 328247e0dca6759d9a22ac4c5cf305fac052b285acAndrew TrickPass::~Pass() { 338247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick delete Resolver; 346e21ff0b0a8e4f0878431afa5628bb1c2db0b8e1Devang Patel} 356e21ff0b0a8e4f0878431afa5628bb1c2db0b8e1Devang Patel 366e21ff0b0a8e4f0878431afa5628bb1c2db0b8e1Devang Patel// Force out-of-line virtual method. 37c7d0f4be88cc7fa33d51736e0f53d3e00e69efb4Devang PatelModulePass::~ModulePass() { } 38d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner 395c8aa950fe3484b6e115647328c196f8be64f9edDavid GreenePass *ModulePass::createPrinterPass(raw_ostream &O, 405c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene const std::string &Banner) const { 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return createPrintModulePass(O, Banner); 425c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene} 435c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene 44eda23faedb436777ea8b1183f743d8add6b79170Dan GohmanPassManagerType ModulePass::getPotentialPassManagerType() const { 45eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman return PMT_ModulePassManager; 46eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 47eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 4890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Andersonbool Pass::mustPreserveAnalysisID(char &AID) const { 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Resolver->getAnalysisIfAvailable(&AID, true) != nullptr; 50f1ab454b71efae1a5cee7f9285d91b75ead6a8a7Chris Lattner} 51f1ab454b71efae1a5cee7f9285d91b75ead6a8a7Chris Lattner 5262faf772781cf5c3bd6806a7887147e35713dd40Joe Abbey// dumpPassStructure - Implement the -debug-pass=Structure option 538a757aeac436ecd27e28a39b10032fd6fda33780Dan Gohmanvoid Pass::dumpPassStructure(unsigned Offset) { 54840d41e7d15937f139ccbf5300abab1729ea16d0David Greene dbgs().indent(Offset*2) << getPassName() << "\n"; 5537d66c4dea6330d0a5441f82b12b9b8add1e3684Chris Lattner} 5696c466b06ab0c830b07329c1b16037f585ccbe40Chris Lattner 57b973d5f9b59f75854493bc37a9eb0f3032be0864Dan Gohman/// getPassName - Return a nice clean name for a pass. This usually 58b973d5f9b59f75854493bc37a9eb0f3032be0864Dan Gohman/// implemented in terms of the name that is registered by one of the 59b973d5f9b59f75854493bc37a9eb0f3032be0864Dan Gohman/// Registration templates, but can be overloaded directly. 60b973d5f9b59f75854493bc37a9eb0f3032be0864Dan Gohman/// 6144050fb25a37a72ba74da9b0c8b41973325a7995Chris Lattnerconst char *Pass::getPassName() const { 6290c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson AnalysisID AID = getPassID(); 6390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(AID); 6490c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson if (PI) 6544050fb25a37a72ba74da9b0c8b41973325a7995Chris Lattner return PI->getPassName(); 66fe3e3f44380f906b7ffff6574afcf35459a012a6Chris Lattner return "Unnamed pass: implement Pass::getPassName()"; 6744050fb25a37a72ba74da9b0c8b41973325a7995Chris Lattner} 6896c466b06ab0c830b07329c1b16037f585ccbe40Chris Lattner 69eda23faedb436777ea8b1183f743d8add6b79170Dan Gohmanvoid Pass::preparePassManager(PMStack &) { 70eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman // By default, don't do anything. 71eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 72eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 73eda23faedb436777ea8b1183f743d8add6b79170Dan GohmanPassManagerType Pass::getPotentialPassManagerType() const { 74eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman // Default implementation. 758247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick return PMT_Unknown; 76eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 77eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 78eda23faedb436777ea8b1183f743d8add6b79170Dan Gohmanvoid Pass::getAnalysisUsage(AnalysisUsage &) const { 79eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman // By default, no analysis results are used, all are invalidated. 80eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 81eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 82eda23faedb436777ea8b1183f743d8add6b79170Dan Gohmanvoid Pass::releaseMemory() { 83eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman // By default, don't do anything. 84eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 85eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 86eda23faedb436777ea8b1183f743d8add6b79170Dan Gohmanvoid Pass::verifyAnalysis() const { 87eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman // By default, don't do anything. 88eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 89eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 9090c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Andersonvoid *Pass::getAdjustedAnalysisPointer(AnalysisID AID) { 91e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman return this; 92e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman} 93e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman 94e407c1d1583cfc788fa7d00fee5f612c3f224983Dan GohmanImmutablePass *Pass::getAsImmutablePass() { 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 96e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman} 97e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman 98e407c1d1583cfc788fa7d00fee5f612c3f224983Dan GohmanPMDataManager *Pass::getAsPMDataManager() { 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 100e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman} 101e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman 102e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohmanvoid Pass::setResolver(AnalysisResolver *AR) { 103e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman assert(!Resolver && "Resolver is already set"); 104e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman Resolver = AR; 105e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman} 106e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman 10769c856aa6d42c2bf25730c04c24988658ec3ae24Misha Brukman// print - Print out the internal state of the pass. This is called by Analyze 1085560c9d49ccae132cabf1155f18aa0480dce3edaMisha Brukman// to print out the contents of an analysis. Otherwise it is not necessary to 109a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner// implement this method. 110a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner// 11145cfe545ec8177262dabc70580ce05feaa1c3880Chris Lattnervoid Pass::print(raw_ostream &O,const Module*) const { 112a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner O << "Pass::print not implemented for pass: '" << getPassName() << "'!\n"; 113a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner} 114a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner 115832171cb9724d2d31c8dfb73172e2be8f6dd13eeBill Wendling// dump - call print(cerr); 116a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattnervoid Pass::dump() const { 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines print(dbgs(), nullptr); 118a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner} 119a59cbb2043c08f3cfb8fb379f0d336e21e070be8Chris Lattner 12041300863c5e73edd0228e2486c01a46eb2a153e0Chris Lattner//===----------------------------------------------------------------------===// 12170b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner// ImmutablePass Implementation 12270b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner// 123c7d0f4be88cc7fa33d51736e0f53d3e00e69efb4Devang Patel// Force out-of-line virtual method. 124c7d0f4be88cc7fa33d51736e0f53d3e00e69efb4Devang PatelImmutablePass::~ImmutablePass() { } 12570b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner 126eda23faedb436777ea8b1183f743d8add6b79170Dan Gohmanvoid ImmutablePass::initializePass() { 127eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman // By default, don't do anything. 128eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 129eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 13070b4f3e05106761e99cc56919767155cad0e2d3aChris Lattner//===----------------------------------------------------------------------===// 131f57b845547302d24ecb6a9e79d7bc386f761a6c9Chris Lattner// FunctionPass Implementation 13241300863c5e73edd0228e2486c01a46eb2a153e0Chris Lattner// 13335f07eb2ebf7d3a9e1a95470770b29e1b45b2cb1Chris Lattner 1345c8aa950fe3484b6e115647328c196f8be64f9edDavid GreenePass *FunctionPass::createPrinterPass(raw_ostream &O, 1355c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene const std::string &Banner) const { 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return createPrintFunctionPass(O, Banner); 1375c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene} 1385c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene 139eda23faedb436777ea8b1183f743d8add6b79170Dan GohmanPassManagerType FunctionPass::getPotentialPassManagerType() const { 140eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman return PMT_FunctionPassManager; 141eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 142eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool FunctionPass::skipOptnoneFunction(const Function &F) const { 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (F.hasFnAttribute(Attribute::OptimizeNone)) { 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DEBUG(dbgs() << "Skipping pass '" << getPassName() 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << "' on function " << F.getName() << "\n"); 14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15241300863c5e73edd0228e2486c01a46eb2a153e0Chris Lattner//===----------------------------------------------------------------------===// 15341300863c5e73edd0228e2486c01a46eb2a153e0Chris Lattner// BasicBlockPass Implementation 15441300863c5e73edd0228e2486c01a46eb2a153e0Chris Lattner// 155d695328461a483767edbf2a7819d98f1f6b507ccChris Lattner 1565c8aa950fe3484b6e115647328c196f8be64f9edDavid GreenePass *BasicBlockPass::createPrinterPass(raw_ostream &O, 1575c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene const std::string &Banner) const { 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return createPrintBasicBlockPass(O, Banner); 1595c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene} 1605c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene 161eda23faedb436777ea8b1183f743d8add6b79170Dan Gohmanbool BasicBlockPass::doInitialization(Function &) { 162eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman // By default, don't do anything. 163eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman return false; 164eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 165eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 166eda23faedb436777ea8b1183f743d8add6b79170Dan Gohmanbool BasicBlockPass::doFinalization(Function &) { 167eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman // By default, don't do anything. 168eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman return false; 169eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 170eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool BasicBlockPass::skipOptnoneFunction(const BasicBlock &BB) const { 17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const Function *F = BB.getParent(); 17336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (F && F->hasFnAttribute(Attribute::OptimizeNone)) { 17436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Report this only once per function. 17536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (&BB == &F->getEntryBlock()) 17636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DEBUG(dbgs() << "Skipping pass '" << getPassName() 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines << "' on function " << F->getName() << "\n"); 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return true; 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 183eda23faedb436777ea8b1183f743d8add6b79170Dan GohmanPassManagerType BasicBlockPass::getPotentialPassManagerType() const { 1848247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick return PMT_BasicBlockPassManager; 185eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman} 186eda23faedb436777ea8b1183f743d8add6b79170Dan Gohman 18790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Andersonconst PassInfo *Pass::lookupPassInfo(const void *TI) { 188aac07eaeef0b29690f18061abc148a2608cd77deOwen Anderson return PassRegistry::getPassRegistry()->getPassInfo(TI); 18954bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner} 19054bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner 1918be3291f5942e3ae4a5d66c480e7aabe2f771031Owen Andersonconst PassInfo *Pass::lookupPassInfo(StringRef Arg) { 192aac07eaeef0b29690f18061abc148a2608cd77deOwen Anderson return PassRegistry::getPassRegistry()->getPassInfo(Arg); 1938a261e44f71a433b7d9af373c3e3dfa6fea67146Dan Gohman} 1948a261e44f71a433b7d9af373c3e3dfa6fea67146Dan Gohman 1955e108eeeef34dd2afa00d1da77bca47188de4244Andrew TrickPass *Pass::createPass(AnalysisID ID) { 1965e108eeeef34dd2afa00d1da77bca47188de4244Andrew Trick const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(ID); 197ebe18ef5c286bb7c33f6c43f1963a7d22cd73f40Andrew Trick if (!PI) 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 199ebe18ef5c286bb7c33f6c43f1963a7d22cd73f40Andrew Trick return PI->createPass(); 200ebe18ef5c286bb7c33f6c43f1963a7d22cd73f40Andrew Trick} 201ebe18ef5c286bb7c33f6c43f1963a7d22cd73f40Andrew Trick 202789bc8426249c3427e7caa7ba7c3ace4400ab2b0Chris Lattner//===----------------------------------------------------------------------===// 203789bc8426249c3427e7caa7ba7c3ace4400ab2b0Chris Lattner// Analysis Group Implementation Code 204789bc8426249c3427e7caa7ba7c3ace4400ab2b0Chris Lattner//===----------------------------------------------------------------------===// 205789bc8426249c3427e7caa7ba7c3ace4400ab2b0Chris Lattner 206789bc8426249c3427e7caa7ba7c3ace4400ab2b0Chris Lattner// RegisterAGBase implementation 207789bc8426249c3427e7caa7ba7c3ace4400ab2b0Chris Lattner// 20890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen AndersonRegisterAGBase::RegisterAGBase(const char *Name, const void *InterfaceID, 20990c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson const void *PassID, bool isDefault) 2109650983b9a30804d3479aeffb2a7f8bdb6b33942Owen Anderson : PassInfo(Name, InterfaceID) { 2119650983b9a30804d3479aeffb2a7f8bdb6b33942Owen Anderson PassRegistry::getPassRegistry()->registerAnalysisGroup(InterfaceID, PassID, 2129650983b9a30804d3479aeffb2a7f8bdb6b33942Owen Anderson *this, isDefault); 213789bc8426249c3427e7caa7ba7c3ace4400ab2b0Chris Lattner} 214789bc8426249c3427e7caa7ba7c3ace4400ab2b0Chris Lattner 21554bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner//===----------------------------------------------------------------------===// 21654bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner// PassRegistrationListener implementation 21754bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner// 21854bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner 21954bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner// enumeratePasses - Iterate over the registered passes, calling the 22054bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner// passEnumerate callback on each PassInfo object. 22154bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner// 22254bbdb46777455fd2386dfcdacc555ca76098151Chris Lattnervoid PassRegistrationListener::enumeratePasses() { 223aac07eaeef0b29690f18061abc148a2608cd77deOwen Anderson PassRegistry::getPassRegistry()->enumerateWith(this); 22454bbdb46777455fd2386dfcdacc555ca76098151Chris Lattner} 225e8f38486394f3a897e3637b559ade420dddbe1e3Reid Spencer 226cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesPassNameParser::PassNameParser() 227cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : Opt(nullptr) { 228cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines PassRegistry::getPassRegistry()->addRegistrationListener(this); 229cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 230cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 231cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesPassNameParser::~PassNameParser() { 232cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // This only gets called during static destruction, in which case the 233cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // PassRegistry will have already been destroyed by llvm_shutdown(). So 234cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // attempting to remove the registration listener is an error. 235cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 2366eeb7345f215217aca4a60098eb1f968c76f700cChris Lattner 237947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner//===----------------------------------------------------------------------===// 238947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// AnalysisUsage Class Implementation 239947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// 240947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner 241baf2ecda5fc2b94b0f40bd8780ebaf71410ca2e5Chris Lattnernamespace { 242baf2ecda5fc2b94b0f40bd8780ebaf71410ca2e5Chris Lattner struct GetCFGOnlyPasses : public PassRegistrationListener { 243fc65d38085e92fa3901104c762a725788f5c9de5Chris Lattner typedef AnalysisUsage::VectorType VectorType; 244fc65d38085e92fa3901104c762a725788f5c9de5Chris Lattner VectorType &CFGOnlyList; 245fc65d38085e92fa3901104c762a725788f5c9de5Chris Lattner GetCFGOnlyPasses(VectorType &L) : CFGOnlyList(L) {} 2468247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick 24736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void passEnumerate(const PassInfo *P) override { 248baf2ecda5fc2b94b0f40bd8780ebaf71410ca2e5Chris Lattner if (P->isCFGOnlyPass()) 24990c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson CFGOnlyList.push_back(P->getTypeInfo()); 250baf2ecda5fc2b94b0f40bd8780ebaf71410ca2e5Chris Lattner } 251baf2ecda5fc2b94b0f40bd8780ebaf71410ca2e5Chris Lattner }; 252baf2ecda5fc2b94b0f40bd8780ebaf71410ca2e5Chris Lattner} 253baf2ecda5fc2b94b0f40bd8780ebaf71410ca2e5Chris Lattner 25494c22716d60ff5edf6a98a3c67e0faa001be1142Sylvestre Ledru// setPreservesCFG - This function should be called to by the pass, iff they do 255947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// not: 256947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// 257947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// 1. Add or remove basic blocks from the function 258947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// 2. Modify terminator instructions in any way. 259947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// 260947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// This function annotates the AnalysisUsage info object to say that analyses 261947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// that only depend on the CFG are preserved by this pass. 262947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner// 263947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattnervoid AnalysisUsage::setPreservesCFG() { 264947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner // Since this transformation doesn't modify the CFG, it preserves all analyses 265947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner // that only depend on the CFG (like dominators, loop info, etc...) 266baf2ecda5fc2b94b0f40bd8780ebaf71410ca2e5Chris Lattner GetCFGOnlyPasses(Preserved).enumeratePasses(); 267947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner} 268947c7689fc0435c7bb69b62f61ff40e266e87f0cChris Lattner 26990c579de5a383cee278acc3f7e7b9d0a656e6a35Owen AndersonAnalysisUsage &AnalysisUsage::addPreserved(StringRef Arg) { 27090c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson const PassInfo *PI = Pass::lookupPassInfo(Arg); 27190c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson // If the pass exists, preserve it. Otherwise silently do nothing. 27290c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson if (PI) Preserved.push_back(PI->getTypeInfo()); 2739ccaf53ada99c63737547c0235baeb8454b04e80Owen Anderson return *this; 2749ccaf53ada99c63737547c0235baeb8454b04e80Owen Anderson} 2759ccaf53ada99c63737547c0235baeb8454b04e80Owen Anderson 27690c579de5a383cee278acc3f7e7b9d0a656e6a35Owen AndersonAnalysisUsage &AnalysisUsage::addRequiredID(const void *ID) { 2771f74590e9d1b9cf0f1f81a156efea73f76546e05Owen Anderson Required.push_back(ID); 27890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson return *this; 27990c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson} 28090c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson 28190c579de5a383cee278acc3f7e7b9d0a656e6a35Owen AndersonAnalysisUsage &AnalysisUsage::addRequiredID(char &ID) { 28290c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson Required.push_back(&ID); 28390c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson return *this; 28490c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson} 28590c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson 28690c579de5a383cee278acc3f7e7b9d0a656e6a35Owen AndersonAnalysisUsage &AnalysisUsage::addRequiredTransitiveID(char &ID) { 28790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson Required.push_back(&ID); 28890c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson RequiredTransitive.push_back(&ID); 289e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman return *this; 290e407c1d1583cfc788fa7d00fee5f612c3f224983Dan Gohman} 291