1*9880d681SAndroid Build Coastguard Worker //===- Pass.cpp - LLVM Pass Infrastructure Implementation -----------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the LLVM Pass infrastructure. It is primarily
11*9880d681SAndroid Build Coastguard Worker // responsible with ensuring that passes are executed and batched together
12*9880d681SAndroid Build Coastguard Worker // optimally.
13*9880d681SAndroid Build Coastguard Worker //
14*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker #include "llvm/Pass.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IRPrintingPasses.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassNameParser.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/OptBisect.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/PassRegistry.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
25*9880d681SAndroid Build Coastguard Worker using namespace llvm;
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "ir"
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
30*9880d681SAndroid Build Coastguard Worker // Pass Implementation
31*9880d681SAndroid Build Coastguard Worker //
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker // Force out-of-line virtual method.
~Pass()34*9880d681SAndroid Build Coastguard Worker Pass::~Pass() {
35*9880d681SAndroid Build Coastguard Worker delete Resolver;
36*9880d681SAndroid Build Coastguard Worker }
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker // Force out-of-line virtual method.
~ModulePass()39*9880d681SAndroid Build Coastguard Worker ModulePass::~ModulePass() { }
40*9880d681SAndroid Build Coastguard Worker
createPrinterPass(raw_ostream & O,const std::string & Banner) const41*9880d681SAndroid Build Coastguard Worker Pass *ModulePass::createPrinterPass(raw_ostream &O,
42*9880d681SAndroid Build Coastguard Worker const std::string &Banner) const {
43*9880d681SAndroid Build Coastguard Worker return createPrintModulePass(O, Banner);
44*9880d681SAndroid Build Coastguard Worker }
45*9880d681SAndroid Build Coastguard Worker
getPotentialPassManagerType() const46*9880d681SAndroid Build Coastguard Worker PassManagerType ModulePass::getPotentialPassManagerType() const {
47*9880d681SAndroid Build Coastguard Worker return PMT_ModulePassManager;
48*9880d681SAndroid Build Coastguard Worker }
49*9880d681SAndroid Build Coastguard Worker
skipModule(Module & M) const50*9880d681SAndroid Build Coastguard Worker bool ModulePass::skipModule(Module &M) const {
51*9880d681SAndroid Build Coastguard Worker return !M.getContext().getOptBisect().shouldRunPass(this, M);
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker
mustPreserveAnalysisID(char & AID) const54*9880d681SAndroid Build Coastguard Worker bool Pass::mustPreserveAnalysisID(char &AID) const {
55*9880d681SAndroid Build Coastguard Worker return Resolver->getAnalysisIfAvailable(&AID, true) != nullptr;
56*9880d681SAndroid Build Coastguard Worker }
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker // dumpPassStructure - Implement the -debug-pass=Structure option
dumpPassStructure(unsigned Offset)59*9880d681SAndroid Build Coastguard Worker void Pass::dumpPassStructure(unsigned Offset) {
60*9880d681SAndroid Build Coastguard Worker dbgs().indent(Offset*2) << getPassName() << "\n";
61*9880d681SAndroid Build Coastguard Worker }
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker /// getPassName - Return a nice clean name for a pass. This usually
64*9880d681SAndroid Build Coastguard Worker /// implemented in terms of the name that is registered by one of the
65*9880d681SAndroid Build Coastguard Worker /// Registration templates, but can be overloaded directly.
66*9880d681SAndroid Build Coastguard Worker ///
getPassName() const67*9880d681SAndroid Build Coastguard Worker const char *Pass::getPassName() const {
68*9880d681SAndroid Build Coastguard Worker AnalysisID AID = getPassID();
69*9880d681SAndroid Build Coastguard Worker const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(AID);
70*9880d681SAndroid Build Coastguard Worker if (PI)
71*9880d681SAndroid Build Coastguard Worker return PI->getPassName();
72*9880d681SAndroid Build Coastguard Worker return "Unnamed pass: implement Pass::getPassName()";
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker
preparePassManager(PMStack &)75*9880d681SAndroid Build Coastguard Worker void Pass::preparePassManager(PMStack &) {
76*9880d681SAndroid Build Coastguard Worker // By default, don't do anything.
77*9880d681SAndroid Build Coastguard Worker }
78*9880d681SAndroid Build Coastguard Worker
getPotentialPassManagerType() const79*9880d681SAndroid Build Coastguard Worker PassManagerType Pass::getPotentialPassManagerType() const {
80*9880d681SAndroid Build Coastguard Worker // Default implementation.
81*9880d681SAndroid Build Coastguard Worker return PMT_Unknown;
82*9880d681SAndroid Build Coastguard Worker }
83*9880d681SAndroid Build Coastguard Worker
getAnalysisUsage(AnalysisUsage &) const84*9880d681SAndroid Build Coastguard Worker void Pass::getAnalysisUsage(AnalysisUsage &) const {
85*9880d681SAndroid Build Coastguard Worker // By default, no analysis results are used, all are invalidated.
86*9880d681SAndroid Build Coastguard Worker }
87*9880d681SAndroid Build Coastguard Worker
releaseMemory()88*9880d681SAndroid Build Coastguard Worker void Pass::releaseMemory() {
89*9880d681SAndroid Build Coastguard Worker // By default, don't do anything.
90*9880d681SAndroid Build Coastguard Worker }
91*9880d681SAndroid Build Coastguard Worker
verifyAnalysis() const92*9880d681SAndroid Build Coastguard Worker void Pass::verifyAnalysis() const {
93*9880d681SAndroid Build Coastguard Worker // By default, don't do anything.
94*9880d681SAndroid Build Coastguard Worker }
95*9880d681SAndroid Build Coastguard Worker
getAdjustedAnalysisPointer(AnalysisID AID)96*9880d681SAndroid Build Coastguard Worker void *Pass::getAdjustedAnalysisPointer(AnalysisID AID) {
97*9880d681SAndroid Build Coastguard Worker return this;
98*9880d681SAndroid Build Coastguard Worker }
99*9880d681SAndroid Build Coastguard Worker
getAsImmutablePass()100*9880d681SAndroid Build Coastguard Worker ImmutablePass *Pass::getAsImmutablePass() {
101*9880d681SAndroid Build Coastguard Worker return nullptr;
102*9880d681SAndroid Build Coastguard Worker }
103*9880d681SAndroid Build Coastguard Worker
getAsPMDataManager()104*9880d681SAndroid Build Coastguard Worker PMDataManager *Pass::getAsPMDataManager() {
105*9880d681SAndroid Build Coastguard Worker return nullptr;
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker
setResolver(AnalysisResolver * AR)108*9880d681SAndroid Build Coastguard Worker void Pass::setResolver(AnalysisResolver *AR) {
109*9880d681SAndroid Build Coastguard Worker assert(!Resolver && "Resolver is already set");
110*9880d681SAndroid Build Coastguard Worker Resolver = AR;
111*9880d681SAndroid Build Coastguard Worker }
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker // print - Print out the internal state of the pass. This is called by Analyze
114*9880d681SAndroid Build Coastguard Worker // to print out the contents of an analysis. Otherwise it is not necessary to
115*9880d681SAndroid Build Coastguard Worker // implement this method.
116*9880d681SAndroid Build Coastguard Worker //
print(raw_ostream & O,const Module *) const117*9880d681SAndroid Build Coastguard Worker void Pass::print(raw_ostream &O,const Module*) const {
118*9880d681SAndroid Build Coastguard Worker O << "Pass::print not implemented for pass: '" << getPassName() << "'!\n";
119*9880d681SAndroid Build Coastguard Worker }
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker // dump - call print(cerr);
dump() const122*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD void Pass::dump() const {
123*9880d681SAndroid Build Coastguard Worker print(dbgs(), nullptr);
124*9880d681SAndroid Build Coastguard Worker }
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
127*9880d681SAndroid Build Coastguard Worker // ImmutablePass Implementation
128*9880d681SAndroid Build Coastguard Worker //
129*9880d681SAndroid Build Coastguard Worker // Force out-of-line virtual method.
~ImmutablePass()130*9880d681SAndroid Build Coastguard Worker ImmutablePass::~ImmutablePass() { }
131*9880d681SAndroid Build Coastguard Worker
initializePass()132*9880d681SAndroid Build Coastguard Worker void ImmutablePass::initializePass() {
133*9880d681SAndroid Build Coastguard Worker // By default, don't do anything.
134*9880d681SAndroid Build Coastguard Worker }
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
137*9880d681SAndroid Build Coastguard Worker // FunctionPass Implementation
138*9880d681SAndroid Build Coastguard Worker //
139*9880d681SAndroid Build Coastguard Worker
createPrinterPass(raw_ostream & O,const std::string & Banner) const140*9880d681SAndroid Build Coastguard Worker Pass *FunctionPass::createPrinterPass(raw_ostream &O,
141*9880d681SAndroid Build Coastguard Worker const std::string &Banner) const {
142*9880d681SAndroid Build Coastguard Worker return createPrintFunctionPass(O, Banner);
143*9880d681SAndroid Build Coastguard Worker }
144*9880d681SAndroid Build Coastguard Worker
getPotentialPassManagerType() const145*9880d681SAndroid Build Coastguard Worker PassManagerType FunctionPass::getPotentialPassManagerType() const {
146*9880d681SAndroid Build Coastguard Worker return PMT_FunctionPassManager;
147*9880d681SAndroid Build Coastguard Worker }
148*9880d681SAndroid Build Coastguard Worker
skipFunction(const Function & F) const149*9880d681SAndroid Build Coastguard Worker bool FunctionPass::skipFunction(const Function &F) const {
150*9880d681SAndroid Build Coastguard Worker if (!F.getContext().getOptBisect().shouldRunPass(this, F))
151*9880d681SAndroid Build Coastguard Worker return true;
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker if (F.hasFnAttribute(Attribute::OptimizeNone)) {
154*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Skipping pass '" << getPassName() << "' on function "
155*9880d681SAndroid Build Coastguard Worker << F.getName() << "\n");
156*9880d681SAndroid Build Coastguard Worker return true;
157*9880d681SAndroid Build Coastguard Worker }
158*9880d681SAndroid Build Coastguard Worker return false;
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
162*9880d681SAndroid Build Coastguard Worker // BasicBlockPass Implementation
163*9880d681SAndroid Build Coastguard Worker //
164*9880d681SAndroid Build Coastguard Worker
createPrinterPass(raw_ostream & O,const std::string & Banner) const165*9880d681SAndroid Build Coastguard Worker Pass *BasicBlockPass::createPrinterPass(raw_ostream &O,
166*9880d681SAndroid Build Coastguard Worker const std::string &Banner) const {
167*9880d681SAndroid Build Coastguard Worker return createPrintBasicBlockPass(O, Banner);
168*9880d681SAndroid Build Coastguard Worker }
169*9880d681SAndroid Build Coastguard Worker
doInitialization(Function &)170*9880d681SAndroid Build Coastguard Worker bool BasicBlockPass::doInitialization(Function &) {
171*9880d681SAndroid Build Coastguard Worker // By default, don't do anything.
172*9880d681SAndroid Build Coastguard Worker return false;
173*9880d681SAndroid Build Coastguard Worker }
174*9880d681SAndroid Build Coastguard Worker
doFinalization(Function &)175*9880d681SAndroid Build Coastguard Worker bool BasicBlockPass::doFinalization(Function &) {
176*9880d681SAndroid Build Coastguard Worker // By default, don't do anything.
177*9880d681SAndroid Build Coastguard Worker return false;
178*9880d681SAndroid Build Coastguard Worker }
179*9880d681SAndroid Build Coastguard Worker
skipBasicBlock(const BasicBlock & BB) const180*9880d681SAndroid Build Coastguard Worker bool BasicBlockPass::skipBasicBlock(const BasicBlock &BB) const {
181*9880d681SAndroid Build Coastguard Worker const Function *F = BB.getParent();
182*9880d681SAndroid Build Coastguard Worker if (!F)
183*9880d681SAndroid Build Coastguard Worker return false;
184*9880d681SAndroid Build Coastguard Worker if (!F->getContext().getOptBisect().shouldRunPass(this, BB))
185*9880d681SAndroid Build Coastguard Worker return true;
186*9880d681SAndroid Build Coastguard Worker if (F->hasFnAttribute(Attribute::OptimizeNone)) {
187*9880d681SAndroid Build Coastguard Worker // Report this only once per function.
188*9880d681SAndroid Build Coastguard Worker if (&BB == &F->getEntryBlock())
189*9880d681SAndroid Build Coastguard Worker DEBUG(dbgs() << "Skipping pass '" << getPassName()
190*9880d681SAndroid Build Coastguard Worker << "' on function " << F->getName() << "\n");
191*9880d681SAndroid Build Coastguard Worker return true;
192*9880d681SAndroid Build Coastguard Worker }
193*9880d681SAndroid Build Coastguard Worker return false;
194*9880d681SAndroid Build Coastguard Worker }
195*9880d681SAndroid Build Coastguard Worker
getPotentialPassManagerType() const196*9880d681SAndroid Build Coastguard Worker PassManagerType BasicBlockPass::getPotentialPassManagerType() const {
197*9880d681SAndroid Build Coastguard Worker return PMT_BasicBlockPassManager;
198*9880d681SAndroid Build Coastguard Worker }
199*9880d681SAndroid Build Coastguard Worker
lookupPassInfo(const void * TI)200*9880d681SAndroid Build Coastguard Worker const PassInfo *Pass::lookupPassInfo(const void *TI) {
201*9880d681SAndroid Build Coastguard Worker return PassRegistry::getPassRegistry()->getPassInfo(TI);
202*9880d681SAndroid Build Coastguard Worker }
203*9880d681SAndroid Build Coastguard Worker
lookupPassInfo(StringRef Arg)204*9880d681SAndroid Build Coastguard Worker const PassInfo *Pass::lookupPassInfo(StringRef Arg) {
205*9880d681SAndroid Build Coastguard Worker return PassRegistry::getPassRegistry()->getPassInfo(Arg);
206*9880d681SAndroid Build Coastguard Worker }
207*9880d681SAndroid Build Coastguard Worker
createPass(AnalysisID ID)208*9880d681SAndroid Build Coastguard Worker Pass *Pass::createPass(AnalysisID ID) {
209*9880d681SAndroid Build Coastguard Worker const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(ID);
210*9880d681SAndroid Build Coastguard Worker if (!PI)
211*9880d681SAndroid Build Coastguard Worker return nullptr;
212*9880d681SAndroid Build Coastguard Worker return PI->createPass();
213*9880d681SAndroid Build Coastguard Worker }
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
216*9880d681SAndroid Build Coastguard Worker // Analysis Group Implementation Code
217*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker // RegisterAGBase implementation
220*9880d681SAndroid Build Coastguard Worker //
RegisterAGBase(const char * Name,const void * InterfaceID,const void * PassID,bool isDefault)221*9880d681SAndroid Build Coastguard Worker RegisterAGBase::RegisterAGBase(const char *Name, const void *InterfaceID,
222*9880d681SAndroid Build Coastguard Worker const void *PassID, bool isDefault)
223*9880d681SAndroid Build Coastguard Worker : PassInfo(Name, InterfaceID) {
224*9880d681SAndroid Build Coastguard Worker PassRegistry::getPassRegistry()->registerAnalysisGroup(InterfaceID, PassID,
225*9880d681SAndroid Build Coastguard Worker *this, isDefault);
226*9880d681SAndroid Build Coastguard Worker }
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
229*9880d681SAndroid Build Coastguard Worker // PassRegistrationListener implementation
230*9880d681SAndroid Build Coastguard Worker //
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker // enumeratePasses - Iterate over the registered passes, calling the
233*9880d681SAndroid Build Coastguard Worker // passEnumerate callback on each PassInfo object.
234*9880d681SAndroid Build Coastguard Worker //
enumeratePasses()235*9880d681SAndroid Build Coastguard Worker void PassRegistrationListener::enumeratePasses() {
236*9880d681SAndroid Build Coastguard Worker PassRegistry::getPassRegistry()->enumerateWith(this);
237*9880d681SAndroid Build Coastguard Worker }
238*9880d681SAndroid Build Coastguard Worker
PassNameParser(cl::Option & O)239*9880d681SAndroid Build Coastguard Worker PassNameParser::PassNameParser(cl::Option &O)
240*9880d681SAndroid Build Coastguard Worker : cl::parser<const PassInfo *>(O) {
241*9880d681SAndroid Build Coastguard Worker PassRegistry::getPassRegistry()->addRegistrationListener(this);
242*9880d681SAndroid Build Coastguard Worker }
243*9880d681SAndroid Build Coastguard Worker
~PassNameParser()244*9880d681SAndroid Build Coastguard Worker PassNameParser::~PassNameParser() {
245*9880d681SAndroid Build Coastguard Worker // This only gets called during static destruction, in which case the
246*9880d681SAndroid Build Coastguard Worker // PassRegistry will have already been destroyed by llvm_shutdown(). So
247*9880d681SAndroid Build Coastguard Worker // attempting to remove the registration listener is an error.
248*9880d681SAndroid Build Coastguard Worker }
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
251*9880d681SAndroid Build Coastguard Worker // AnalysisUsage Class Implementation
252*9880d681SAndroid Build Coastguard Worker //
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker namespace {
255*9880d681SAndroid Build Coastguard Worker struct GetCFGOnlyPasses : public PassRegistrationListener {
256*9880d681SAndroid Build Coastguard Worker typedef AnalysisUsage::VectorType VectorType;
257*9880d681SAndroid Build Coastguard Worker VectorType &CFGOnlyList;
GetCFGOnlyPasses__anon462757a90111::GetCFGOnlyPasses258*9880d681SAndroid Build Coastguard Worker GetCFGOnlyPasses(VectorType &L) : CFGOnlyList(L) {}
259*9880d681SAndroid Build Coastguard Worker
passEnumerate__anon462757a90111::GetCFGOnlyPasses260*9880d681SAndroid Build Coastguard Worker void passEnumerate(const PassInfo *P) override {
261*9880d681SAndroid Build Coastguard Worker if (P->isCFGOnlyPass())
262*9880d681SAndroid Build Coastguard Worker CFGOnlyList.push_back(P->getTypeInfo());
263*9880d681SAndroid Build Coastguard Worker }
264*9880d681SAndroid Build Coastguard Worker };
265*9880d681SAndroid Build Coastguard Worker }
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Worker // setPreservesCFG - This function should be called to by the pass, iff they do
268*9880d681SAndroid Build Coastguard Worker // not:
269*9880d681SAndroid Build Coastguard Worker //
270*9880d681SAndroid Build Coastguard Worker // 1. Add or remove basic blocks from the function
271*9880d681SAndroid Build Coastguard Worker // 2. Modify terminator instructions in any way.
272*9880d681SAndroid Build Coastguard Worker //
273*9880d681SAndroid Build Coastguard Worker // This function annotates the AnalysisUsage info object to say that analyses
274*9880d681SAndroid Build Coastguard Worker // that only depend on the CFG are preserved by this pass.
275*9880d681SAndroid Build Coastguard Worker //
setPreservesCFG()276*9880d681SAndroid Build Coastguard Worker void AnalysisUsage::setPreservesCFG() {
277*9880d681SAndroid Build Coastguard Worker // Since this transformation doesn't modify the CFG, it preserves all analyses
278*9880d681SAndroid Build Coastguard Worker // that only depend on the CFG (like dominators, loop info, etc...)
279*9880d681SAndroid Build Coastguard Worker GetCFGOnlyPasses(Preserved).enumeratePasses();
280*9880d681SAndroid Build Coastguard Worker }
281*9880d681SAndroid Build Coastguard Worker
addPreserved(StringRef Arg)282*9880d681SAndroid Build Coastguard Worker AnalysisUsage &AnalysisUsage::addPreserved(StringRef Arg) {
283*9880d681SAndroid Build Coastguard Worker const PassInfo *PI = Pass::lookupPassInfo(Arg);
284*9880d681SAndroid Build Coastguard Worker // If the pass exists, preserve it. Otherwise silently do nothing.
285*9880d681SAndroid Build Coastguard Worker if (PI) Preserved.push_back(PI->getTypeInfo());
286*9880d681SAndroid Build Coastguard Worker return *this;
287*9880d681SAndroid Build Coastguard Worker }
288*9880d681SAndroid Build Coastguard Worker
addRequiredID(const void * ID)289*9880d681SAndroid Build Coastguard Worker AnalysisUsage &AnalysisUsage::addRequiredID(const void *ID) {
290*9880d681SAndroid Build Coastguard Worker Required.push_back(ID);
291*9880d681SAndroid Build Coastguard Worker return *this;
292*9880d681SAndroid Build Coastguard Worker }
293*9880d681SAndroid Build Coastguard Worker
addRequiredID(char & ID)294*9880d681SAndroid Build Coastguard Worker AnalysisUsage &AnalysisUsage::addRequiredID(char &ID) {
295*9880d681SAndroid Build Coastguard Worker Required.push_back(&ID);
296*9880d681SAndroid Build Coastguard Worker return *this;
297*9880d681SAndroid Build Coastguard Worker }
298*9880d681SAndroid Build Coastguard Worker
addRequiredTransitiveID(char & ID)299*9880d681SAndroid Build Coastguard Worker AnalysisUsage &AnalysisUsage::addRequiredTransitiveID(char &ID) {
300*9880d681SAndroid Build Coastguard Worker Required.push_back(&ID);
301*9880d681SAndroid Build Coastguard Worker RequiredTransitive.push_back(&ID);
302*9880d681SAndroid Build Coastguard Worker return *this;
303*9880d681SAndroid Build Coastguard Worker }
304