//===- AnalysisWrappers.cpp - Wrappers around non-pass analyses -----------===////// The LLVM Compiler Infrastructure//// This file is distributed under the University of Illinois Open Source// License. See LICENSE.TXT for details.////===----------------------------------------------------------------------===////// This file defines pass wrappers around LLVM analyses that don't make sense to// be passes. It provides a nice standard pass interface to these classes so// that they can be printed out by analyze.//// These classes are separated out of analyze.cpp so that it is more clear which// code is the integral part of the analyze tool, and which part of the code is// just making it so more passes are available.////===----------------------------------------------------------------------===//#include"llvm/Module.h"#include"llvm/Pass.h"#include"llvm/Support/CallSite.h"#include"llvm/Analysis/CallGraph.h"#include<iostream>usingnamespacellvm;namespace{/// ExternalFunctionsPassedConstants - This pass prints out call sites to/// external functions that are called with constant arguments. This can be/// useful when looking for standard library functions we should constant fold/// or handle in alias analyses.structExternalFunctionsPassedConstants:publicModulePass{staticcharID;// Pass ID, replacement for typeidExternalFunctionsPassedConstants():ModulePass((intptr_t)&ID){}virtualboolrunOnModule(Module&M){for(Module::iteratorI=M.begin(),E=M.end();I!=E;++I)if(I->isDeclaration()){boolPrintedFn=false;for(Value::use_iteratorUI=I->use_begin(),E=I->use_end();UI!=E;++UI)if(Instruction*User=dyn_cast<Instruction>(*UI)){CallSiteCS=CallSite::get(User);if(CS.getInstruction()){for(CallSite::arg_iteratorAI=CS.arg_begin(),E=CS.arg_end();AI!=E;++AI)if(isa<Constant>(*AI)){if(!PrintedFn){std::cerr<<"Function '"<<I->getName()<<"':\n";PrintedFn=true;}std::cerr<<*User;break;}}}}returnfalse;}virtualvoidgetAnalysisUsage(AnalysisUsage&AU)const{AU.setPreservesAll();}};charExternalFunctionsPassedConstants::ID=0;RegisterPass<ExternalFunctionsPassedConstants>P1("externalfnconstants","Print external fn callsites passed constants");structCallGraphPrinter:publicModulePass{staticcharID;// Pass ID, replacement for typeidCallGraphPrinter():ModulePass((intptr_t)&ID){}virtualvoidgetAnalysisUsage(AnalysisUsage&AU)const{AU.setPreservesAll();AU.addRequiredTransitive<CallGraph>();}virtualboolrunOnModule(Module&M){returnfalse;}virtualvoidprint(std::ostream&OS,constModule*M)const{getAnalysis<CallGraph>().print(OS,M);}};charCallGraphPrinter::ID=0;RegisterPass<CallGraphPrinter>P2("callgraph","Print a call graph");}