184 lines
6.5 KiB
C++
184 lines
6.5 KiB
C++
|
/**
|
||
|
* The code below is adapted from opt tool according to clearance and conditions established in NCSA license as follows:
|
||
|
|
||
|
* Copyright (c) 2003 University of Illinois. All rights reserved.
|
||
|
|
||
|
* Developed by: LLVM Developer Group
|
||
|
* University of Illinois
|
||
|
* http://llvm.org/
|
||
|
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
||
|
* files (the "Software"), to deal with the Software without restriction, including without limitation the rights to use, copy,
|
||
|
* modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
||
|
* is furnished to do so, subject to the following conditions:
|
||
|
|
||
|
* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimers.
|
||
|
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimers
|
||
|
* in the documentation and/or other materials provided with the distribution.
|
||
|
* Neither the names of LLVM Developer Group, University of Illinois, nor the names of its contributors may be used to endorse or
|
||
|
* promote products derived from this Software without specific prior written permission.
|
||
|
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||
|
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT HROLDERS
|
||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||
|
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE.
|
||
|
|
||
|
**/
|
||
|
|
||
|
struct CallGraphSCCPassPrinter : public CallGraphSCCPass {
|
||
|
static char ID;
|
||
|
const PassInfo *PassToPrint;
|
||
|
std::string PassName;
|
||
|
|
||
|
CallGraphSCCPassPrinter(const PassInfo *PI) :
|
||
|
CallGraphSCCPass(ID), PassToPrint(PI) {
|
||
|
std::string PassToPrintName = PassToPrint->getPassName();
|
||
|
PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
|
||
|
}
|
||
|
|
||
|
virtual bool runOnSCC(CallGraphSCC &SCC) {
|
||
|
errs() << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
|
||
|
|
||
|
// Get and print pass...
|
||
|
for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
|
||
|
Function *F = (*I)->getFunction();
|
||
|
if (F)
|
||
|
getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(errs(),
|
||
|
F->getParent());
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
virtual const char *getPassName() const { return PassName.c_str(); }
|
||
|
|
||
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||
|
AU.addRequiredID(PassToPrint->getTypeInfo());
|
||
|
AU.setPreservesAll();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
char CallGraphSCCPassPrinter::ID = 0;
|
||
|
|
||
|
struct ModulePassPrinter : public ModulePass {
|
||
|
static char ID;
|
||
|
const PassInfo *PassToPrint;
|
||
|
std::string PassName;
|
||
|
|
||
|
ModulePassPrinter(const PassInfo *PI)
|
||
|
: ModulePass(ID), PassToPrint(PI) {
|
||
|
std::string PassToPrintName = PassToPrint->getPassName();
|
||
|
PassName = "ModulePass Printer: " + PassToPrintName;
|
||
|
}
|
||
|
|
||
|
virtual bool runOnModule(Module &M) {
|
||
|
errs() << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
|
||
|
|
||
|
// Get and print pass...
|
||
|
getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(errs(), &M);
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
virtual const char *getPassName() const { return PassName.c_str(); }
|
||
|
|
||
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||
|
AU.addRequiredID(PassToPrint->getTypeInfo());
|
||
|
AU.setPreservesAll();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
char ModulePassPrinter::ID = 0;
|
||
|
|
||
|
struct FunctionPassPrinter : public FunctionPass {
|
||
|
const PassInfo *PassToPrint;
|
||
|
static char ID;
|
||
|
std::string PassName;
|
||
|
|
||
|
FunctionPassPrinter(const PassInfo *PI)
|
||
|
: FunctionPass(ID), PassToPrint(PI) {
|
||
|
std::string PassToPrintName = PassToPrint->getPassName();
|
||
|
PassName = "FunctionPass Printer: " + PassToPrintName;
|
||
|
}
|
||
|
|
||
|
virtual bool runOnFunction(Function &F) {
|
||
|
errs() << "Printing analysis '" << PassToPrint->getPassName()
|
||
|
<< "' for function '" << F.getName() << "':\n";
|
||
|
|
||
|
// Get and print pass...
|
||
|
getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(errs(),
|
||
|
F.getParent());
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
virtual const char *getPassName() const { return PassName.c_str(); }
|
||
|
|
||
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||
|
AU.addRequiredID(PassToPrint->getTypeInfo());
|
||
|
AU.setPreservesAll();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
char FunctionPassPrinter::ID = 0;
|
||
|
|
||
|
struct LoopPassPrinter : public LoopPass {
|
||
|
static char ID;
|
||
|
const PassInfo *PassToPrint;
|
||
|
std::string PassName;
|
||
|
|
||
|
LoopPassPrinter(const PassInfo *PI) :
|
||
|
LoopPass(ID), PassToPrint(PI) {
|
||
|
std::string PassToPrintName = PassToPrint->getPassName();
|
||
|
PassName = "LoopPass Printer: " + PassToPrintName;
|
||
|
}
|
||
|
|
||
|
|
||
|
virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {
|
||
|
errs() << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
|
||
|
|
||
|
// Get and print pass...
|
||
|
getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(errs(),
|
||
|
L->getHeader()->getParent()->getParent());
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
virtual const char *getPassName() const { return PassName.c_str(); }
|
||
|
|
||
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||
|
AU.addRequiredID(PassToPrint->getTypeInfo());
|
||
|
AU.setPreservesAll();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
char LoopPassPrinter::ID = 0;
|
||
|
|
||
|
struct RegionPassPrinter : public RegionPass {
|
||
|
static char ID;
|
||
|
const PassInfo *PassToPrint;
|
||
|
std::string PassName;
|
||
|
|
||
|
RegionPassPrinter(const PassInfo *PI) : RegionPass(ID),
|
||
|
PassToPrint(PI) {
|
||
|
std::string PassToPrintName = PassToPrint->getPassName();
|
||
|
PassName = "RegionPass Printer: " + PassToPrintName;
|
||
|
}
|
||
|
|
||
|
virtual bool runOnRegion(Region *R, RGPassManager &RGM) {
|
||
|
errs() << "Printing analysis '" << PassToPrint->getPassName() << "' for "
|
||
|
<< "region: '" << R->getNameStr() << "' in function '"
|
||
|
<< R->getEntry()->getParent()->getName() << "':\n";
|
||
|
|
||
|
// Get and print pass...
|
||
|
getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(errs(),
|
||
|
R->getEntry()->getParent()->getParent());
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
virtual const char *getPassName() const { return PassName.c_str(); }
|
||
|
|
||
|
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
|
||
|
AU.addRequiredID(PassToPrint->getTypeInfo());
|
||
|
AU.setPreservesAll();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
char RegionPassPrinter::ID = 0;
|