<div dir="ltr">Why is this a special case for modules? (because the types appear in the weird special case/nested inside the DW_TAG_module?) I take it this is already done for other types?</div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jul 20, 2017 at 7:08 PM Adrian Prantl via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br>
Date: Thu Jul 20 19:07:33 2017<br>
New Revision: 308710<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=308710&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=308710&view=rev</a><br>
Log:<br>
dsymutil: strip unused types from imported DW_TAG_modules<br>
<br>
This patch teaches dsymutil to strip types from the imported<br>
DW_TAG_module inside of an object file (not inside the PCM) if they<br>
can be resolved to the full definition inside the PCM. This reduces<br>
the size of the .dSYM from WebCore from <a href="http://webkit.org" rel="noreferrer" target="_blank">webkit.org</a> by almost 2/3.<br>
<br>
<rdar://problem/33047213><br>
<br>
Added:<br>
    llvm/trunk/test/tools/dsymutil/Inputs/modules/2.o<br>
Modified:<br>
    llvm/trunk/test/tools/dsymutil/Inputs/modules/1.o<br>
    llvm/trunk/test/tools/dsymutil/X86/modules.m<br>
    llvm/trunk/tools/dsymutil/DwarfLinker.cpp<br>
<br>
Modified: llvm/trunk/test/tools/dsymutil/Inputs/modules/1.o<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/modules/1.o?rev=308710&r1=308709&r2=308710&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/modules/1.o?rev=308710&r1=308709&r2=308710&view=diff</a><br>
==============================================================================<br>
Binary files llvm/trunk/test/tools/dsymutil/Inputs/modules/1.o (original) and llvm/trunk/test/tools/dsymutil/Inputs/modules/1.o Thu Jul 20 19:07:33 2017 differ<br>
<br>
Added: llvm/trunk/test/tools/dsymutil/Inputs/modules/2.o<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/modules/2.o?rev=308710&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/modules/2.o?rev=308710&view=auto</a><br>
==============================================================================<br>
Binary files llvm/trunk/test/tools/dsymutil/Inputs/modules/2.o (added) and llvm/trunk/test/tools/dsymutil/Inputs/modules/2.o Thu Jul 20 19:07:33 2017 differ<br>
<br>
Modified: llvm/trunk/test/tools/dsymutil/X86/modules.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/X86/modules.m?rev=308710&r1=308709&r2=308710&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/X86/modules.m?rev=308710&r1=308709&r2=308710&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/dsymutil/X86/modules.m (original)<br>
+++ llvm/trunk/test/tools/dsymutil/X86/modules.m Thu Jul 20 19:07:33 2017<br>
@@ -11,9 +11,11 @@<br>
 EOF<br>
    clang -D BAR_H -E -o Bar.h modules.m<br>
    clang -D FOO_H -E -o Foo.h modules.m<br>
-   clang -cc1 -emit-obj -fmodules -fmodule-map-file=modules.modulemap \<br>
-     -fmodule-format=obj -g -dwarf-ext-refs -fmodules-cache-path=. \<br>
-     -fdisable-module-hash modules.m -o 1.o<br>
+   clang -D ODR_VIOLATION_C -E -o odr_violation.c modules.m<br>
+   clang -c -fmodules -fmodule-map-file=modules.modulemap \<br>
+     -g -gmodules -fmodules-cache-path=. \<br>
+     -Xclang -fdisable-module-hash modules.m -o 1.o<br>
+   clang -c -g odr_violation.c -o 2.o<br>
 */<br>
<br>
 // RUN: llvm-dsymutil -f -oso-prepend-path=%p/../Inputs/modules \<br>
@@ -57,7 +59,7 @@ struct PruneMeNot;<br>
 // CHECK: 0x0[[FOO:.*]]:  DW_TAG_module<br>
 // CHECK-NEXT:              DW_AT_name{{.*}}"Foo"<br>
 // CHECK-NOT:               DW_TAG<br>
-// CHECK:                   DW_TAG_typedef<br>
+// CHECK: 0x0[[BARTD:.*]]: DW_TAG_typedef<br>
 // CHECK-NOT:                 DW_TAG<br>
 // CHECK:                     DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[BAR]])<br>
 // CHECK:                   DW_TAG_structure_type<br>
@@ -75,19 +77,25 @@ struct S {};<br>
 }<br>
 @end<br>
