1*9880d681SAndroid Build Coastguard Worker //===- BreakpointPrinter.cpp - Breakpoint location printer ----------------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker /// 10*9880d681SAndroid Build Coastguard Worker /// \file 11*9880d681SAndroid Build Coastguard Worker /// \brief Breakpoint location printer. 12*9880d681SAndroid Build Coastguard Worker /// 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker #include "BreakpointPrinter.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringSet.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DebugInfo.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/Pass.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker using namespace llvm; 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker namespace { 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker struct BreakpointPrinter : public ModulePass { 26*9880d681SAndroid Build Coastguard Worker raw_ostream &Out; 27*9880d681SAndroid Build Coastguard Worker static char ID; 28*9880d681SAndroid Build Coastguard Worker BreakpointPrinter__anon54a352570111::BreakpointPrinter29*9880d681SAndroid Build Coastguard Worker BreakpointPrinter(raw_ostream &out) : ModulePass(ID), Out(out) {} 30*9880d681SAndroid Build Coastguard Worker getContextName__anon54a352570111::BreakpointPrinter31*9880d681SAndroid Build Coastguard Worker void getContextName(const DIScope *Context, std::string &N) { 32*9880d681SAndroid Build Coastguard Worker if (auto *NS = dyn_cast<DINamespace>(Context)) { 33*9880d681SAndroid Build Coastguard Worker if (!NS->getName().empty()) { 34*9880d681SAndroid Build Coastguard Worker getContextName(NS->getScope(), N); 35*9880d681SAndroid Build Coastguard Worker N = N + NS->getName().str() + "::"; 36*9880d681SAndroid Build Coastguard Worker } 37*9880d681SAndroid Build Coastguard Worker } else if (auto *TY = dyn_cast<DIType>(Context)) { 38*9880d681SAndroid Build Coastguard Worker if (!TY->getName().empty()) { 39*9880d681SAndroid Build Coastguard Worker getContextName(TY->getScope().resolve(), N); 40*9880d681SAndroid Build Coastguard Worker N = N + TY->getName().str() + "::"; 41*9880d681SAndroid Build Coastguard Worker } 42*9880d681SAndroid Build Coastguard Worker } 43*9880d681SAndroid Build Coastguard Worker } 44*9880d681SAndroid Build Coastguard Worker runOnModule__anon54a352570111::BreakpointPrinter45*9880d681SAndroid Build Coastguard Worker bool runOnModule(Module &M) override { 46*9880d681SAndroid Build Coastguard Worker StringSet<> Processed; 47*9880d681SAndroid Build Coastguard Worker if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp")) 48*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { 49*9880d681SAndroid Build Coastguard Worker std::string Name; 50*9880d681SAndroid Build Coastguard Worker auto *SP = cast_or_null<DISubprogram>(NMD->getOperand(i)); 51*9880d681SAndroid Build Coastguard Worker if (!SP) 52*9880d681SAndroid Build Coastguard Worker continue; 53*9880d681SAndroid Build Coastguard Worker getContextName(SP->getScope().resolve(), Name); 54*9880d681SAndroid Build Coastguard Worker Name = Name + SP->getDisplayName().str(); 55*9880d681SAndroid Build Coastguard Worker if (!Name.empty() && Processed.insert(Name).second) { 56*9880d681SAndroid Build Coastguard Worker Out << Name << "\n"; 57*9880d681SAndroid Build Coastguard Worker } 58*9880d681SAndroid Build Coastguard Worker } 59*9880d681SAndroid Build Coastguard Worker return false; 60*9880d681SAndroid Build Coastguard Worker } 61*9880d681SAndroid Build Coastguard Worker getAnalysisUsage__anon54a352570111::BreakpointPrinter62*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override { 63*9880d681SAndroid Build Coastguard Worker AU.setPreservesAll(); 64*9880d681SAndroid Build Coastguard Worker } 65*9880d681SAndroid Build Coastguard Worker }; 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker char BreakpointPrinter::ID = 0; 68*9880d681SAndroid Build Coastguard Worker } 69*9880d681SAndroid Build Coastguard Worker createBreakpointPrinter(raw_ostream & out)70*9880d681SAndroid Build Coastguard WorkerModulePass *llvm::createBreakpointPrinter(raw_ostream &out) { 71*9880d681SAndroid Build Coastguard Worker return new BreakpointPrinter(out); 72*9880d681SAndroid Build Coastguard Worker } 73