[Dwarf-Discuss] Is this legal DWARF, and if so, what does it mean?

John DelSignore John.DelSignore at roguewave.com
Mon Sep 15 12:32:57 PDT 2014


Hi Michael,

Thanks for the reply. In-line below...

Michael Eager wrote:
> On 09/15/14 10:32, John DelSignore wrote:
>> Hi,
>>
>> TotalView has a customer that has C++ code that produces the
>> following DWARF with the Intel 12.1
>> compiler:
>
> ICC generates a lot of idiosyncratic DWARF.
I would not disagree with that statement!
>
>>
>>   <0><1192a2>: Abbrev Number: 1 (DW_TAG_compile_unit)
>>       DW_AT_comp_dir    : ...SNIPPED...
>>       DW_AT_language    : 4    (C++)
>>       DW_AT_name        : ...SNIPPED...
>>       DW_AT_producer    : Intel(R) C++ Intel(R) 64 Compiler XE for
>> applications running on Intel(R)
>> 64, Version 12.1 Build 20110811
>>   Fixes SameLinkageName MemberPointers
>>
>>       DW_AT_stmt_list   : 0x5d20
>>   <1><119376>: Abbrev Number: 2 (DW_TAG_namespace)
>>       DW_AT_name        : std
>> ...SNIPPED...
>>   <2><268209>: Abbrev Number: 37 (DW_TAG_lexical_block)
>>       DW_AT_decl_line   : 1301
>>       DW_AT_decl_column : 79
>>       DW_AT_decl_file   : 1
>>       DW_AT_low_pc      : 0xb02a1
>>       DW_AT_high_pc     : 0xb02d4
>>   <3><26821e>: Abbrev Number: 38 (DW_TAG_lexical_block)
>>       DW_AT_decl_line   : 1351
>>       DW_AT_decl_column : 31
>>       DW_AT_decl_file   : 1
>>       DW_AT_low_pc      : 0xb03a7
>>       DW_AT_high_pc     : 0xb03f7
>> <2><268234>: Abbrev Number: 16 (DW_TAG_inlined_subroutine)
>> ...SNIPPED...
>>
>> Notice:
>>
>>  1. The lexical block at <268209> is at "std" namespace scope. What
>> does it mean to have a lexical
>>     block at namespace scope? Note that that lexical block contains
>> /only/ another lexical block at
>>     <26821e>; no subroutines or variables.
>
> Looks unnecessary to me.  Do you have the source for this file?
Unfortunately, I don't. All I have is a shared library that the customer
sent us.
>
> I guess this might be generated if you had something like
>
>   namespace std
>   {
>     {
>       {
>         /* whatever */
>       }
>     }
>   }
>
> But my guess is that the original source did not look like this.
I omitted a bunch of DWARF from my original email, but the DWARF in
question did appear to be inside "namespace std {}", because the names
of the surrounding DIEs were consistent with variables/functions one
would expect to find in "std::", but I don't know that for certain.

Cheers, John D.
>
>>  2. The lexical block at <26821e> has an address range that is not
>> nested inside its containing
>>     lexical block's address range. Is that legal, and if so, what
>> does that mean? Note that that
>>     lexical block contains nothing else; no subroutines, blocks, or
>> variables.
>
> Maybe legal.  The DWARF tree indicates the static nesting.  If a
> compiler generated
> code/data for a nested scope at a different location from the
> containing scope, then
> maybe it might describe the lexical block with a different address range.
>
> Since the lexical block is empty, I'm not sure that this really has
> any meaning.
>
> ICC does a significant amount of code movement during optimization.  I
> think
> that it doesn't clean up all of the DWARF when it moves code and is
> accidentally
> leaving a now-empty lexical block behind.
>


More information about the Dwarf-Discuss mailing list