<br>
+#else<br>
+// ---------------------------------------------------------------------<br>
+#ifdef ODR_VIOLATION_C<br>
+// ---------------------------------------------------------------------<br>
+<br>
+struct Bar {<br>
+  int i;<br>
+};<br>
+typedef struct Bar Bar;<br>
+Bar odr_violation = { 42 };<br>
+<br>
 // ---------------------------------------------------------------------<br>
 #else<br>
 // ---------------------------------------------------------------------<br>
<br>
 // CHECK:  DW_TAG_compile_unit<br>
 // CHECK:    DW_AT_low_pc<br>
-// CHECK-NOT:DW_TAG<br>
-// CHECK:     DW_TAG_module<br>
-// CHECK-NEXT:  DW_AT_name{{.*}}"Foo"<br>
-// CHECK-NOT:   DW_TAG<br>
-// CHECK:       DW_TAG_typedef<br>
-// CHECK-NOT:     DW_TAG<br>
-// CHECK:       NULL<br>
+// CHECK-NOT:  DW_TAG_module<br>
+// CHECK-NOT:  DW_TAG_typedef<br>
 //<br>
 // CHECK:   DW_TAG_imported_declaration<br>
 // CHECK-NOT: DW_TAG<br>
@@ -97,6 +105,10 @@ struct S {};<br>
 // CHECK:     DW_AT_name {{.*}}"main"<br>
 //<br>
 // CHECK:     DW_TAG_variable<br>
+// CHECK-NOT:   DW_TAG<br>
+// CHECK:       DW_AT_name{{.*}}"bar"<br>
+// CHECK-NOT:   DW_TAG<br>
+// CHECK:       DW_AT_type [DW_FORM_ref_addr] (0x{{0*}}[[BARTD]]<br>
 // CHECK:     DW_TAG_variable<br>
 // CHECK-NOT:   DW_TAG<br>
 // CHECK:       DW_AT_name{{.*}}"foo"<br>
@@ -105,13 +117,26 @@ struct S {};<br>
 //<br>
 // CHECK: 0x{{0*}}[[PTR]]: DW_TAG_pointer_type<br>
 // CHECK-NEXT   DW_AT_type [DW_FORM_ref_addr] {0x{{0*}}[[INTERFACE]])<br>
+extern int odr_violation;<br>
<br>
 @import Foo;<br>
 int main(int argc, char **argv) {<br>
   Bar bar;<br>
   Foo *foo = 0;<br>
-  bar.value = 42;<br>
+  bar.value = odr_violation;<br>
   return bar.value;<br>
 }<br>
 #endif<br>
 #endif<br>
+#endif<br>
+<br>
+// CHECK: DW_TAG_compile_unit<br>
+// CHECK:   DW_AT_name {{.*}}"odr_violation.c"<br>
+// CHECK: DW_TAG_variable<br>
+// CHECK:   DW_AT_name {{.*}}"odr_violation"<br>
+// CHECK:   DW_AT_type [DW_FORM_ref4] ({{.*}}{0x{{0*}}[[BAR2:.*]]})<br>
+// CHECK: 0x{{0*}}[[BAR2]]: DW_TAG_typedef<br>
+// CHECK:   DW_AT_type [DW_FORM_ref4] ({{.*}}{0x{{0*}}[[BAR3:.*]]})<br>
+// CHECK:   DW_AT_name {{.*}}"Bar"<br>
+// CHECK: 0x{{0*}}[[BAR3]]: DW_TAG_structure_type<br>
+// CHECK-NEXT:   DW_AT_name {{.*}}"Bar"<br>
<br>
Modified: llvm/trunk/tools/dsymutil/DwarfLinker.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=308710&r1=308709&r2=308710&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLinker.cpp?rev=308710&r1=308709&r2=308710&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (original)<br>
+++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Thu Jul 20 19:07:33 2017<br>
@@ -98,6 +98,7 @@ class DeclContext {<br>
   uint32_t Line;<br>
   uint32_t ByteSize;<br>
   uint16_t Tag;<br>
+  unsigned DefinedInClangModule : 1;<br>
   StringRef Name;<br>
   StringRef File;<br>
   const DeclContext &Parent;<br>
@@ -112,15 +113,17 @@ public:<br>
<br>
   DeclContext()<br>
       : QualifiedNameHash(0), Line(0), ByteSize(0),<br>
-        Tag(dwarf::DW_TAG_compile_unit), Name(), File(), Parent(*this),<br>
-        LastSeenDIE(), LastSeenCompileUnitID(0), CanonicalDIEOffset(0) {}<br>
+        Tag(dwarf::DW_TAG_compile_unit), DefinedInClangModule(0), Name(),<br>
+        File(), Parent(*this), LastSeenDIE(), LastSeenCompileUnitID(0),<br>
+        CanonicalDIEOffset(0) {}<br>
<br>
   DeclContext(unsigned Hash, uint32_t Line, uint32_t ByteSize, uint16_t Tag,<br>
               StringRef Name, StringRef File, const DeclContext &Parent,<br>
               DWARFDie LastSeenDIE = DWARFDie(), unsigned CUId = 0)<br>
       : QualifiedNameHash(Hash), Line(Line), ByteSize(ByteSize), Tag(Tag),<br>
-        Name(Name), File(File), Parent(Parent), LastSeenDIE(LastSeenDIE),<br>
-        LastSeenCompileUnitID(CUId), CanonicalDIEOffset(0) {}<br>
+        DefinedInClangModule(0), Name(Name), File(File), Parent(Parent),<br>
+        LastSeenDIE(LastSeenDIE), LastSeenCompileUnitID(CUId),<br>
+        CanonicalDIEOffset(0) {}<br>
<br>
   uint32_t getQualifiedNameHash() const { return QualifiedNameHash; }<br>
<br>
@@ -129,6 +132,9 @@ public:<br>
   uint32_t getCanonicalDIEOffset() const { return CanonicalDIEOffset; }<br>
   void setCanonicalDIEOffset(uint32_t Offset) { CanonicalDIEOffset = Offset; }<br>
<br>
+  bool isDefinedInClangModule() const { return DefinedInClangModule; }<br>
+  void setDefinedInClangModule(bool Val) { DefinedInClangModule = Val; }<br>
+<br>
   uint16_t getTag() const { return Tag; }<br>
   StringRef getName() const { return Name; }<br>
 };<br>
