summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2014-04-01 21:04:24 +0000
committerAdrian Prantl <aprantl@apple.com>2014-04-01 21:04:24 +0000
commit2f1e34736e4f14c57d1c1fdcfc8b9e133c4885d9 (patch)
treee36cb8aaa21d50ace0c4239832009cb8dcde6dce
parentccd539282b4433bf4d3fca0e23b33799966cdbc0 (diff)
downloadllvm-2f1e34736e4f14c57d1c1fdcfc8b9e133c4885d9.tar.gz
llvm-2f1e34736e4f14c57d1c1fdcfc8b9e133c4885d9.tar.bz2
llvm-2f1e34736e4f14c57d1c1fdcfc8b9e133c4885d9.tar.xz
Add a comment about the DIDescriptor class hierarchy.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205358 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/IR/DebugInfo.h7
-rw-r--r--lib/IR/DebugInfo.cpp6
2 files changed, 11 insertions, 2 deletions
diff --git a/include/llvm/IR/DebugInfo.h b/include/llvm/IR/DebugInfo.h
index 69beaada9c..bf3ae98381 100644
--- a/include/llvm/IR/DebugInfo.h
+++ b/include/llvm/IR/DebugInfo.h
@@ -197,6 +197,13 @@ typedef DIRef<DIScope> DIScopeRef;
typedef DIRef<DIType> DITypeRef;
/// DIScope - A base class for various scopes.
+///
+/// Although, implementation-wise, DIScope is the parent class of most
+/// other DIxxx classes, including DIType and its descendants, most of
+/// DIScope’s descendants are not a substitutable subtype of
+/// DIScope. The DIDescriptor::isScope() method only is true for
+/// DIScopes that are scopes in the strict lexical scope sense
+/// (DICompileUnit, DISubprogram, etc.), but not for, e.g., a DIType.
class DIScope : public DIDescriptor {
protected:
friend class DIDescriptor;
diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp
index f9bc63b389..c9d68afa44 100644
--- a/lib/IR/DebugInfo.cpp
+++ b/lib/IR/DebugInfo.cpp
@@ -429,8 +429,10 @@ static bool fieldIsTypeRef(const MDNode *DbgNode, unsigned Elt) {
/// Check if a value can be a ScopeRef.
static bool isScopeRef(const Value *Val) {
return !Val ||
- (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||
- isa<MDNode>(Val);
+ (isa<MDString>(Val) && !cast<MDString>(Val)->getString().empty()) ||
+ // Not checking for Val->isScope() here, because it would work
+ // only for lexical scopes and not all subclasses of DIScope.
+ isa<MDNode>(Val);
}
/// Check if a field at position Elt of a MDNode can be a ScopeRef.