[llvm] r218702 - Disable the -gmlt optimization implemented in r218129 under Darwin due to issues with dsymutil.

Justin Bogner mail at justinbogner.com
Tue Sep 30 21:08:24 PDT 2014


David Blaikie <dblaikie at gmail.com> writes:
> Author: dblaikie
> Date: Tue Sep 30 16:28:32 2014
> New Revision: 218702
>
> URL: http://llvm.org/viewvc/llvm-project?rev=218702&view=rev
> Log:
> Disable the -gmlt optimization implemented in r218129 under Darwin due
> to issues with dsymutil.

This is causing a test failure on darwin:

    http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/4936/steps/run.llvm.tests/logs/LLVM%3A%3Agmlt.test

I'll revert in a bit if you're not around.

> r218129 omits DW_TAG_subprograms which have no inlined subroutines when
> emitting -gmlt data. This makes -gmlt very low cost for -O0 builds.
>
> Darwin's dsymutil reasonably considers a CU empty if it has no
> subprograms (which occurs with the above optimization in -O0 programs
> without any force_inline function calls) and drops the line table, CU,
> and everything in this situation, making backtraces impossible.
>
> Until dsymutil is modified to account for this, disable this
> optimization on Darwin to preserve the desired functionality.
> (see r218545, which should be reverted after this patch, for other
> discussion/details)
>
> Footnote:
> In the long term, it doesn't look like this scheme (of simplified debug
> info to describe inlining to enable backtracing) is tenable, it is far
> too size inefficient for optimized code (the DW_TAG_inlined_subprograms,
> even once compressed, are nearly twice as large as the line table
> itself (also compressed)) and we'll be considering things like Cary's
> two level line table proposal to encode all this information directly in
> the line table.
>
> Modified:
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>     llvm/trunk/test/DebugInfo/gmlt.ll
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=218702&r1=218701&r2=218702&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Sep 30 16:28:32 2014
> @@ -171,6 +171,7 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Mo
>        GlobalRangeCount(0), InfoHolder(A, "info_string", DIEValueAllocator),
>        UsedNonDefaultText(false),
>        SkeletonHolder(A, "skel_string", DIEValueAllocator),
> +      IsDarwin(Triple(A->getTargetTriple()).isOSDarwin()),
>        AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
>                                         dwarf::DW_FORM_data4)),
>        AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,
> @@ -190,8 +191,6 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Mo
>  
>    // Turn on accelerator tables for Darwin by default, pubnames by
>    // default for non-Darwin, and handle split dwarf.
> -  bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin();
> -
>    if (DwarfAccelTables == Default)
>      HasDwarfAccelTables = IsDarwin;
>    else
> @@ -1698,7 +1697,7 @@ void DwarfDebug::endFunction(const Machi
>    // Under -gmlt, skip building the subprogram if there are no inlined
>    // subroutines inside it.
>    if (TheCU.getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly &&
> -      LScopes.getAbstractScopesList().empty()) {
> +      LScopes.getAbstractScopesList().empty() && !IsDarwin) {
>      assert(ScopeVariables.empty());
>      assert(CurrentFnArguments.empty());
>      assert(DbgValues.empty());
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=218702&r1=218701&r2=218702&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Sep 30 16:28:32 2014
> @@ -319,6 +319,7 @@ class DwarfDebug : public AsmPrinterHand
>  
>    // True iff there are multiple CUs in this module.
>    bool SingleCU;
> +  bool IsDarwin;
>  
>    AddressPool AddrPool;
>  
>
> Modified: llvm/trunk/test/DebugInfo/gmlt.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/gmlt.ll?rev=218702&r1=218701&r2=218702&view=diff
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/gmlt.ll (original)
> +++ llvm/trunk/test/DebugInfo/gmlt.ll Tue Sep 30 16:28:32 2014
> @@ -1,5 +1,7 @@
>  ; REQUIRES: object-emission
>  ; RUN: %llc_dwarf -O0 -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s
> +; RUN: %llc_dwarf -O0 -filetype=obj < %s -mtriple x86_64-apple-darwin | llvm-dwarfdump - \
> +; RUN:     | FileCheck --check-prefix=CHECK --check-prefix=DARWIN %s
>  
>  ; Generated from the following source compiled with clang++ -gmlt:
>  ; void f1() {}
> @@ -17,6 +19,25 @@
>  ; CHECK:   DW_AT_ranges [DW_FORM_sec_offset] (0x00000000)
>  ; CHECK-NOT: {{DW_TAG|NULL}}
>  
> +; Omitting the subprograms without inlined subroutines is not possible
> +; currently on Darwin as dsymutil will drop the whole CU if it has no subprograms
> +; (which happens with this optimization if there are no inlined subroutines).
> +
> +; DARWIN:  DW_TAG_subprogram
> +; DARWIN-NOT: DW_TAG
> +; DARWIN:    DW_AT_name {{.*}} "f1"
> +; DARWIN-NOT: {{DW_TAG|NULL}}
> +; DARWIN:  DW_TAG_subprogram
> +; DARWIN-NOT: DW_TAG
> +; DARWIN:    DW_AT_name {{.*}} "f2"
> +; DARWIN-NOT: {{DW_TAG|NULL}}
> +; DARWIN:  DW_TAG_subprogram
> +; DARWIN-NOT: DW_TAG
> +; Can't check the abstract_origin value across the DARWIN/CHECK checking and
> +; ordering, so don't bother - just trust me, it refers to f3 down there.
> +; DARWIN:    DW_AT_abstract_origin
> +; DARWIN-NOT: {{DW_TAG|NULL}}
> +
>  
>  ; FIXME: Emitting separate abstract definitions is inefficient when we could
>  ; just attach the DW_AT_name to the inlined_subroutine directly. Except that
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list