This partially reverts r190330. DIScope::getContext now returns DIScopeRef
instead of DIScope. We construct a DIScopeRef from DIScope when we are
dealing with subprogram, lexical block or name space.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190362
91177308-0d34-0410-b5e6-
96231b3b80d8
public:
explicit DIScope(const MDNode *N = 0) : DIDescriptor (N) {}
+ /// Gets the parent scope for this scope node or returns a
+ /// default constructed scope.
+ DIScopeRef getContext() const;
StringRef getFilename() const;
StringRef getDirectory() const;
class DIScopeRef {
template <typename DescTy>
friend DescTy DIDescriptor::getFieldAs(unsigned Elt) const;
+ friend DIScopeRef DIScope::getContext() const;
/// Val can be either a MDNode or a MDString, in the latter,
/// MDString specifies the type identifier.
// Don't generate a hash for anything scoped inside a function.
if (Parent.isSubprogram())
return false;
- Parent = DD->getScopeContext(Parent);
+ Parent = DD->resolve(Parent.getContext());
}
return true;
}
DIScope DwarfDebug::resolve(DIScopeRef SRef) const {
return SRef.resolve(TypeIdentifierMap);
}
-
-// If the current node has a parent scope then return that,
-// else return an empty scope.
-DIScope DwarfDebug::getScopeContext(DIScope S) const {
-
- if (S.isType())
- return resolve(DIType(S).getContext());
-
- if (S.isSubprogram())
- return DISubprogram(S).getContext();
-
- if (S.isLexicalBlock())
- return DILexicalBlock(S).getContext();
-
- if (S.isLexicalBlockFile())
- return DILexicalBlockFile(S).getContext();
-
- if (S.isNameSpace())
- return DINameSpace(S).getContext();
-
- assert((S.isFile() || S.isCompileUnit()) && "Unhandled type of scope.");
- return DIScope();
-}
/// or another context nested inside a subprogram.
bool isSubprogramContext(const MDNode *Context);
- /// Gets the parent scope for this scope node or returns a
- /// default constructed scope.
- DIScope getScopeContext(DIScope S) const;
};
} // End of namespace llvm
return getField(DbgNode, 4);
}
+// If the current node has a parent scope then return that,
+// else return an empty scope.
+DIScopeRef DIScope::getContext() const {
+
+ if (isType())
+ return DIType(DbgNode).getContext();
+
+ if (isSubprogram())
+ return DIScopeRef(DISubprogram(DbgNode).getContext());
+
+ if (isLexicalBlock())
+ return DIScopeRef(DILexicalBlock(DbgNode).getContext());
+
+ if (isLexicalBlockFile())
+ return DIScopeRef(DILexicalBlockFile(DbgNode).getContext());
+
+ if (isNameSpace())
+ return DIScopeRef(DINameSpace(DbgNode).getContext());
+
+ assert((isFile() || isCompileUnit()) && "Unhandled type of scope.");
+ return DIScopeRef(NULL);
+}
+
StringRef DIScope::getFilename() const {
if (!DbgNode)
return StringRef();