/** * 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(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(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(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(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(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;