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