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