[Dwarf-Discuss] PROPOSAL: DW_OP_implicit_pointer

Jakub Jelinek jakub at redhat.com
Mon Aug 16 00:42:18 PDT 2010


On Sun, Aug 15, 2010 at 06:30:52PM -0400, Ron Brender wrote:
> OK, good, that helps a lot. One can imagine that the internal debug
> implementation can use a kind of "unavailable but potentially
> unneeded pointer" value that is not, of itself, necessarily a user
> error until that turns out to be the value of the overall user
> expression.
> 
> Now keep going... How does DW_op_implicit_pointer help with
> disaggregated fields of a struct?

SRA optimized objects are represented using a series of
DW_OP_piece or DW_OP_bit_piece, as before, just now you can:
1) for optimized out pointers to these objects use DW_OP_implicit_pointer
2) for optimized out pointers in the fields of these SRA optimized objects
you can again use DW_OP_implicit_pointer
> 
> Your posited inline add() and non-inlined foo() functions and claimed
> 
> "Similarly in the inlined add calls you can print *a->x, a->y,
> *b->x, b->y or in foo print say *p[0].x."
> 
> Please explain, by similarly detailed example, how this works?

I'm attaching full assembly.

	Jakub
-------------- next part --------------
struct S
{
  int *x, y;
};

int u[6];

static inline void
add (struct S *a, struct S *b, int c)
{
  *a->x += *b->x;
  a->y += b->y;
  u[c + 0]++;
  a = (struct S *) 0;
  u[c + 1]++;
  a = b;
  u[c + 2]++;
}

int
foo (int i)
{
  int j = i;
  struct S p[2] = { {&i, i * 2}, {&j, j * 2} };
  add (&p[0], &p[1], 0);
  p[0].x = &j;
  p[1].x = &i;
  add (&p[0], &p[1], 3);
  return i + j;
}

int
bar (int i)
{
  int *j = &i;
  int **k = &j;
  int ***l = &k;
  i++;
  return i;
}
-------------- next part --------------
	.file	"implicitptr.c"
	.section	.debug_abbrev,"", at progbits
.Ldebug_abbrev0:
	.section	.debug_info,"", at progbits
.Ldebug_info0:
	.section	.debug_line,"", at progbits
.Ldebug_line0:
	.text
.Ltext0:
	.p2align 4,,15
	.globl	foo
	.type	foo, @function
foo:
.LFB1:
	.file 1 "implicitptr.c"
	# implicitptr.c:22
	.loc 1 22 0
	.cfi_startproc
.LVL0:
	# basic block 2
.LBB6:
.LBB7:
	# implicitptr.c:13
	.loc 1 13 0
	addl	$1, u(%rip)
.LVL1:
	# implicitptr.c:15
	.loc 1 15 0
	addl	$1, u+4(%rip)
.LVL2:
.LBE7:
.LBE6:
	# implicitptr.c:29
	.loc 1 29 0
	leal	(%rdi,%rdi,4), %eax
.LBB9:
.LBB8:
	# implicitptr.c:17
	.loc 1 17 0
	addl	$1, u+8(%rip)
.LVL3:
.LBE8:
.LBE9:
.LBB10:
.LBB11:
	# implicitptr.c:13
	.loc 1 13 0
	addl	$1, u+12(%rip)
.LVL4:
	# implicitptr.c:15
	.loc 1 15 0
	addl	$1, u+16(%rip)
.LVL5:
	# implicitptr.c:17
	.loc 1 17 0
	addl	$1, u+20(%rip)
.LBE11:
.LBE10:
	# implicitptr.c:30
	.loc 1 30 0
	ret
	.cfi_endproc
.LFE1:
	.size	foo, .-foo
	.p2align 4,,15
	.globl	bar
	.type	bar, @function
bar:
.LFB2:
	# implicitptr.c:34
	.loc 1 34 0
	.cfi_startproc
.LVL6:
	# basic block 2
	# implicitptr.c:38
	.loc 1 38 0
	leal	1(%rdi), %eax
	# implicitptr.c:40
	.loc 1 40 0
	ret
	.cfi_endproc
