Debug Info: move DIScope::getContext to DwarfDebug.
authorManman Ren <manman.ren@gmail.com>
Mon, 9 Sep 2013 19:23:58 +0000 (19:23 +0000)
committerManman Ren <manman.ren@gmail.com>
Mon, 9 Sep 2013 19:23:58 +0000 (19:23 +0000)
DIScope::getContext is a wrapper function that calls the specific getContext
method on each subclass. When we switch DIType::getContext to return DIScopeRef
instead of DIScope, DIScope::getContext can no longer return a DIScope without
a type identifier map.

DIScope::getContext is only used by DwarfDebug, so we move it to DwarfDebug
to have easy access to the type identifier map.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@190330 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/DebugInfo.h
lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.h
lib/IR/DebugInfo.cpp

index df9c0c782be88692df494c3ab3919962cb27deee..a758fcc7bcdb6869035c028ab4fe2c77fcc107ae 100644 (file)
@@ -200,9 +200,6 @@ 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;
 
index 6ec68834cf21d7f44d030a61f1b56c34ab7792d9..f9ce5918335dfb684d9affb0c621490680b5ce74 100644 (file)
@@ -913,19 +913,19 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
 
 /// Return true if the type is appropriately scoped to be contained inside
 /// its own type unit.
-static bool isTypeUnitScoped(DIType Ty) {
+static bool isTypeUnitScoped(DIType Ty, const DwarfDebug *DD) {
   DIScope Parent = Ty.getContext();
   while (Parent) {
     // Don't generate a hash for anything scoped inside a function.
     if (Parent.isSubprogram())
       return false;
-    Parent = Parent.getContext();
+    Parent = DD->getScopeContext(Parent);
   }
   return true;
 }
 
 /// Return true if the type should be split out into a type unit.
-static bool shouldCreateTypeUnit(DICompositeType CTy) {
+static bool shouldCreateTypeUnit(DICompositeType CTy, const DwarfDebug *DD) {
   uint16_t Tag = CTy.getTag();
 
   switch (Tag) {
@@ -936,7 +936,7 @@ static bool shouldCreateTypeUnit(DICompositeType CTy) {
     // If this is a class, structure, union, or enumeration type
     // that is not a declaration, is a type definition, and not scoped
     // inside a function then separate this out as a type unit.
-    if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy))
+    if (CTy.isForwardDecl() || !isTypeUnitScoped(CTy, DD))
       return 0;
     return 1;
   default:
@@ -1138,7 +1138,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
   }
   // If this is a type applicable to a type unit it then add it to the
   // list of types we'll compute a hash for later.
-  if (shouldCreateTypeUnit(CTy))
+  if (shouldCreateTypeUnit(CTy, DD))
     DD->addTypeUnitType(&Buffer);
 }
 
index bdcb813e227b2eff0245f1795b81d6b4cfb32948..1cfadc91e0393e35babba02c8d687ca43b7a7b8d 100644 (file)
@@ -2650,3 +2650,26 @@ void DwarfDebug::emitDebugStrDWO() {
 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 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();
+}
index f8c27d950ecc828d4c5e4aa93e470e99933a3c3b..afac39c5226e597ff0a5a9d6ea613f3782d5ce95 100644 (file)
@@ -690,6 +690,9 @@ public:
   /// 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
 
index 4546098bc3d0feafac016f4db59b5c413983f77e..dc22db3b01bcd875db4b1484987731073f075046 100644 (file)
@@ -779,29 +779,6 @@ 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();
-
-  assert((isFile() || isCompileUnit()) && "Unhandled type of scope.");
-  return DIScope();
-}
-
 StringRef DIScope::getFilename() const {
   if (!DbgNode)
     return StringRef();