blob: f48d5afe297db2ef8528d210527f78c915aae21f [file] [log] [blame]
Chris Lattner781e6f52002-07-29 21:24:10 +00001//===- AnalysisWrappers.cpp - Wrappers around non-pass analyses -----------===//
John Criswell7c0e0222003-10-20 17:47:21 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattner781e6f52002-07-29 21:24:10 +00009//
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//
Misha Brukmanbc0e9982003-07-14 17:20:40 +000014// These classes are separated out of analyze.cpp so that it is more clear which
Chris Lattner781e6f52002-07-29 21:24:10 +000015// 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
Chris Lattnerd9572112004-05-27 06:13:36 +000020#include "llvm/Module.h"
Chris Lattner04eaef22004-04-02 20:56:33 +000021#include "llvm/Pass.h"
Chris Lattner781e6f52002-07-29 21:24:10 +000022#include "llvm/Analysis/InstForest.h"
Chris Lattnerd9572112004-05-27 06:13:36 +000023#include "llvm/Support/CallSite.h"
Reid Spencer86f42bd2004-07-04 12:20:55 +000024#include <iostream>
Chris Lattner781e6f52002-07-29 21:24:10 +000025
Brian Gaeked0fde302003-11-11 22:41:34 +000026using namespace llvm;
27
Chris Lattner781e6f52002-07-29 21:24:10 +000028namespace {
29 struct InstForestHelper : public FunctionPass {
30 Function *F;
31 virtual bool runOnFunction(Function &Func) { F = &Func; return false; }
32
33 void print(std::ostream &OS) const {
34 std::cout << InstForest<char>(F);
35 }
36
37 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
38 AU.setPreservesAll();
39 }
40 };
41
42 RegisterAnalysis<InstForestHelper> P1("instforest", "InstForest Printer");
Chris Lattner781e6f52002-07-29 21:24:10 +000043}
Chris Lattnerd9572112004-05-27 06:13:36 +000044
45namespace {
46 /// ExternalFunctionsPassedConstants - This pass prints out call sites to
47 /// external functions that are called with constant arguments. This can be
48 /// useful when looking for standard library functions we should constant fold
49 /// or handle in alias analyses.
50 struct ExternalFunctionsPassedConstants : public Pass {
51 virtual bool run(Module &M) {
52 for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
53 if (I->isExternal()) {
54 bool PrintedFn = false;
55 for (Value::use_iterator UI = I->use_begin(), E = I->use_end();
56 UI != E; ++UI)
57 if (Instruction *User = dyn_cast<Instruction>(*UI)) {
58 CallSite CS = CallSite::get(User);
59 if (CS.getInstruction()) {
60 for (CallSite::arg_iterator AI = CS.arg_begin(),
61 E = CS.arg_end(); AI != E; ++AI)
Chris Lattnerb04cb7d2004-05-27 06:43:37 +000062 if (isa<Constant>(*AI) || isa<GlobalValue>(*AI)) {
Chris Lattnerd9572112004-05-27 06:13:36 +000063 if (!PrintedFn) {
64 std::cerr << "Function '" << I->getName() << "':\n";
65 PrintedFn = true;
66 }
67 std::cerr << *User;
68 break;
69 }
70 }
71 }
72 }
73
74 return false;
75 }
76
77 void print(std::ostream &OS) const {}
78
79 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
80 AU.setPreservesAll();
81 }
82 };
83
84 RegisterAnalysis<ExternalFunctionsPassedConstants>
85 P2("externalfnconstants", "Print external fn callsites passed constants");
86}