.LFE2:
	.size	bar, .-bar
	.comm	u,24,16
.Letext0:
	.section	.debug_types,"G", at progbits,wt.dec297e15913720c,comdat
	.long	0x46	# Length of Compilation Unit Info
	.value	0x4	# DWARF version number
	.long	.Ldebug_abbrev0	# Offset Into Abbrev. Section
	.byte	0x8	# Pointer Size (in bytes)
	.byte	0xde	# Type Signature
	.byte	0xc2
	.byte	0x97
	.byte	0xe1
	.byte	0x59
	.byte	0x13
	.byte	0x72
	.byte	0xc
	.long	0x1d	# Offset to Type DIE
	.uleb128 0x1	# (DIE (0x17) DW_TAG_type_unit)
	.byte	0x1	# DW_AT_language
	.long	.Ldebug_line0	# DW_AT_stmt_list
	.uleb128 0x2	# (DIE (0x1d) DW_TAG_structure_type)
	.ascii "S\0"	# DW_AT_name
	.byte	0x10	# DW_AT_byte_size
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x1	# DW_AT_decl_line
	.long	0x3c	# DW_AT_sibling
	.uleb128 0x3	# (DIE (0x27) DW_TAG_member)
	.ascii "x\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x3	# DW_AT_decl_line
	.long	0x3c	# DW_AT_type
	.byte	0	# DW_AT_data_member_location
	.uleb128 0x3	# (DIE (0x31) DW_TAG_member)
	.ascii "y\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x3	# DW_AT_decl_line
	.long	0x42	# DW_AT_type
	.byte	0x8	# DW_AT_data_member_location
	.byte	0	# end of children of DIE 0x1d
	.uleb128 0x4	# (DIE (0x3c) DW_TAG_pointer_type)
	.byte	0x8	# DW_AT_byte_size
	.long	0x42	# DW_AT_type
	.uleb128 0x5	# (DIE (0x42) DW_TAG_base_type)
	.byte	0x4	# DW_AT_byte_size
	.byte	0x5	# DW_AT_encoding
	.ascii "int\0"	# DW_AT_name
	.byte	0	# end of children of DIE 0x17
	.section	.debug_info
	.long	0x1c6	# Length of Compilation Unit Info
	.value	0x4	# DWARF version number
	.long	.Ldebug_abbrev0	# Offset Into Abbrev. Section
	.byte	0x8	# Pointer Size (in bytes)
	.uleb128 0x6	# (DIE (0xb) DW_TAG_compile_unit)
	.long	.LASF1	# DW_AT_producer: "GNU C 4.6.0 20100811 (experimental)"
	.byte	0x1	# DW_AT_language
	.long	.LASF2	# DW_AT_name: "implicitptr.c"
	.long	.LASF3	# DW_AT_comp_dir: "/usr/src/gcc/obj204/gcc"
	.quad	.Ltext0	# DW_AT_low_pc
	.quad	.Letext0	# DW_AT_high_pc
	.long	.Ldebug_line0	# DW_AT_stmt_list
	.uleb128 0x4	# (DIE (0x2d) DW_TAG_pointer_type)
	.byte	0x8	# DW_AT_byte_size
	.long	0x33	# DW_AT_type
	.uleb128 0x5	# (DIE (0x33) DW_TAG_base_type)
	.byte	0x4	# DW_AT_byte_size
	.byte	0x5	# DW_AT_encoding
	.ascii "int\0"	# DW_AT_name
	.uleb128 0x7	# (DIE (0x3a) DW_TAG_subprogram)
	.ascii "add\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x9	# DW_AT_decl_line
			# DW_AT_prototyped
	.byte	0x3	# DW_AT_inline
	.long	0x62	# DW_AT_sibling
	.uleb128 0x8	# (DIE (0x46) DW_TAG_formal_parameter)
	.ascii "a\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x9	# DW_AT_decl_line
	.long	0x62	# DW_AT_type
	.uleb128 0x8	# (DIE (0x4f) DW_TAG_formal_parameter)
	.ascii "b\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x9	# DW_AT_decl_line
	.long	0x62	# DW_AT_type
	.uleb128 0x8	# (DIE (0x58) DW_TAG_formal_parameter)
	.ascii "c\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x9	# DW_AT_decl_line
	.long	0x33	# DW_AT_type
	.byte	0	# end of children of DIE 0x3a
	.uleb128 0x9	# (DIE (0x62) DW_TAG_pointer_type)
	.byte	0x8	# DW_AT_byte_size
	.byte	0xde	# DW_AT_type
	.byte	0xc2
	.byte	0x97
	.byte	0xe1
	.byte	0x59
	.byte	0x13
	.byte	0x72
	.byte	0xc
	.uleb128 0xa	# (DIE (0x6c) DW_TAG_subprogram)
			# DW_AT_external
	.ascii "foo\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x15	# DW_AT_decl_line
			# DW_AT_prototyped
	.long	0x33	# DW_AT_type
	.quad	.LFB1	# DW_AT_low_pc
	.quad	.LFE1	# DW_AT_high_pc
	.uleb128 0x1	# DW_AT_frame_base
	.byte	0x9c	# DW_OP_call_frame_cfa
	.long	0x117	# DW_AT_sibling
	.uleb128 0x8	# (DIE (0x8d) DW_TAG_formal_parameter)
	.ascii "i\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x15	# DW_AT_decl_line
	.long	0x33	# DW_AT_type
	.uleb128 0xb	# (DIE (0x96) DW_TAG_variable)
	.ascii "j\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x17	# DW_AT_decl_line
	.long	0x33	# DW_AT_type
	.long	.LLST0	# DW_AT_location
	.uleb128 0xb	# (DIE (0xa3) DW_TAG_variable)
	.ascii "p\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x18	# DW_AT_decl_line
	.long	0x117	# DW_AT_type
	.long	.LLST1	# DW_AT_location
	.uleb128 0xc	# (DIE (0xb0) DW_TAG_inlined_subroutine)
	.long	0x3a	# DW_AT_abstract_origin
	.quad	.LBB6	# DW_AT_entry_pc
	.long	.Ldebug_ranges0+0	# DW_AT_ranges
	.byte	0x1	# DW_AT_call_file (implicitptr.c)
	.byte	0x19	# DW_AT_call_line
	.long	0xe3	# DW_AT_sibling
	.uleb128 0xd	# (DIE (0xc7) DW_TAG_formal_parameter)
	.long	0x58	# DW_AT_abstract_origin
	.byte	0	# DW_AT_const_value
	.uleb128 0xe	# (DIE (0xcd) DW_TAG_formal_parameter)
	.long	0x4f	# DW_AT_abstract_origin
	.uleb128 0x6	# DW_AT_location
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+163
	.sleb128 16
	.uleb128 0xf	# (DIE (0xd9) DW_TAG_formal_parameter)
	.long	0x46	# DW_AT_abstract_origin
	.long	.LLST2	# DW_AT_location
	.byte	0	# end of children of DIE 0xb0
	.uleb128 0x10	# (DIE (0xe3) DW_TAG_inlined_subroutine)
	.long	0x3a	# DW_AT_abstract_origin
	.quad	.LBB10	# DW_AT_low_pc
	.quad	.LBE10	# DW_AT_high_pc
	.byte	0x1	# DW_AT_call_file (implicitptr.c)
	.byte	0x1c	# DW_AT_call_line
	.uleb128 0xd	# (DIE (0xfa) DW_TAG_formal_parameter)
	.long	0x58	# DW_AT_abstract_origin
	.byte	0x3	# DW_AT_const_value
	.uleb128 0xe	# (DIE (0x100) DW_TAG_formal_parameter)
	.long	0x4f	# DW_AT_abstract_origin
	.uleb128 0x6	# DW_AT_location
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+163
	.sleb128 16
	.uleb128 0xf	# (DIE (0x10c) DW_TAG_formal_parameter)
	.long	0x46	# DW_AT_abstract_origin
	.long	.LLST3	# DW_AT_location
	.byte	0	# end of children of DIE 0xe3
	.byte	0	# end of children of DIE 0x6c
	.uleb128 0x11	# (DIE (0x117) DW_TAG_array_type)
	.byte	0xde	# DW_AT_type
	.byte	0xc2
	.byte	0x97
	.byte	0xe1
	.byte	0x59
	.byte	0x13
	.byte	0x72
	.byte	0xc
	.long	0x12b	# DW_AT_sibling
	.uleb128 0x12	# (DIE (0x124) DW_TAG_subrange_type)
	.long	0x12b	# DW_AT_type
	.byte	0x1	# DW_AT_upper_bound
	.byte	0	# end of children of DIE 0x117
	.uleb128 0x13	# (DIE (0x12b) DW_TAG_base_type)
	.byte	0x8	# DW_AT_byte_size
	.byte	0x7	# DW_AT_encoding
	.long	.LASF0	# DW_AT_name: "long unsigned int"
	.uleb128 0xa	# (DIE (0x132) DW_TAG_subprogram)
			# DW_AT_external
	.ascii "bar\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x21	# DW_AT_decl_line
			# DW_AT_prototyped
	.long	0x33	# DW_AT_type
	.quad	.LFB2	# DW_AT_low_pc
	.quad	.LFE2	# DW_AT_high_pc
	.uleb128 0x1	# DW_AT_frame_base
	.byte	0x9c	# DW_OP_call_frame_cfa
	.long	0x191	# DW_AT_sibling
	.uleb128 0x14	# (DIE (0x153) DW_TAG_formal_parameter)
	.ascii "i\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x21	# DW_AT_decl_line
	.long	0x33	# DW_AT_type
	.uleb128 0x3	# DW_AT_location
	.byte	0x75	# DW_OP_breg5
	.sleb128 1
	.byte	0x9f	# DW_OP_stack_value
	.uleb128 0x15	# (DIE (0x160) DW_TAG_variable)
	.ascii "j\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x23	# DW_AT_decl_line
	.long	0x2d	# DW_AT_type
	.uleb128 0x6	# DW_AT_location
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+339
	.sleb128 0
	.uleb128 0x15	# (DIE (0x170) DW_TAG_variable)
	.ascii "k\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x24	# DW_AT_decl_line
	.long	0x191	# DW_AT_type
	.uleb128 0x6	# DW_AT_location
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+352
	.sleb128 0
	.uleb128 0x15	# (DIE (0x180) DW_TAG_variable)
	.ascii "l\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x25	# DW_AT_decl_line
	.long	0x197	# DW_AT_type
	.uleb128 0x6	# DW_AT_location
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+368
	.sleb128 0
	.byte	0	# end of children of DIE 0x132
	.uleb128 0x4	# (DIE (0x191) DW_TAG_pointer_type)
	.byte	0x8	# DW_AT_byte_size
	.long	0x2d	# DW_AT_type
	.uleb128 0x4	# (DIE (0x197) DW_TAG_pointer_type)
	.byte	0x8	# DW_AT_byte_size
	.long	0x191	# DW_AT_type
	.uleb128 0x16	# (DIE (0x19d) DW_TAG_array_type)
	.long	0x33	# DW_AT_type
	.long	0x1ad	# DW_AT_sibling
	.uleb128 0x12	# (DIE (0x1a6) DW_TAG_subrange_type)
	.long	0x12b	# DW_AT_type
	.byte	0x5	# DW_AT_upper_bound
	.byte	0	# end of children of DIE 0x19d
	.uleb128 0x17	# (DIE (0x1ad) DW_TAG_variable)
	.ascii "u\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x6	# DW_AT_decl_line
	.long	0x19d	# DW_AT_type
			# DW_AT_external
			# DW_AT_declaration
	.uleb128 0x18	# (DIE (0x1b6) DW_TAG_variable)
	.ascii "u\0"	# DW_AT_name
	.byte	0x1	# DW_AT_decl_file (implicitptr.c)
	.byte	0x6	# DW_AT_decl_line
	.long	0x19d	# DW_AT_type
			# DW_AT_external
	.uleb128 0x9	# DW_AT_location
	.byte	0x3	# DW_OP_addr
	.quad	u
	.byte	0	# end of children of DIE 0xb
	.section	.debug_abbrev
	.uleb128 0x1	# (abbrev code)
	.uleb128 0x41	# (TAG: DW_TAG_type_unit)
	.byte	0x1	# DW_children_yes
	.uleb128 0x13	# (DW_AT_language)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x10	# (DW_AT_stmt_list)
	.uleb128 0x17	# (DW_FORM_sec_offset)
	.byte	0
	.byte	0
	.uleb128 0x2	# (abbrev code)
	.uleb128 0x13	# (TAG: DW_TAG_structure_type)
	.byte	0x1	# DW_children_yes
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0xb	# (DW_AT_byte_size)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x1	# (DW_AT_sibling)
	.uleb128 0x13	# (DW_FORM_ref4)
	.byte	0
	.byte	0
	.uleb128 0x3	# (abbrev code)
	.uleb128 0xd	# (TAG: DW_TAG_member)
	.byte	0	# DW_children_no
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x38	# (DW_AT_data_member_location)
	.uleb128 0xb	# (DW_FORM_data1)
	.byte	0
	.byte	0
	.uleb128 0x4	# (abbrev code)
	.uleb128 0xf	# (TAG: DW_TAG_pointer_type)
	.byte	0	# DW_children_no
	.uleb128 0xb	# (DW_AT_byte_size)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.byte	0
	.byte	0
	.uleb128 0x5	# (abbrev code)
	.uleb128 0x24	# (TAG: DW_TAG_base_type)
	.byte	0	# DW_children_no
	.uleb128 0xb	# (DW_AT_byte_size)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3e	# (DW_AT_encoding)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.byte	0
	.byte	0
	.uleb128 0x6	# (abbrev code)
	.uleb128 0x11	# (TAG: DW_TAG_compile_unit)
	.byte	0x1	# DW_children_yes
	.uleb128 0x25	# (DW_AT_producer)
	.uleb128 0xe	# (DW_FORM_strp)
	.uleb128 0x13	# (DW_AT_language)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0xe	# (DW_FORM_strp)
	.uleb128 0x1b	# (DW_AT_comp_dir)
	.uleb128 0xe	# (DW_FORM_strp)
	.uleb128 0x11	# (DW_AT_low_pc)
	.uleb128 0x1	# (DW_FORM_addr)
	.uleb128 0x12	# (DW_AT_high_pc)
	.uleb128 0x1	# (DW_FORM_addr)
	.uleb128 0x10	# (DW_AT_stmt_list)
	.uleb128 0x17	# (DW_FORM_sec_offset)
	.byte	0
	.byte	0
	.uleb128 0x7	# (abbrev code)
	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
	.byte	0x1	# DW_children_yes
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x27	# (DW_AT_prototyped)
	.uleb128 0x19	# (DW_FORM_flag_present)
	.uleb128 0x20	# (DW_AT_inline)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x1	# (DW_AT_sibling)
	.uleb128 0x13	# (DW_FORM_ref4)
	.byte	0
	.byte	0
	.uleb128 0x8	# (abbrev code)
	.uleb128 0x5	# (TAG: DW_TAG_formal_parameter)
	.byte	0	# DW_children_no
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.byte	0
	.byte	0
	.uleb128 0x9	# (abbrev code)
	.uleb128 0xf	# (TAG: DW_TAG_pointer_type)
	.byte	0	# DW_children_no
	.uleb128 0xb	# (DW_AT_byte_size)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x20	# (DW_FORM_ref_sig8)
	.byte	0
	.byte	0
	.uleb128 0xa	# (abbrev code)
	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
	.byte	0x1	# DW_children_yes
	.uleb128 0x3f	# (DW_AT_external)
	.uleb128 0x19	# (DW_FORM_flag_present)
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x27	# (DW_AT_prototyped)
	.uleb128 0x19	# (DW_FORM_flag_present)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x11	# (DW_AT_low_pc)
	.uleb128 0x1	# (DW_FORM_addr)
	.uleb128 0x12	# (DW_AT_high_pc)
	.uleb128 0x1	# (DW_FORM_addr)
	.uleb128 0x40	# (DW_AT_frame_base)
	.uleb128 0x18	# (DW_FORM_exprloc)
	.uleb128 0x1	# (DW_AT_sibling)
	.uleb128 0x13	# (DW_FORM_ref4)
	.byte	0
	.byte	0
	.uleb128 0xb	# (abbrev code)
	.uleb128 0x34	# (TAG: DW_TAG_variable)
	.byte	0	# DW_children_no
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x2	# (DW_AT_location)
	.uleb128 0x17	# (DW_FORM_sec_offset)
	.byte	0
	.byte	0
	.uleb128 0xc	# (abbrev code)
	.uleb128 0x1d	# (TAG: DW_TAG_inlined_subroutine)
	.byte	0x1	# DW_children_yes
	.uleb128 0x31	# (DW_AT_abstract_origin)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x52	# (DW_AT_entry_pc)
	.uleb128 0x1	# (DW_FORM_addr)
	.uleb128 0x55	# (DW_AT_ranges)
	.uleb128 0x17	# (DW_FORM_sec_offset)
	.uleb128 0x58	# (DW_AT_call_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x59	# (DW_AT_call_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x1	# (DW_AT_sibling)
	.uleb128 0x13	# (DW_FORM_ref4)
	.byte	0
	.byte	0
	.uleb128 0xd	# (abbrev code)
	.uleb128 0x5	# (TAG: DW_TAG_formal_parameter)
	.byte	0	# DW_children_no
	.uleb128 0x31	# (DW_AT_abstract_origin)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x1c	# (DW_AT_const_value)
	.uleb128 0xb	# (DW_FORM_data1)
	.byte	0
	.byte	0
	.uleb128 0xe	# (abbrev code)
	.uleb128 0x5	# (TAG: DW_TAG_formal_parameter)
	.byte	0	# DW_children_no
	.uleb128 0x31	# (DW_AT_abstract_origin)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x2	# (DW_AT_location)
	.uleb128 0x18	# (DW_FORM_exprloc)
	.byte	0
	.byte	0
	.uleb128 0xf	# (abbrev code)
	.uleb128 0x5	# (TAG: DW_TAG_formal_parameter)
	.byte	0	# DW_children_no
	.uleb128 0x31	# (DW_AT_abstract_origin)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x2	# (DW_AT_location)
	.uleb128 0x17	# (DW_FORM_sec_offset)
	.byte	0
	.byte	0
	.uleb128 0x10	# (abbrev code)
	.uleb128 0x1d	# (TAG: DW_TAG_inlined_subroutine)
	.byte	0x1	# DW_children_yes
	.uleb128 0x31	# (DW_AT_abstract_origin)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x11	# (DW_AT_low_pc)
	.uleb128 0x1	# (DW_FORM_addr)
	.uleb128 0x12	# (DW_AT_high_pc)
	.uleb128 0x1	# (DW_FORM_addr)
	.uleb128 0x58	# (DW_AT_call_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x59	# (DW_AT_call_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.byte	0
	.byte	0
	.uleb128 0x11	# (abbrev code)
	.uleb128 0x1	# (TAG: DW_TAG_array_type)
	.byte	0x1	# DW_children_yes
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x20	# (DW_FORM_ref_sig8)
	.uleb128 0x1	# (DW_AT_sibling)
	.uleb128 0x13	# (DW_FORM_ref4)
	.byte	0
	.byte	0
	.uleb128 0x12	# (abbrev code)
	.uleb128 0x21	# (TAG: DW_TAG_subrange_type)
	.byte	0	# DW_children_no
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x2f	# (DW_AT_upper_bound)
	.uleb128 0xb	# (DW_FORM_data1)
	.byte	0
	.byte	0
	.uleb128 0x13	# (abbrev code)
	.uleb128 0x24	# (TAG: DW_TAG_base_type)
	.byte	0	# DW_children_no
	.uleb128 0xb	# (DW_AT_byte_size)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3e	# (DW_AT_encoding)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0xe	# (DW_FORM_strp)
	.byte	0
	.byte	0
	.uleb128 0x14	# (abbrev code)
	.uleb128 0x5	# (TAG: DW_TAG_formal_parameter)
	.byte	0	# DW_children_no
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x2	# (DW_AT_location)
	.uleb128 0x18	# (DW_FORM_exprloc)
	.byte	0
	.byte	0
	.uleb128 0x15	# (abbrev code)
	.uleb128 0x34	# (TAG: DW_TAG_variable)
	.byte	0	# DW_children_no
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x2	# (DW_AT_location)
	.uleb128 0x18	# (DW_FORM_exprloc)
	.byte	0
	.byte	0
	.uleb128 0x16	# (abbrev code)
	.uleb128 0x1	# (TAG: DW_TAG_array_type)
	.byte	0x1	# DW_children_yes
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x1	# (DW_AT_sibling)
	.uleb128 0x13	# (DW_FORM_ref4)
	.byte	0
	.byte	0
	.uleb128 0x17	# (abbrev code)
	.uleb128 0x34	# (TAG: DW_TAG_variable)
	.byte	0	# DW_children_no
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x3f	# (DW_AT_external)
	.uleb128 0x19	# (DW_FORM_flag_present)
	.uleb128 0x3c	# (DW_AT_declaration)
	.uleb128 0x19	# (DW_FORM_flag_present)
	.byte	0
	.byte	0
	.uleb128 0x18	# (abbrev code)
	.uleb128 0x34	# (TAG: DW_TAG_variable)
	.byte	0	# DW_children_no
	.uleb128 0x3	# (DW_AT_name)
	.uleb128 0x8	# (DW_FORM_string)
	.uleb128 0x3a	# (DW_AT_decl_file)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x3b	# (DW_AT_decl_line)
	.uleb128 0xb	# (DW_FORM_data1)
	.uleb128 0x49	# (DW_AT_type)
	.uleb128 0x13	# (DW_FORM_ref4)
	.uleb128 0x3f	# (DW_AT_external)
	.uleb128 0x19	# (DW_FORM_flag_present)
	.uleb128 0x2	# (DW_AT_location)
	.uleb128 0x18	# (DW_FORM_exprloc)
	.byte	0
	.byte	0
	.byte	0
	.section	.debug_loc,"", at progbits
