diff options
author | Chris Lattner <sabre@nondot.org> | 2004-05-27 06:13:36 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-05-27 06:13:36 +0000 |
commit | 8082c74e0ac4355f083cc669a9152bd1dacc1232 (patch) | |
tree | 33fe76b6b16bd519d23985fbe59e99129883d555 | |
parent | 716793336f5ba70c0bf900b3d72436d8f9b0fd6e (diff) | |
download | bcm5719-llvm-8082c74e0ac4355f083cc669a9152bd1dacc1232.tar.gz bcm5719-llvm-8082c74e0ac4355f083cc669a9152bd1dacc1232.zip |
Add a simple pass.
llvm-svn: 13820
-rw-r--r-- | llvm/tools/analyze/AnalysisWrappers.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/tools/analyze/AnalysisWrappers.cpp b/llvm/tools/analyze/AnalysisWrappers.cpp index aa9f03d8838..8e6ee2237cd 100644 --- a/llvm/tools/analyze/AnalysisWrappers.cpp +++ b/llvm/tools/analyze/AnalysisWrappers.cpp @@ -17,8 +17,10 @@ // //===----------------------------------------------------------------------===// +#include "llvm/Module.h" #include "llvm/Pass.h" #include "llvm/Analysis/InstForest.h" +#include "llvm/Support/CallSite.h" using namespace llvm; @@ -38,3 +40,46 @@ namespace { RegisterAnalysis<InstForestHelper> P1("instforest", "InstForest Printer"); } + +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. + struct ExternalFunctionsPassedConstants : public Pass { + virtual bool run(Module &M) { + for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) + if (I->isExternal()) { + bool PrintedFn = false; + for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); + UI != E; ++UI) + if (Instruction *User = dyn_cast<Instruction>(*UI)) { + CallSite CS = CallSite::get(User); + if (CS.getInstruction()) { + for (CallSite::arg_iterator AI = 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; + } + } + } + } + + return false; + } + + void print(std::ostream &OS) const {} + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + } + }; + + RegisterAnalysis<ExternalFunctionsPassedConstants> + P2("externalfnconstants", "Print external fn callsites passed constants"); +} |