[Dwarf-Discuss] regarding DW_TAG_subroutine_type usage

John DelSignore jdelsign@totalviewtech.com
Tue Sep 8 13:28:48 GMT 2009


And as a specific example of a typedef that Roland is talking about, consider the following:

lid:/home/jdelsign>cat foo.cxx
typedef int (*fnp_t)(double);
fnp_t p;
lid:/home/jdelsign>g++ foo.cxx -c -g
lid:/home/jdelsign>readelf -wi foo.o
The section .debug_info contains:

  Compilation Unit @ offset 0x0:
   Length:        171
   Version:       2
   Abbrev Offset: 0
   Pointer Size:  4
 <0><b>: Abbrev Number: 1 (DW_TAG_compile_unit)
     DW_AT_stmt_list   : 0
     DW_AT_high_pc     : 0
     DW_AT_low_pc      : 0
     DW_AT_producer    : GNU C++ 4.1.1 20070105 (Red Hat 4.1.1-51)
     DW_AT_language    : 4      (C++)
     DW_AT_name        : foo.cxx
     DW_AT_comp_dir    : /home/jdelsign
 <1><5a>: Abbrev Number: 2 (DW_TAG_typedef)
     DW_AT_name        : fnp_t
     DW_AT_decl_file   : 2
     DW_AT_decl_line   : 1
     DW_AT_type        : <67>
 <1><67>: Abbrev Number: 3 (DW_TAG_pointer_type)
     DW_AT_byte_size   : 4
     DW_AT_type        : <6d>
 <1><6d>: Abbrev Number: 4 (DW_TAG_subroutine_type)
     DW_AT_sibling     : <7c>
     DW_AT_type        : <7c>
 <2><76>: Abbrev Number: 5 (DW_TAG_formal_parameter)
     DW_AT_type        : <83>
 <1><7c>: Abbrev Number: 6 (DW_TAG_base_type)
     DW_AT_name        : int
     DW_AT_byte_size   : 4
     DW_AT_encoding    : 5      (signed)
 <1><83>: Abbrev Number: 6 (DW_TAG_base_type)
     DW_AT_name        : double
     DW_AT_byte_size   : 8
     DW_AT_encoding    : 4      (float)
 <1><8d>: Abbrev Number: 7 (DW_TAG_namespace)
     DW_AT_sibling     : <a3>
     DW_AT_name        : ::
     DW_AT_decl_file   : 1
     DW_AT_decl_line   : 0
 <2><97>: Abbrev Number: 8 (DW_TAG_variable)
     DW_AT_name        : p
     DW_AT_decl_file   : 2
     DW_AT_decl_line   : 2
     DW_AT_type        : <5a>
     DW_AT_external    : 1
     DW_AT_declaration : 1
 <1><a3>: Abbrev Number: 9 (DW_TAG_variable)
     DW_AT_specification: <97>
     DW_AT_location    : 5 byte block: 3 0 0 0 0        (DW_OP_addr: 0)

lid:/home/jdelsign>

So, "fnp_t" is a typedef of a pointer to a function that takes a double formal parameter and returns int.

The typedef has a name, which is "fnp_t". The pointer type and the function type do not have names, which is correctly reflected in the DWARF generated by this version of GCC.

Cheers, John D.


Roland McGrath wrote:
> DW_TAG_subroutine_type is for a function type, not a particular function.
> You may be looking for DW_TAG_subprogram, which is the entry for a function,
> rather than for a function type.  (Note the DW_AT_type attribute of a
> DW_TAG_subprogram is that function's return type, not the function type.)
> 
> Ordinarily in C and C++, function types do not get names.  Rather, there
> might be a named DW_TAG_typedef that points to a function type, or another
> unnamed type entry like a DW_TAG_pointer_type that points to one.
> 
> An enum, struct, or class entry will have a DW_AT_name if it does in the
> source, but none for e.g. "enum { a, b };" or "struct { int x; } ...".
> 
> Also note that any particular entry will sometimes lack DW_AT_name and
> other attributes you might expect, if it's a derived entry with a
> DW_AT_abstract_origin or DW_AT_specification attribute pointing to another
> entry where DW_AT_name might be found.
> 
> 
> Thanks,
> Roland
> _______________________________________________
> Dwarf-Discuss mailing list
> Dwarf-Discuss at lists.dwarfstd.org
> http://lists.dwarfstd.org/listinfo.cgi/dwarf-discuss-dwarfstd.org
> 
> 




More information about the Dwarf-discuss mailing list