.Ldebug_loc0:
.LLST0:
	.quad	.LVL0-.Ltext0	# Location list begin address (*.LLST0)
	.quad	.LVL3-.Ltext0	# Location list end address (*.LLST0)
	.value	0x1	# Location expression size
	.byte	0x55	# DW_OP_reg5
	.quad	0	# Location list terminator begin (*.LLST0)
	.quad	0	# Location list terminator end (*.LLST0)
.LLST1:
	.quad	.LVL0-.Ltext0	# Location list begin address (*.LLST1)
	.quad	.LVL3-.Ltext0	# Location list end address (*.LLST1)
	.value	0x22	# Location expression size
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+141
	.sleb128 0
	.byte	0x93	# DW_OP_piece
	.uleb128 0x8
	.byte	0x75	# DW_OP_breg5
	.sleb128 0
	.byte	0x32	# DW_OP_lit2
	.byte	0x24	# DW_OP_shl
	.byte	0x9f	# DW_OP_stack_value
	.byte	0x93	# DW_OP_piece
	.uleb128 0x4
	.byte	0x93	# DW_OP_piece
	.uleb128 0x4
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+150
	.sleb128 0
	.byte	0x93	# DW_OP_piece
	.uleb128 0x8
	.byte	0x75	# DW_OP_breg5
	.sleb128 0
	.byte	0x31	# DW_OP_lit1
	.byte	0x24	# DW_OP_shl
	.byte	0x9f	# DW_OP_stack_value
	.byte	0x93	# DW_OP_piece
	.uleb128 0x4
	.byte	0x93	# DW_OP_piece
	.uleb128 0x4
	.quad	.LVL3-.Ltext0	# Location list begin address (*.LLST1)
	.quad	.LFE1-.Ltext0	# Location list end address (*.LLST1)
	.value	0x22	# Location expression size
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+150
	.sleb128 0
	.byte	0x93	# DW_OP_piece
	.uleb128 0x8
	.byte	0x75	# DW_OP_breg5
	.sleb128 0
	.byte	0x36	# DW_OP_lit6
	.byte	0x1e	# DW_OP_mul
	.byte	0x9f	# DW_OP_stack_value
	.byte	0x93	# DW_OP_piece
	.uleb128 0x4
	.byte	0x93	# DW_OP_piece
	.uleb128 0x4
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+141
	.sleb128 0
	.byte	0x93	# DW_OP_piece
	.uleb128 0x8
	.byte	0x75	# DW_OP_breg5
	.sleb128 0
	.byte	0x31	# DW_OP_lit1
	.byte	0x24	# DW_OP_shl
	.byte	0x9f	# DW_OP_stack_value
	.byte	0x93	# DW_OP_piece
	.uleb128 0x4
	.byte	0x93	# DW_OP_piece
	.uleb128 0x4
	.quad	0	# Location list terminator begin (*.LLST1)
	.quad	0	# Location list terminator end (*.LLST1)
