<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>