From feea95c88468cadbbed4ca0526826a7d279f2f7d Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Fri, 26 Jul 2013 17:02:36 +0000 Subject: [PATCH] Add a way to get the context of any particular scope. llvm-svn: 187212 --- llvm/include/llvm/DebugInfo.h | 3 +++ llvm/lib/IR/DebugInfo.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/llvm/include/llvm/DebugInfo.h b/llvm/include/llvm/DebugInfo.h index ae7bf04..9fb12f8 100644 --- a/llvm/include/llvm/DebugInfo.h +++ b/llvm/include/llvm/DebugInfo.h @@ -187,6 +187,9 @@ namespace llvm { public: explicit DIScope(const MDNode *N = 0) : DIDescriptor (N) {} + /// Gets the parent scope for this scope node or returns a + /// default constructed scope. + DIScope getContext() const; StringRef getFilename() const; StringRef getDirectory() const; }; diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp index 7502316..369895c 100644 --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -692,6 +692,31 @@ Value *DITemplateValueParameter::getValue() const { return getField(DbgNode, 4); } +// If the current node has a parent scope then return that, +// else return an empty scope. +DIScope DIScope::getContext() const { + + if (isType()) + return DIType(DbgNode).getContext(); + + if (isSubprogram()) + return DISubprogram(DbgNode).getContext(); + + if (isLexicalBlock()) + return DILexicalBlock(DbgNode).getContext(); + + if (isLexicalBlockFile()) + return DILexicalBlockFile(DbgNode).getContext(); + + if (isNameSpace()) + return DINameSpace(DbgNode).getContext(); + + if (isFile() || isCompileUnit()) + return DIScope(); + + return DIScope(); +} + StringRef DIScope::getFilename() const { if (!DbgNode) return StringRef(); -- 2.7.4