.LLST2:
	.quad	.LVL0-.Ltext0	# Location list begin address (*.LLST2)
	.quad	.LVL1-.Ltext0	# Location list end address (*.LLST2)
	.value	0x6	# Location expression size
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+163
	.sleb128 0
	.quad	.LVL1-.Ltext0	# Location list begin address (*.LLST2)
	.quad	.LVL2-.Ltext0	# Location list end address (*.LLST2)
	.value	0x2	# Location expression size
	.byte	0x30	# DW_OP_lit0
	.byte	0x9f	# DW_OP_stack_value
	.quad	.LVL2-.Ltext0	# Location list begin address (*.LLST2)
	.quad	.LFE1-.Ltext0	# Location list end address (*.LLST2)
	.value	0x6	# Location expression size
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+163
	.sleb128 16
	.quad	0	# Location list terminator begin (*.LLST2)
	.quad	0	# Location list terminator end (*.LLST2)
.LLST3:
	.quad	.LVL3-.Ltext0	# Location list begin address (*.LLST3)
	.quad	.LVL4-.Ltext0	# Location list end address (*.LLST3)
	.value	0x6	# Location expression size
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+163
	.sleb128 0
	.quad	.LVL4-.Ltext0	# Location list begin address (*.LLST3)
	.quad	.LVL5-.Ltext0	# Location list end address (*.LLST3)
	.value	0x2	# Location expression size
	.byte	0x30	# DW_OP_lit0
	.byte	0x9f	# DW_OP_stack_value
	.quad	.LVL5-.Ltext0	# Location list begin address (*.LLST3)
	.quad	.LFE1-.Ltext0	# Location list end address (*.LLST3)
	.value	0x6	# Location expression size
	.byte	0xf2	# DW_OP_GNU_implicit_pointer
	.long	.Ldebug_info0+163
	.sleb128 16
	.quad	0	# Location list terminator begin (*.LLST3)
	.quad	0	# Location list terminator end (*.LLST3)
	.section	.debug_aranges,"", at progbits
	.long	0x2c	# Length of Address Ranges Info
	.value	0x2	# DWARF Version
	.long	.Ldebug_info0	# Offset of Compilation Unit Info
	.byte	0x8	# Size of Address
	.byte	0	# Size of Segment Descriptor
	.value	0	# Pad to 16 byte boundary
	.value	0
	.quad	.Ltext0	# Address
	.quad	.Letext0-.Ltext0	# Length
	.quad	0
	.quad	0
	.section	.debug_ranges,"", at progbits
.Ldebug_ranges0:
	.quad	.LBB6-.Ltext0	# Offset 0
	.quad	.LBE6-.Ltext0
	.quad	.LBB9-.Ltext0
	.quad	.LBE9-.Ltext0
	.quad	0
	.quad	0
	.section	.debug_str,"MS", at progbits,1
.LASF1:
	.string	"GNU C 4.6.0 20100811 (experimental)"
.LASF2:
	.string	"implicitptr.c"
.LASF3:
	.string	"/usr/src/gcc/obj204/gcc"
.LASF0:
	.string	"long unsigned int"
	.ident	"GCC: (GNU) 4.6.0 20100811 (experimental)"
	.section	.note.GNU-stack,"", at progbits


More information about the Dwarf-Discuss mailing list