Make opt default to not adding a target data string and update tests that depend...
[oota-llvm.git] / tools / opt / AnalysisWrappers.cpp
1 //===- AnalysisWrappers.cpp - Wrappers around non-pass analyses -----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines pass wrappers around LLVM analyses that don't make sense to
11 // be passes.  It provides a nice standard pass interface to these classes so
12 // that they can be printed out by analyze.
13 //
14 // These classes are separated out of analyze.cpp so that it is more clear which
15 // code is the integral part of the analyze tool, and which part of the code is
16 // just making it so more passes are available.
17 //
18 //===----------------------------------------------------------------------===//
19
20 #include "llvm/Module.h"
21 #include "llvm/Pass.h"
22 #include "llvm/Support/CallSite.h"
23 #include "llvm/Analysis/CallGraph.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include <iostream>
26 using namespace llvm;
27
28 namespace {
29   /// ExternalFunctionsPassedConstants - This pass prints out call sites to
30   /// external functions that are called with constant arguments.  This can be
31   /// useful when looking for standard library functions we should constant fold
32   /// or handle in alias analyses.
33   struct ExternalFunctionsPassedConstants : public ModulePass {
34     static char ID; // Pass ID, replacement for typeid
35     ExternalFunctionsPassedConstants() : ModulePass(&ID) {}
36     virtual bool runOnModule(Module &M) {
37       for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
38         if (!I->isDeclaration()) continue;
39         
40         bool PrintedFn = false;
41         for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
42              UI != E; ++UI) {
43           Instruction *User = dyn_cast<Instruction>(*UI);
44           if (!User) continue;
45           
46           CallSite CS = CallSite::get(User);
47           if (!CS.getInstruction()) continue;
48           
49           for (CallSite::arg_iterator AI = CS.arg_begin(),
50                E = CS.arg_end(); AI != E; ++AI) {
51             if (!isa<Constant>(*AI)) continue;
52
53             if (!PrintedFn) {
54               errs() << "Function '" << I->getName() << "':\n";
55               PrintedFn = true;
56             }
57             errs() << *User;
58             break;
59           }
60         }
61       }
62
63       return false;
64     }
65
66     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
67       AU.setPreservesAll();
68     }
69   };
70
71   char ExternalFunctionsPassedConstants::ID = 0;
72   RegisterPass<ExternalFunctionsPassedConstants>
73   P1("print-externalfnconstants",
74      "Print external fn callsites passed constants");
75
76   struct CallGraphPrinter : public ModulePass {
77     static char ID; // Pass ID, replacement for typeid
78     CallGraphPrinter() : ModulePass(&ID) {}
79
80     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
81       AU.setPreservesAll();
82       AU.addRequiredTransitive<CallGraph>();
83     }
84     virtual bool runOnModule(Module &M) {
85       getAnalysis<CallGraph>().print(errs(), &M);
86       return false;
87     }
88   };
89
90   char CallGraphPrinter::ID = 0;
91   RegisterPass<CallGraphPrinter>
92     P2("print-callgraph", "Print a call graph");
93 }