OSDN Git Service

dsymutil: Don't prune forward declarations inside a module definition.
authorAdrian Prantl <aprantl@apple.com>
Wed, 23 Sep 2015 20:44:37 +0000 (20:44 +0000)
committerAdrian Prantl <aprantl@apple.com>
Wed, 23 Sep 2015 20:44:37 +0000 (20:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@248428 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/dsymutil/Inputs/modules/1.o
test/tools/dsymutil/Inputs/modules/Bar.pcm
test/tools/dsymutil/Inputs/modules/Foo.pcm
test/tools/dsymutil/X86/modules.m
tools/dsymutil/DwarfLinker.cpp

index 254ae69..e7a5293 100644 (file)
Binary files a/test/tools/dsymutil/Inputs/modules/1.o and b/test/tools/dsymutil/Inputs/modules/1.o differ
index 8d3a534..bd77ec5 100644 (file)
Binary files a/test/tools/dsymutil/Inputs/modules/Bar.pcm and b/test/tools/dsymutil/Inputs/modules/Bar.pcm differ
index 33bca2a..a715bfa 100644 (file)
Binary files a/test/tools/dsymutil/Inputs/modules/Foo.pcm and b/test/tools/dsymutil/Inputs/modules/Foo.pcm differ
index 0e82c99..63d628b 100644 (file)
@@ -9,8 +9,8 @@
        export *
      }
    EOF
-   clang -D BAR_H -E -o Bar.h
-   clang -D FOO_H -E -o Foo.h
+   clang -D BAR_H -E -o Bar.h modules.m
+   clang -D FOO_H -E -o Foo.h modules.m
    clang -cc1 -emit-obj -fmodules -fmodule-map-file=modules.modulemap \
      -fmodule-format=obj -g -dwarf-ext-refs -fmodules-cache-path=. \
      -fdisable-module-hash modules.m -o 1.o
 // CHECK-NOT:        DW_TAG
 // CHECK:              DW_TAG_module
 // CHECK-NEXT:           DW_AT_name{{.*}}"Bar"
-// CHECK-NOT:            DW_TAG
 // CHECK: 0x0[[BAR:.*]]: DW_TAG_structure_type
+// CHECK-NOT:              DW_TAG
 // CHECK:                  DW_AT_name {{.*}}"Bar"
 // CHECK-NOT:              DW_TAG
 // CHECK:                  DW_TAG_member
 // CHECK:                    DW_AT_name {{.*}}"value"
+// CHECK:                DW_TAG_structure_type
+// CHECK-NOT:              DW_TAG
+// CHECK:                  DW_AT_name {{.*}}"PruneMeNot"
 
 struct Bar {
   int value;
 };
 
+struct PruneMeNot;
+
 #else
 // ---------------------------------------------------------------------
 #ifdef FOO_H
index 818746d..1aa15c5 100644 (file)
@@ -1764,7 +1764,7 @@ static bool analyzeContextInfo(const DWARFDebugInfoEntryMinimal *DIE,
                                DeclContext *CurrentDeclContext,
                                NonRelocatableStringpool &StringPool,
                                DeclContextTree &Contexts,
-                               bool InTagModule = false) {
+                               bool InImportedModule = false) {
   unsigned MyIdx = CU.getOrigUnit().getDIEIndex(DIE);
   CompileUnit::DIEInfo &Info = CU.getInfo(MyIdx);
 
@@ -1780,11 +1780,14 @@ static bool analyzeContextInfo(const DWARFDebugInfoEntryMinimal *DIE,
   //   definitions match)."
   //
   // We treat non-C++ modules like namespaces for this reason.
-  if (DIE->getTag() == dwarf::DW_TAG_module)
-    InTagModule = true;
+  if (DIE->getTag() == dwarf::DW_TAG_module &&
+      DIE->getAttributeValueAsString(&CU.getOrigUnit(), dwarf::DW_AT_name,
+                                     "") != CU.getClangModuleName()) {
+    InImportedModule = true;
+  }
 
   Info.ParentIdx = ParentIdx;
-  if (CU.hasODR() || CU.isClangModule() || InTagModule) {
+  if (CU.hasODR() || CU.isClangModule() || InImportedModule) {
     if (CurrentDeclContext) {
       auto PtrInvalidPair = Contexts.getChildDeclContext(*CurrentDeclContext,
                                                          DIE, CU, StringPool);
@@ -1795,12 +1798,12 @@ static bool analyzeContextInfo(const DWARFDebugInfoEntryMinimal *DIE,
       Info.Ctxt = CurrentDeclContext = nullptr;
   }
 
-  Info.Prune = InTagModule;
+  Info.Prune = InImportedModule;
   if (DIE->hasChildren())
     for (auto *Child = DIE->getFirstChild(); Child && !Child->isNULL();
          Child = Child->getSibling())
       Info.Prune &= analyzeContextInfo(Child, MyIdx, CU, CurrentDeclContext,
-                                       StringPool, Contexts, InTagModule);
+                                       StringPool, Contexts, InImportedModule);
 
   // Prune this DIE if it is either a forward declaration inside a
   // DW_TAG_module or a DW_TAG_module that contains nothing but