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;
							 |