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