aboutsummaryrefslogtreecommitdiff
path: root/tools/opt/opt.cpp
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2011-04-04 19:51:17 +0000
committerDevang Patel <dpatel@apple.com>2011-04-04 19:51:17 +0000
commit1be9980d065059e289fca739cbdcff74383dccbe (patch)
tree07d6c7dfd250b1f6a1a2d79d19fad292b5a6cd34 /tools/opt/opt.cpp
parent5fcb81dace175106024941b09fa27aecba2d7db7 (diff)
Update BreakpointPrinter to emit original function names only.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128839 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/opt/opt.cpp')
-rw-r--r--tools/opt/opt.cpp46
1 files changed, 31 insertions, 15 deletions
diff --git a/tools/opt/opt.cpp b/tools/opt/opt.cpp
index e55b4b3e2a..6760b22ceb 100644
--- a/tools/opt/opt.cpp
+++ b/tools/opt/opt.cpp
@@ -26,6 +26,7 @@
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetLibraryInfo.h"
#include "llvm/Target/TargetMachine.h"
+#include "llvm/ADT/StringSet.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Support/PassNameParser.h"
#include "llvm/Support/Signals.h"
@@ -342,28 +343,43 @@ struct BasicBlockPassPrinter : public BasicBlockPass {
char BasicBlockPassPrinter::ID = 0;
-struct BreakpointPrinter : public FunctionPass {
+struct BreakpointPrinter : public ModulePass {
raw_ostream &Out;
static char ID;
BreakpointPrinter(raw_ostream &out)
- : FunctionPass(ID), Out(out) {
+ : ModulePass(ID), Out(out) {
}
- virtual bool runOnFunction(Function &F) {
- BasicBlock &EntryBB = F.getEntryBlock();
- BasicBlock::const_iterator BI = EntryBB.end();
- --BI;
- do {
- const Instruction *In = BI;
- const DebugLoc DL = In->getDebugLoc();
- if (!DL.isUnknown()) {
- DIScope S(DL.getScope(getGlobalContext()));
- Out << S.getFilename() << " " << DL.getLine() << "\n";
- break;
+ void getContextName(DIDescriptor Context, std::string &N) {
+ if (Context.isNameSpace()) {
+ DINameSpace NS(Context);
+ if (!NS.getName().empty()) {
+ getContextName(NS.getContext(), N);
+ N = N + NS.getName().str() + "::";
+ }
+ } else if (Context.isType()) {
+ DIType TY(Context);
+ if (!TY.getName().empty()) {
+ getContextName(TY.getContext(), N);
+ N = N + TY.getName().str() + "::";
+ }
+ }
+ }
+
+ virtual bool runOnModule(Module &M) {
+ StringSet<> Processed;
+ if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp"))
+ for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
+ std::string Name;
+ DISubprogram SP(NMD->getOperand(i));
+ if (SP.Verify())
+ getContextName(SP.getContext(), Name);
+ Name = Name + SP.getDisplayName().str();
+ if (!Name.empty() && Processed.insert(Name)) {
+ Out << Name << "\n";
+ }
}
- --BI;
- } while (BI != EntryBB.begin());
return false;
}