[llvm] r233165 - Linker: Temporarily disable dwarfdump checks from r233164
Duncan P. N. Exon Smith
dexonsmith at apple.com
Wed Mar 25 13:01:50 PDT 2015
> On 2015-Mar-25, at 11:56, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>
>>
>> On 2015-Mar-25, at 10:50, David Blaikie <dblaikie at gmail.com> wrote:
>>
>>
>>
>> On Wed, Mar 25, 2015 at 10:45 AM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>
>>> On 2015-Mar-25, at 10:24, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>>
>>>>
>>>> On 2015-Mar-25, at 10:12, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
>>>>
>>>> Good point, I guess I'm not being very creative :/. Peter also obliged
>>>> [1] my request for a dump on Linux, which I've reproduced locally by
>>>> specifying -mtriple=x86_64-unknown-linux. What's going wrong is the
>>>> second compile unit is missing the subprogram for the weak ("winning")
>>>> function.
>>>>
>>>> [1]: https://llvm.org/bugs/show_bug.cgi?id=22792#c7 "Output on Linux"
>>>>
>>>> This DWARF is wrong, right? (I.e., are the expected differences in
>>>> debug info between Linux and Darwin all in the frontend generation
>>>> logic?)
>>>
>>> Just talked to Adrian offline; answer is "yes". I'll see if I can figure
>>> this out and just revert r233165.
>>
>> Interestingly, in assembly both darwin and linux are "missing" things.
>>
>> On darwin, we get the subprogram for the smaller compile unit, but not
>> the compile unit.
>>
>> Not sure if relevant, but Darwin's linker or something likes to drop CUs with no subprograms... (I hit this when improving -gmlt output size)
>
> Found the cause in `DwarfDebug::endFunction()`, added in r218129:
>
> // Under -gmlt, skip building the subprogram if there are no inlined
> // subroutines inside it.
> if (TheCU.getCUNode().getEmissionKind() == DIBuilder::LineTablesOnly &&
> LScopes.getAbstractScopesList().empty() && !IsDarwin) {
> assert(InfoHolder.getScopeVariables().empty());
> assert(DbgValues.empty());
> // FIXME: This wouldn't be true in LTO with a -g (with inlining) CU followed
> // by a -gmlt CU. Add a test and remove this assertion.
> assert(AbstractVariables.empty());
> LabelsBeforeInsn.clear();
> LabelsAfterInsn.clear();
> PrevLabel = nullptr;
> CurFn = nullptr;
> return;
> }
>
> Added in r218129. Note the `IsDarwin` flag, whose logic was added in
> r218129:
>
> Disable the -gmlt optimization implemented in r218129 under Darwin due to issues with dsymutil.
>
> 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.
>
> So I guess the difference is expected, and this test needs to be
> target-specific?
>
On the contrary, I think I found a way to CHECK the line tables
directly (in a platform-neutral way); see r233207.
More information about the llvm-commits
mailing list