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

Michael Eager eager at eagercon.com
Mon Sep 15 10:56:09 PDT 2014


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.

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

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.

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

-- 
Michael Eager	 eager at eagercon.com
1960 Park Blvd., Palo Alto, CA 94306  650-325-8077


More information about the Dwarf-Discuss mailing list