1e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling//===- DbgInfoPrinter.cpp - Print debug info in a human readable form ------==//
26e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//
36e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//                     The LLVM Compiler Infrastructure
46e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//
56e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin// This file is distributed under the University of Illinois Open Source
66e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin// License. See LICENSE.TXT for details.
76e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//
86e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//===----------------------------------------------------------------------===//
96e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//
106e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin// This file implements a pass that prints instructions, and associated debug
116e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin// info:
12e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling//
136e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//   - source/line/col information
146e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//   - original variable name
156e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//   - original type name
166e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//
176e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin//===----------------------------------------------------------------------===//
18e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
190bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/DebugInfo.h"
206e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin#include "llvm/Function.h"
216e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin#include "llvm/IntrinsicInst.h"
22f0908a351ab123a1ad7b145a5e4bc28430be0d94Chris Lattner#include "llvm/Metadata.h"
23fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel#include "llvm/Module.h"
240bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/Pass.h"
256e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin#include "llvm/Analysis/Passes.h"
260bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/Assembly/Writer.h"
276e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin#include "llvm/Support/CFG.h"
286e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin#include "llvm/Support/CommandLine.h"
296e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin#include "llvm/Support/raw_ostream.h"
30e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
316e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwinusing namespace llvm;
326e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin
336e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwinstatic cl::opt<bool>
34e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill WendlingPrintDirectory("print-fullpath",
35e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling               cl::desc("Print fullpath when printing debug info"),
36e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling               cl::Hidden);
376e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin
386e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwinnamespace {
396726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky  class PrintDbgInfo : public FunctionPass {
40e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    raw_ostream &Out;
41e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    void printVariableDeclaration(const Value *V);
42e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling  public:
43e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    static char ID; // Pass identification
44081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    PrintDbgInfo() : FunctionPass(ID), Out(errs()) {
45081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      initializePrintDbgInfoPass(*PassRegistry::getPassRegistry());
46081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    }
47e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
48e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    virtual bool runOnFunction(Function &F);
49e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
50e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling      AU.setPreservesAll();
51e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    }
52e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling  };
53e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling  char PrintDbgInfo::ID = 0;
546e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin}
556e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin
5671802344fcb224a89e4e636c1ec47f3730969be7Owen AndersonINITIALIZE_PASS(PrintDbgInfo, "print-dbginfo",
57ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Print debug info in human readable form", false, false)
5871802344fcb224a89e4e636c1ec47f3730969be7Owen Anderson
596e68106a47e9774476f2f39df572652c1eb5f75cTorok EdwinFunctionPass *llvm::createDbgInfoPrinterPass() { return new PrintDbgInfo(); }
606e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin
61fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel/// Find the debug info descriptor corresponding to this global variable.
62fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patelstatic Value *findDbgGlobalDeclare(GlobalVariable *V) {
63fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  const Module *M = V->getParent();
64fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.gv");
65fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  if (!NMD)
66fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    return 0;
67fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
68fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
69fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
70fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (!DIG.isGlobalVariable())
71fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel      continue;
72fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (DIGlobalVariable(DIG).getGlobal() == V)
73fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel      return DIG;
74fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  }
75fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  return 0;
76fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel}
77fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
78fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel/// Find the debug info descriptor corresponding to this function.
79fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patelstatic Value *findDbgSubprogramDeclare(Function *V) {
80fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  const Module *M = V->getParent();
81fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  NamedMDNode *NMD = M->getNamedMetadata("llvm.dbg.sp");
82fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  if (!NMD)
83fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    return 0;
84fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
85fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
86fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    DIDescriptor DIG(cast<MDNode>(NMD->getOperand(i)));
87fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (!DIG.isSubprogram())
88fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel      continue;
89fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (DISubprogram(DIG).getFunction() == V)
90fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel      return DIG;
91fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  }
92fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  return 0;
93fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel}
94fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
95fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel/// Finds the llvm.dbg.declare intrinsic corresponding to this value if any.
96fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel/// It looks through pointer casts too.
97fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patelstatic const DbgDeclareInst *findDbgDeclare(const Value *V) {
98fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  V = V->stripPointerCasts();
99fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
100fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  if (!isa<Instruction>(V) && !isa<Argument>(V))
101fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    return 0;
102fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
103fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  const Function *F = NULL;
104fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  if (const Instruction *I = dyn_cast<Instruction>(V))
105fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    F = I->getParent()->getParent();
106fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  else if (const Argument *A = dyn_cast<Argument>(V))
107fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    F = A->getParent();
108fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
109fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  for (Function::const_iterator FI = F->begin(), FE = F->end(); FI != FE; ++FI)
110fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    for (BasicBlock::const_iterator BI = (*FI).begin(), BE = (*FI).end();
111fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel         BI != BE; ++BI)
112fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel      if (const DbgDeclareInst *DDI = dyn_cast<DbgDeclareInst>(BI))
113fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel        if (DDI->getAddress() == V)
114fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel          return DDI;
115fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
116fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  return 0;
117fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel}
118fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
119fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patelstatic bool getLocationInfo(const Value *V, std::string &DisplayName,
120fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel                            std::string &Type, unsigned &LineNo,
121fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel                            std::string &File, std::string &Dir) {
122fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  DICompileUnit Unit;
123fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  DIType TypeD;
124fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
125fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  if (GlobalVariable *GV = dyn_cast<GlobalVariable>(const_cast<Value*>(V))) {
126fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    Value *DIGV = findDbgGlobalDeclare(GV);
127fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (!DIGV) return false;
128fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    DIGlobalVariable Var(cast<MDNode>(DIGV));
129fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
130fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    StringRef D = Var.getDisplayName();
131fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (!D.empty())
132fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel      DisplayName = D;
133fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    LineNo = Var.getLineNumber();
134fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    Unit = Var.getCompileUnit();
135fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    TypeD = Var.getType();
136fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  } else if (Function *F = dyn_cast<Function>(const_cast<Value*>(V))){
137fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    Value *DIF = findDbgSubprogramDeclare(F);
138fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (!DIF) return false;
139fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    DISubprogram Var(cast<MDNode>(DIF));
140fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
141fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    StringRef D = Var.getDisplayName();
142fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (!D.empty())
143fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel      DisplayName = D;
144fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    LineNo = Var.getLineNumber();
145fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    Unit = Var.getCompileUnit();
146fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    TypeD = Var.getType();
147fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  } else {
148fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    const DbgDeclareInst *DDI = findDbgDeclare(V);
149fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (!DDI) return false;
150fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    DIVariable Var(cast<MDNode>(DDI->getVariable()));
151fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
152fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    StringRef D = Var.getName();
153fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    if (!D.empty())
154fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel      DisplayName = D;
155fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    LineNo = Var.getLineNumber();
156fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    Unit = Var.getCompileUnit();
157fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    TypeD = Var.getType();
158fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  }
159fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
160fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  StringRef T = TypeD.getName();
161fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  if (!T.empty())
162fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    Type = T;
163fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  StringRef F = Unit.getFilename();
164fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  if (!F.empty())
165fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    File = F;
166fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  StringRef D = Unit.getDirectory();
167fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  if (!D.empty())
168fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel    Dir = D;
169fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel  return true;
170fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel}
171fc0569e55aade16aac6668b4fadbbdcaeb6f2537Devang Patel
172e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendlingvoid PrintDbgInfo::printVariableDeclaration(const Value *V) {
173ff7d0e9509cf8f359fe14c05dc29a05a293ce88fTorok Edwin  std::string DisplayName, File, Directory, Type;
174ef01f32d07f4c7ecd9d116be53c5f3de3138f1aeGalina Kistanova  unsigned LineNo = 0;
175e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
176e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling  if (!getLocationInfo(V, DisplayName, Type, LineNo, File, Directory))
177e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    return;
178e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
179e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling  Out << "; ";
180e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling  WriteAsOperand(Out, V, false, 0);
181497acb91dc9a433f8196c08c941082ad6e9fbe9dDevang Patel  if (isa<Function>(V))
182497acb91dc9a433f8196c08c941082ad6e9fbe9dDevang Patel    Out << " is function " << DisplayName
183497acb91dc9a433f8196c08c941082ad6e9fbe9dDevang Patel        << " of type " << Type << " declared at ";
184497acb91dc9a433f8196c08c941082ad6e9fbe9dDevang Patel  else
185497acb91dc9a433f8196c08c941082ad6e9fbe9dDevang Patel    Out << " is variable " << DisplayName
186497acb91dc9a433f8196c08c941082ad6e9fbe9dDevang Patel        << " of type " << Type << " declared at ";
187e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
188e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling  if (PrintDirectory)
189e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    Out << Directory << "/";
190e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
191e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling  Out << File << ":" << LineNo << "\n";
1926e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin}
1936e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin
194e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendlingbool PrintDbgInfo::runOnFunction(Function &F) {
1956e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin  if (F.isDeclaration())
1966e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin    return false;
197e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
1986e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin  Out << "function " << F.getName() << "\n\n";
199e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
2006e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
2016e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin    BasicBlock *BB = I;
202e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
2036e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin    if (I != F.begin() && (pred_begin(BB) == pred_end(BB)))
2046e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin      // Skip dead blocks.
2056e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin      continue;
206e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
2076e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin    Out << BB->getName();
2086e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin    Out << ":";
209e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
2106e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin    Out << "\n";
211e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
212e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling    for (BasicBlock::const_iterator i = BB->begin(), e = BB->end();
213e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling         i != e; ++i) {
214e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
2156e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin        printVariableDeclaration(i);
216e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling
217ff7d0e9509cf8f359fe14c05dc29a05a293ce88fTorok Edwin        if (const User *U = dyn_cast<User>(i)) {
218e66b2912405d91dbc4d3e7f7b5e955c87d597406Bill Wendling          for(unsigned i=0;i<U->getNumOperands();i++)
219ff7d0e9509cf8f359fe14c05dc29a05a293ce88fTorok Edwin            printVariableDeclaration(U->getOperand(i));
220ff7d0e9509cf8f359fe14c05dc29a05a293ce88fTorok Edwin        }
2216e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin    }
2226e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin  }
2236e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin  return false;
2246e68106a47e9774476f2f39df572652c1eb5f75cTorok Edwin}
225