@@ -1801,6 +1807,8 @@ static bool analyzeContextInfo(const DWA<br>
       CurrentDeclContext = PtrInvalidPair.getPointer();<br>
       Info.Ctxt =<br>
           PtrInvalidPair.getInt() ? nullptr : PtrInvalidPair.getPointer();<br>
+      if (Info.Ctxt)<br>
+        Info.Ctxt->setDefinedInClangModule(InClangModule);<br>
     } else<br>
       Info.Ctxt = CurrentDeclContext = nullptr;<br>
   }<br>
@@ -2172,7 +2180,6 @@ unsigned DwarfLinker::shouldKeepDIE(Relo<br>
     return shouldKeepVariableDIE(RelocMgr, DIE, Unit, MyInfo, Flags);<br>
   case dwarf::DW_TAG_subprogram:<br>
     return shouldKeepSubprogramDIE(RelocMgr, DIE, Unit, MyInfo, Flags);<br>
-  case dwarf::DW_TAG_module:<br>
   case dwarf::DW_TAG_imported_module:<br>
   case dwarf::DW_TAG_imported_declaration:<br>
   case dwarf::DW_TAG_imported_unit:<br>
@@ -2232,6 +2239,8 @@ void DwarfLinker::keepDIEAndDependencies<br>
             resolveDIEReference(*this, Units, Val, Unit, Die, ReferencedCU)) {<br>
       uint32_t RefIdx = ReferencedCU->getOrigUnit().getDIEIndex(RefDIE);<br>
       CompileUnit::DIEInfo &Info = ReferencedCU->getInfo(RefIdx);<br>
+      bool IsModuleRef = Info.Ctxt && Info.Ctxt->getCanonicalDIEOffset() &&<br>
+                         Info.Ctxt->isDefinedInClangModule();<br>
       // If the referenced DIE has a DeclContext that has already been<br>
       // emitted, then do not keep the one in this CU. We'll link to<br>
       // the canonical DIE in cloneDieReferenceAttribute.<br>
@@ -2240,7 +2249,8 @@ void DwarfLinker::keepDIEAndDependencies<br>
       // ReferencedCU->hasODR() && CU.hasODR().<br>
       // FIXME: compatibility with dsymutil-classic. There is no<br>
       // reason not to unique ref_addr references.<br>
-      if (AttrSpec.Form != dwarf::DW_FORM_ref_addr && UseODR && Info.Ctxt &&<br>
+      if (AttrSpec.Form != dwarf::DW_FORM_ref_addr && (UseODR || IsModuleRef) &&<br>
+          Info.Ctxt &&<br>
           Info.Ctxt != ReferencedCU->getInfo(Info.ParentIdx).Ctxt &&<br>
           Info.Ctxt->getCanonicalDIEOffset() && isODRAttribute(AttrSpec.Attr))<br>
         continue;<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>