RFC: fix bug in pieced value with offset

Tom Tromey tromey@redhat.com
Thu May 13 17:09:00 GMT 2010


I plan to check this in.  I would appreciate comments, though; I think I
got the big-endian stuff right, but I am having trouble thinking about
it very clearly, and I also had trouble creating a test case that might
show the difficulties.

This patch fixes one of the problems reported at

    https://bugzilla.redhat.com/show_bug.cgi?id=589467

This is case #1 in the first comment.

The bug is that read_pieced_value does not respect value_offset.
Consequently, printing a structure built from pieces works, but printing
a single field does not.

The fix is to change read_pieced_value and write_pieced_value to
understand offsets.

I've included a new test case.  This test required a modified gcc; see:

    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43983

The gcc patch has since gone in, but to make the test case independent
of gcc changes I am checking in the assembly.  Note that gcc will also
have a "guality" test for this, see:

    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44115

I'm also checking in the .c file for reference.  The C source contains
more functions than are currently tested; I will be adding more tests to
pieces.exp as I fix the remaining bugs.

Exactly what to do when writing to a pieced value where one of the
pieces is unwriteable is an open problem.  I left the code as-is, though
I find it less than perfect.

Built and regtested on x86-64 (compile farm).  I also verified correct
behavior on a big-endian box.

Tom

2010-05-13  Tom Tromey  <tromey@redhat.com>

	* dwarf2loc.c (read_pieced_value): Work properly when 'v' has an
	offset.
	(write_pieced_value): Likewise.

2010-05-13  Tom Tromey  <tromey@redhat.com>

	* gdb.dwarf2.pieces.exp: New file.
	* gdb.dwarf2.pieces.S: New file.
	* gdb.dwarf2.pieces.c: New file.

Index: dwarf2loc.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2loc.c,v
retrieving revision 1.77
diff -u -r1.77 dwarf2loc.c
--- dwarf2loc.c	13 May 2010 15:44:35 -0000	1.77
+++ dwarf2loc.c	13 May 2010 17:01:01 -0000
@@ -262,14 +262,43 @@
 {
   int i;
   long offset = 0;
+  ULONGEST bytes_to_skip;
   gdb_byte *contents;
   struct piece_closure *c = (struct piece_closure *) value_computed_closure (v);
   struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (v));
 
+  if (value_type (v) != value_enclosing_type (v))
+    internal_error (__FILE__, __LINE__,
+		    _("Should not be able to create a lazy value with "
+		      "an enclosing type"));
+
   contents = value_contents_raw (v);
+  bytes_to_skip = value_offset (v);
   for (i = 0; i < c->n_pieces; i++)
     {
       struct dwarf_expr_piece *p = &c->pieces[i];
+      size_t this_size;
+      long dest_offset, source_offset;
+
+      if (bytes_to_skip > 0 && bytes_to_skip >= p->size)
+	{
+	  bytes_to_skip -= p->size;
+	  continue;
+	}
+      this_size = p->size;
+      if (bytes_to_skip > 0)
+	{
+	  dest_offset = 0;
+	  source_offset = bytes_to_skip;
+	  this_size -= bytes_to_skip;
+	  bytes_to_skip = 0;
+	}
+      else
+	{
+	  dest_offset = offset;
+	  source_offset = 0;
+	}
+
       switch (p->location)
 	{
 	case DWARF_VALUE_REGISTER:
@@ -277,17 +306,18 @@
 	    struct gdbarch *arch = get_frame_arch (frame);
 	    int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch,
 							   p->v.expr.value);
-	    int reg_offset = 0;
+	    int reg_offset = source_offset;
 
 	    if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
-		&& p->size < register_size (arch, gdb_regnum))
+		&& this_size + reg_offset <= register_size (arch, gdb_regnum))
 	      /* Big-endian, and we want less than full size.  */
-	      reg_offset = register_size (arch, gdb_regnum) - p->size;
+	      reg_offset = (register_size (arch, gdb_regnum)
+			    - this_size - reg_offset);
 
 	    if (gdb_regnum != -1)
 	      {
 		get_frame_register_bytes (frame, gdb_regnum, reg_offset, 
-					  p->size, contents + offset);
+					  this_size, contents + dest_offset);
 	      }
 	    else
 	      {
@@ -299,36 +329,47 @@
 
 	case DWARF_VALUE_MEMORY:
 	  if (p->v.expr.in_stack_memory)
-	    read_stack (p->v.expr.value, contents + offset, p->size);
+	    read_stack (p->v.expr.value + source_offset,
+			contents + dest_offset, this_size);
 	  else
-	    read_memory (p->v.expr.value, contents + offset, p->size);
+	    read_memory (p->v.expr.value + source_offset,
+			 contents + dest_offset, this_size);
 	  break;
 
 	case DWARF_VALUE_STACK:
 	  {
 	    struct gdbarch *gdbarch = get_type_arch (value_type (v));
-	    size_t n = p->size;
+	    size_t n = this_size;
 	    if (n > c->addr_size)
 	      n = c->addr_size;
-	    store_unsigned_integer (contents + offset, n,
-				    gdbarch_byte_order (gdbarch),
-				    p->v.expr.value);
+	    if (source_offset == 0)
+	      store_unsigned_integer (contents + dest_offset, n,
+				      gdbarch_byte_order (gdbarch),
+				      p->v.expr.value);
+	    else
+	      {
+		gdb_byte bytes[sizeof (ULONGEST)];
+		store_unsigned_integer (bytes, n,
+					gdbarch_byte_order (gdbarch),
+					p->v.expr.value);
+		memcpy (contents + dest_offset, bytes + source_offset, n);
+	      }
 	  }
 	  break;
 
 	case DWARF_VALUE_LITERAL:
 	  {
-	    size_t n = p->size;
-	    if (n > p->v.literal.length)
-	      n = p->v.literal.length;
-	    memcpy (contents + offset, p->v.literal.data, n);
+	    if (this_size > p->v.literal.length)
+	      this_size = p->v.literal.length;
+	    memcpy (contents + dest_offset,
+		    p->v.literal.data + source_offset, this_size);
 	  }
 	  break;
 
 	default:
 	  internal_error (__FILE__, __LINE__, _("invalid location type"));
 	}
-      offset += p->size;
+      offset += this_size;
     }
 }
 
@@ -337,7 +378,8 @@
 {
   int i;
   long offset = 0;
-  gdb_byte *contents;
+  ULONGEST bytes_to_skip;
+  const gdb_byte *contents;
   struct piece_closure *c = (struct piece_closure *) value_computed_closure (to);
   struct frame_info *frame = frame_find_by_id (VALUE_FRAME_ID (to));
 
@@ -347,27 +389,51 @@
       return;
     }
 
-  contents = value_contents_raw (from);
+  contents = value_contents (from);
+  bytes_to_skip = value_offset (to);
   for (i = 0; i < c->n_pieces; i++)
     {
       struct dwarf_expr_piece *p = &c->pieces[i];
+      size_t this_size;
+      long dest_offset, source_offset;
+
+      if (bytes_to_skip > 0 && bytes_to_skip >= p->size)
+	{
+	  bytes_to_skip -= p->size;
+	  continue;
+	}
+      this_size = p->size;
+      if (bytes_to_skip > 0)
+	{
+	  dest_offset = bytes_to_skip;
+	  source_offset = 0;
+	  this_size -= bytes_to_skip;
+	  bytes_to_skip = 0;
+	}
+      else
+	{
+	  dest_offset = 0;
+	  source_offset = offset;
+	}
+
       switch (p->location)
 	{
 	case DWARF_VALUE_REGISTER:
 	  {
 	    struct gdbarch *arch = get_frame_arch (frame);
 	    int gdb_regnum = gdbarch_dwarf2_reg_to_regnum (arch, p->v.expr.value);
-	    int reg_offset = 0;
+	    int reg_offset = dest_offset;
 
 	    if (gdbarch_byte_order (arch) == BFD_ENDIAN_BIG
-		&& p->size < register_size (arch, gdb_regnum))
+		&& this_size + reg_offset <= register_size (arch, gdb_regnum))
 	      /* Big-endian, and we want less than full size.  */
-	      reg_offset = register_size (arch, gdb_regnum) - p->size;
+	      reg_offset = (register_size (arch, gdb_regnum) - this_size
+			    - reg_offset);
 
 	    if (gdb_regnum != -1)
 	      {
 		put_frame_register_bytes (frame, gdb_regnum, reg_offset, 
-					  p->size, contents + offset);
+					  this_size, contents + source_offset);
 	      }
 	    else
 	      {
@@ -377,13 +443,14 @@
 	  }
 	  break;
 	case DWARF_VALUE_MEMORY:
-	  write_memory (p->v.expr.value, contents + offset, p->size);
+	  write_memory (p->v.expr.value + dest_offset,
+			contents + source_offset, this_size);
 	  break;
 	default:
 	  set_value_optimized_out (to, 1);
 	  return;
 	}
-      offset += p->size;
+      offset += this_size;
     }
 }
 
Index: testsuite/gdb.dwarf2/pieces.S
===================================================================
RCS file: testsuite/gdb.dwarf2/pieces.S
diff -N testsuite/gdb.dwarf2/pieces.S
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.dwarf2/pieces.S	13 May 2010 17:01:03 -0000
@@ -0,0 +1,1655 @@
+/*
+   Copyright 2010 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* This was compiled with a version of gcc modified to emit better
+   debuginfo for SRA'd structures.  See:
+	http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43983
+	
+    The original program is "pieces.c", in this directory.
+*/
+
+	.file	"pieces.c"
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.text
+.Ltext0:
+	.p2align 4,,15
+.globl bar
+	.type	bar, @function
+bar:
+.LFB0:
+	.file 1 "pieces.c"
+	# pieces.c:10
+	.loc 1 10 0
+.LVL0:
+	# basic block 2
+	pushl	%ebp
+.LCFI0:
+	movl	%esp, %ebp
+.LCFI1:
+	# pieces.c:11
+	.loc 1 11 0
+	movl	8(%ebp), %eax
+	# pieces.c:12
+	.loc 1 12 0
+	popl	%ebp
+.LCFI2:
+	ret
+.LFE0:
+	.size	bar, .-bar
+	.p2align 4,,15
+.globl f1
+	.type	f1, @function
+f1:
+.LFB1:
+	# pieces.c:16
+	.loc 1 16 0
+.LVL1:
+	# basic block 2
+	pushl	%ebp
+.LCFI3:
+	movl	%esp, %ebp
+.LCFI4:
+.LVL2:
+	subl	$12, %esp
+.LCFI5:
+	movl	%esi, -4(%ebp)
+.LCFI6:
+	# pieces.c:19
+	.loc 1 19 0
+	movl	8(%ebp), %esi
+	# pieces.c:16
+	.loc 1 16 0
+	movl	%ebx, -8(%ebp)
+.LCFI7:
+	# pieces.c:18
+	.loc 1 18 0
+	movl	$4, %ebx
+.LVL3:
+	# pieces.c:20
+	.loc 1 20 0
+	movl	%ebx, (%esp)
+	# pieces.c:19
+	.loc 1 19 0
+	addl	$7, %esi
+.LVL4:
+	# pieces.c:20
+	.loc 1 20 0
+	call	bar
+	# pieces.c:21
+	.loc 1 21 0
+	movl	%esi, (%esp)
+	call	bar
+	# pieces.c:22
+	.loc 1 22 0
+	leal	(%ebx,%esi), %eax
+	# pieces.c:23
+	.loc 1 23 0
+	movl	-8(%ebp), %ebx
+.LVL5:
+	movl	-4(%ebp), %esi
+.LVL6:
+	movl	%ebp, %esp
+.LCFI8:
+	popl	%ebp
+.LCFI9:
+	ret
+.LFE1:
+	.size	f1, .-f1
+	.p2align 4,,15
+.globl f2
+	.type	f2, @function
+f2:
+.LFB2:
+	# pieces.c:27
+	.loc 1 27 0
+.LVL7:
+	# basic block 2
+	pushl	%ebp
+.LCFI10:
+	movl	%esp, %ebp
+.LCFI11:
+.LVL8:
+	subl	$12, %esp
+.LCFI12:
+	movl	%esi, -4(%ebp)
+.LCFI13:
+	# pieces.c:30
+	.loc 1 30 0
+	movl	8(%ebp), %esi
+	# pieces.c:27
+	.loc 1 27 0
+	movl	%ebx, -8(%ebp)
+.LCFI14:
+	# pieces.c:29
+	.loc 1 29 0
+	movl	$4, %ebx
+.LVL9:
+	# pieces.c:31
+	.loc 1 31 0
+	movl	%ebx, (%esp)
+	# pieces.c:30
+	.loc 1 30 0
+	addl	$7, %esi
+.LVL10:
+	# pieces.c:31
+	.loc 1 31 0
+	call	bar
+	# pieces.c:32
+	.loc 1 32 0
+	movl	%esi, (%esp)
+	call	bar
+	# pieces.c:33
+	.loc 1 33 0
+	leal	(%ebx,%esi), %eax
+	# pieces.c:34
+	.loc 1 34 0
+	movl	-8(%ebp), %ebx
+.LVL11:
+	movl	-4(%ebp), %esi
+.LVL12:
+	movl	%ebp, %esp
+.LCFI15:
+	popl	%ebp
+.LCFI16:
+	ret
+.LFE2:
+	.size	f2, .-f2
+	.p2align 4,,15
+.globl f3
+	.type	f3, @function
+f3:
+.LFB3:
+	# pieces.c:38
+	.loc 1 38 0
+.LVL13:
+	# basic block 2
+	pushl	%ebp
+.LCFI17:
+	# pieces.c:40
+	.loc 1 40 0
+	movl	$4, %edx
+	# pieces.c:38
+	.loc 1 38 0
+	movl	%esp, %ebp
+.LCFI18:
+.LVL14:
+	subl	$12, %esp
+.LCFI19:
+	# pieces.c:40
+	.loc 1 40 0
+.LVL15:
+	# pieces.c:38
+	.loc 1 38 0
+	movl	%esi, -4(%ebp)
+.LCFI20:
+	# pieces.c:42
+	.loc 1 42 0
+	movswl	%dx, %esi
+	# pieces.c:38
+	.loc 1 38 0
+	movl	%ebx, -8(%ebp)
+.LCFI21:
+	# pieces.c:42
+	.loc 1 42 0
+	movl	%esi, (%esp)
+	call	bar
+.LVL16:
+	# pieces.c:39
+	.loc 1 39 0
+	movl	8(%ebp), %edx
+	sall	$4, %edx
+	# pieces.c:41
+	.loc 1 41 0
+	addl	$112, %edx
+	sarw	$4, %dx
+	# pieces.c:43
+	.loc 1 43 0
+	movswl	%dx, %ebx
+	movl	%ebx, (%esp)
+	call	bar
+	# pieces.c:44
+	.loc 1 44 0
+	leal	(%esi,%ebx), %eax
+	# pieces.c:45
+	.loc 1 45 0
+	movl	-8(%ebp), %ebx
+	movl	-4(%ebp), %esi
+.LVL17:
+	movl	%ebp, %esp
+.LCFI22:
+	popl	%ebp
+.LCFI23:
+	ret
+.LFE3:
+	.size	f3, .-f3
+	.p2align 4,,15
+.globl f4
+	.type	f4, @function
+f4:
+.LFB4:
+	# pieces.c:49
+	.loc 1 49 0
+.LVL18:
+	# basic block 2
+	pushl	%ebp
+.LCFI24:
+	movl	%esp, %ebp
+.LCFI25:
+	subl	$12, %esp
+.LCFI26:
+	movl	%esi, -4(%ebp)
+.LCFI27:
+	movl	8(%ebp), %esi
+.LVL19:
+	movl	%ebx, -8(%ebp)
+.LCFI28:
+	# pieces.c:51
+	.loc 1 51 0
+	movl	%esi, %ebx
+	# pieces.c:52
+	.loc 1 52 0
+	addl	$1, %esi
+	# pieces.c:51
+	.loc 1 51 0
+.LVL20:
+	# pieces.c:53
+	.loc 1 53 0
+	movl	%ebx, (%esp)
+	call	bar
+	# pieces.c:54
+	.loc 1 54 0
+	movl	%esi, (%esp)
+	call	bar
+	# pieces.c:55
+	.loc 1 55 0
+	leal	(%ebx,%esi), %eax
+	# pieces.c:56
+	.loc 1 56 0
+	movl	-8(%ebp), %ebx
+.LVL21:
+	movl	-4(%ebp), %esi
+.LVL22:
+	movl	%ebp, %esp
+.LCFI29:
+	popl	%ebp
+.LCFI30:
+	ret
+.LFE4:
+	.size	f4, .-f4
+	.p2align 4,,15
+.globl f5
+	.type	f5, @function
+f5:
+.LFB5:
+	# pieces.c:60
+	.loc 1 60 0
+.LVL23:
+	# basic block 2
+	pushl	%ebp
+.LCFI31:
+	movl	%esp, %ebp
+.LCFI32:
+	subl	$12, %esp
+.LCFI33:
+	movl	%esi, -4(%ebp)
+.LCFI34:
+	movl	8(%ebp), %esi
+.LVL24:
+	movl	%ebx, -8(%ebp)
+.LCFI35:
+	# pieces.c:62
+	.loc 1 62 0
+	movl	%esi, %ebx
+	# pieces.c:63
+	.loc 1 63 0
+	addl	$1, %esi
+	# pieces.c:62
+	.loc 1 62 0
+.LVL25:
+	# pieces.c:64
+	.loc 1 64 0
+	movl	%ebx, (%esp)
+	call	bar
+	# pieces.c:65
+	.loc 1 65 0
+	movl	%esi, (%esp)
+	call	bar
+	# pieces.c:66
+	.loc 1 66 0
+	leal	(%ebx,%esi), %eax
+	# pieces.c:67
+	.loc 1 67 0
+	movl	-8(%ebp), %ebx
+.LVL26:
+	movl	-4(%ebp), %esi
+.LVL27:
+	movl	%ebp, %esp
+.LCFI36:
+	popl	%ebp
+.LCFI37:
+	ret
+.LFE5:
+	.size	f5, .-f5
+	.p2align 4,,15
+.globl _start
+	.type	_start, @function
+_start:
+.LFB6:
+	# pieces.c:71
+	.loc 1 71 0
+	# basic block 2
+	pushl	%ebp
+.LCFI38:
+	movl	%esp, %ebp
+.LCFI39:
+	pushl	%ebx
+.LCFI40:
+	# pieces.c:73
+	.loc 1 73 0
+	movl	$7, %ebx
+	# pieces.c:71
+	.loc 1 71 0
+	subl	$4, %esp
+.LCFI41:
+	# pieces.c:73
+	.loc 1 73 0
+.LVL28:
+	# pieces.c:74
+	.loc 1 74 0
+	movl	%ebx, (%esp)
+	call	f1
+	# pieces.c:75
+	.loc 1 75 0
+	movl	%ebx, (%esp)
+	call	f2
+	# pieces.c:76
+	.loc 1 76 0
+	movl	%ebx, (%esp)
+	call	f3
+	# pieces.c:77
+	.loc 1 77 0
+	movl	%ebx, (%esp)
+	call	f4
+	# pieces.c:78
+	.loc 1 78 0
+	movl	%ebx, (%esp)
+	call	f5
+	# pieces.c:80
+	.loc 1 80 0
+	addl	$4, %esp
+	xorl	%eax, %eax
+	popl	%ebx
+.LCFI42:
+.LVL29:
+	popl	%ebp
+.LCFI43:
+	ret
+.LFE6:
+	.size	_start, .-_start
+#APP
+	.section	.debug_frame,"",@progbits
+.Lframe0:
+	.long	.LECIE0-.LSCIE0	# Length of Common Information Entry
+.LSCIE0:
+	.long	0xffffffff	# CIE Identifier Tag
+	.byte	0x1	# CIE Version
+	.ascii "\0"	# CIE Augmentation
+	.uleb128 0x1	# CIE Code Alignment Factor
+	.sleb128 -4	# CIE Data Alignment Factor
+	.byte	0x8	# CIE RA Column
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0x4
+	.uleb128 0x4
+	.byte	0x88	# DW_CFA_offset, column 0x8
+	.uleb128 0x1
+	.align 4
+.LECIE0:
+.LSFDE0:
+	.long	.LEFDE0-.LASFDE0	# FDE Length
+.LASFDE0:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB0	# FDE initial location
+	.long	.LFE0-.LFB0	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI0-.LFB0
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI1-.LCFI0
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI2-.LCFI1
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0x4
+	.uleb128 0x4
+	.align 4
+.LEFDE0:
+.LSFDE2:
+	.long	.LEFDE2-.LASFDE2	# FDE Length
+.LASFDE2:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB1	# FDE initial location
+	.long	.LFE1-.LFB1	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI3-.LFB1
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI4-.LCFI3
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI6-.LCFI4
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI7-.LCFI6
+	.byte	0x83	# DW_CFA_offset, column 0x3
+	.uleb128 0x4
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI8-.LCFI7
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x4
+	.byte	0xc6	# DW_CFA_restore, column 0x6
+	.byte	0xc3	# DW_CFA_restore, column 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI9-.LCFI8
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x4
+	.align 4
+.LEFDE2:
+.LSFDE4:
+	.long	.LEFDE4-.LASFDE4	# FDE Length
+.LASFDE4:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB2	# FDE initial location
+	.long	.LFE2-.LFB2	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI10-.LFB2
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI11-.LCFI10
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI13-.LCFI11
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI14-.LCFI13
+	.byte	0x83	# DW_CFA_offset, column 0x3
+	.uleb128 0x4
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI15-.LCFI14
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x4
+	.byte	0xc6	# DW_CFA_restore, column 0x6
+	.byte	0xc3	# DW_CFA_restore, column 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI16-.LCFI15
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x4
+	.align 4
+.LEFDE4:
+.LSFDE6:
+	.long	.LEFDE6-.LASFDE6	# FDE Length
+.LASFDE6:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB3	# FDE initial location
+	.long	.LFE3-.LFB3	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI17-.LFB3
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI18-.LCFI17
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI20-.LCFI18
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI21-.LCFI20
+	.byte	0x83	# DW_CFA_offset, column 0x3
+	.uleb128 0x4
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI22-.LCFI21
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x4
+	.byte	0xc6	# DW_CFA_restore, column 0x6
+	.byte	0xc3	# DW_CFA_restore, column 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI23-.LCFI22
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x4
+	.align 4
+.LEFDE6:
+.LSFDE8:
+	.long	.LEFDE8-.LASFDE8	# FDE Length
+.LASFDE8:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB4	# FDE initial location
+	.long	.LFE4-.LFB4	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI24-.LFB4
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI25-.LCFI24
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI27-.LCFI25
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI28-.LCFI27
+	.byte	0x83	# DW_CFA_offset, column 0x3
+	.uleb128 0x4
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI29-.LCFI28
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x4
+	.byte	0xc6	# DW_CFA_restore, column 0x6
+	.byte	0xc3	# DW_CFA_restore, column 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI30-.LCFI29
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x4
+	.align 4
+.LEFDE8:
+.LSFDE10:
+	.long	.LEFDE10-.LASFDE10	# FDE Length
+.LASFDE10:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB5	# FDE initial location
+	.long	.LFE5-.LFB5	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI31-.LFB5
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI32-.LCFI31
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI34-.LCFI32
+	.byte	0x86	# DW_CFA_offset, column 0x6
+	.uleb128 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI35-.LCFI34
+	.byte	0x83	# DW_CFA_offset, column 0x3
+	.uleb128 0x4
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI36-.LCFI35
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x4
+	.byte	0xc6	# DW_CFA_restore, column 0x6
+	.byte	0xc3	# DW_CFA_restore, column 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI37-.LCFI36
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x4
+	.align 4
+.LEFDE10:
+.LSFDE12:
+	.long	.LEFDE12-.LASFDE12	# FDE Length
+.LASFDE12:
+	.long	.Lframe0	# FDE CIE offset
+	.long	.LFB6	# FDE initial location
+	.long	.LFE6-.LFB6	# FDE address range
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI38-.LFB6
+	.byte	0xe	# DW_CFA_def_cfa_offset
+	.uleb128 0x8
+	.byte	0x85	# DW_CFA_offset, column 0x5
+	.uleb128 0x2
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI39-.LCFI38
+	.byte	0xd	# DW_CFA_def_cfa_register
+	.uleb128 0x5
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI40-.LCFI39
+	.byte	0x83	# DW_CFA_offset, column 0x3
+	.uleb128 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI42-.LCFI40
+	.byte	0xc3	# DW_CFA_restore, column 0x3
+	.byte	0x4	# DW_CFA_advance_loc4
+	.long	.LCFI43-.LCFI42
+	.byte	0xc5	# DW_CFA_restore, column 0x5
+	.byte	0xc	# DW_CFA_def_cfa
+	.uleb128 0x4
+	.uleb128 0x4
+	.align 4
+.LEFDE12:
+#NO_APP
+	.text
+.Letext0:
+	.section	.debug_loc,"",@progbits
+.Ldebug_loc0:
+.LLST0:
+	.long	.LFB0-.Ltext0	# Location list begin address (*.LLST0)
+	.long	.LCFI0-.Ltext0	# Location list end address (*.LLST0)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI0-.Ltext0	# Location list begin address (*.LLST0)
+	.long	.LCFI1-.Ltext0	# Location list end address (*.LLST0)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI1-.Ltext0	# Location list begin address (*.LLST0)
+	.long	.LCFI2-.Ltext0	# Location list end address (*.LLST0)
+	.value	0x2	# Location expression size
+	.byte	0x75	# DW_OP_breg5
+	.sleb128 8
+	.long	.LCFI2-.Ltext0	# Location list begin address (*.LLST0)
+	.long	.LFE0-.Ltext0	# Location list end address (*.LLST0)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST0)
+	.long	0	# Location list terminator end (*.LLST0)
+.LLST1:
+	.long	.LFB1-.Ltext0	# Location list begin address (*.LLST1)
+	.long	.LCFI3-.Ltext0	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI3-.Ltext0	# Location list begin address (*.LLST1)
+	.long	.LCFI4-.Ltext0	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI4-.Ltext0	# Location list begin address (*.LLST1)
+	.long	.LCFI8-.Ltext0	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x75	# DW_OP_breg5
+	.sleb128 8
+	.long	.LCFI8-.Ltext0	# Location list begin address (*.LLST1)
+	.long	.LCFI9-.Ltext0	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI9-.Ltext0	# Location list begin address (*.LLST1)
+	.long	.LFE1-.Ltext0	# Location list end address (*.LLST1)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST1)
+	.long	0	# Location list terminator end (*.LLST1)
+.LLST2:
+	.long	.LVL1-.Ltext0	# Location list begin address (*.LLST2)
+	.long	.LVL2-.Ltext0	# Location list end address (*.LLST2)
+	.value	0x6	# Location expression size
+	.byte	0x34	# DW_OP_lit4
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL2-.Ltext0	# Location list begin address (*.LLST2)
+	.long	.LVL3-.Ltext0	# Location list end address (*.LLST2)
+	.value	0xc	# Location expression size
+	.byte	0x34	# DW_OP_lit4
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x6	# DW_OP_deref
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x6
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL3-.Ltext0	# Location list begin address (*.LLST2)
+	.long	.LVL4-.Ltext0	# Location list end address (*.LLST2)
+	.value	0xb	# Location expression size
+	.byte	0x53	# DW_OP_reg3
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x6	# DW_OP_deref
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x6
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL4-.Ltext0	# Location list begin address (*.LLST2)
+	.long	.LVL5-.Ltext0	# Location list end address (*.LLST2)
+	.value	0x6	# Location expression size
+	.byte	0x53	# DW_OP_reg3
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL5-.Ltext0	# Location list begin address (*.LLST2)
+	.long	.LVL6-.Ltext0	# Location list end address (*.LLST2)
+	.value	0x5	# Location expression size
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	0	# Location list terminator begin (*.LLST2)
+	.long	0	# Location list terminator end (*.LLST2)
+.LLST3:
+	.long	.LFB2-.Ltext0	# Location list begin address (*.LLST3)
+	.long	.LCFI10-.Ltext0	# Location list end address (*.LLST3)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI10-.Ltext0	# Location list begin address (*.LLST3)
+	.long	.LCFI11-.Ltext0	# Location list end address (*.LLST3)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI11-.Ltext0	# Location list begin address (*.LLST3)
+	.long	.LCFI15-.Ltext0	# Location list end address (*.LLST3)
+	.value	0x2	# Location expression size
+	.byte	0x75	# DW_OP_breg5
+	.sleb128 8
+	.long	.LCFI15-.Ltext0	# Location list begin address (*.LLST3)
+	.long	.LCFI16-.Ltext0	# Location list end address (*.LLST3)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI16-.Ltext0	# Location list begin address (*.LLST3)
+	.long	.LFE2-.Ltext0	# Location list end address (*.LLST3)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST3)
+	.long	0	# Location list terminator end (*.LLST3)
+.LLST4:
+	.long	.LVL7-.Ltext0	# Location list begin address (*.LLST4)
+	.long	.LVL8-.Ltext0	# Location list end address (*.LLST4)
+	.value	0x6	# Location expression size
+	.byte	0x34	# DW_OP_lit4
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL8-.Ltext0	# Location list begin address (*.LLST4)
+	.long	.LVL9-.Ltext0	# Location list end address (*.LLST4)
+	.value	0xc	# Location expression size
+	.byte	0x34	# DW_OP_lit4
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x6	# DW_OP_deref
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x6
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL9-.Ltext0	# Location list begin address (*.LLST4)
+	.long	.LVL10-.Ltext0	# Location list end address (*.LLST4)
+	.value	0xb	# Location expression size
+	.byte	0x53	# DW_OP_reg3
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x6	# DW_OP_deref
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x6
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL10-.Ltext0	# Location list begin address (*.LLST4)
+	.long	.LVL11-.Ltext0	# Location list end address (*.LLST4)
+	.value	0x6	# Location expression size
+	.byte	0x53	# DW_OP_reg3
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL11-.Ltext0	# Location list begin address (*.LLST4)
+	.long	.LVL12-.Ltext0	# Location list end address (*.LLST4)
+	.value	0x5	# Location expression size
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	0	# Location list terminator begin (*.LLST4)
+	.long	0	# Location list terminator end (*.LLST4)
+.LLST5:
+	.long	.LFB3-.Ltext0	# Location list begin address (*.LLST5)
+	.long	.LCFI17-.Ltext0	# Location list end address (*.LLST5)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI17-.Ltext0	# Location list begin address (*.LLST5)
+	.long	.LCFI18-.Ltext0	# Location list end address (*.LLST5)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI18-.Ltext0	# Location list begin address (*.LLST5)
+	.long	.LCFI22-.Ltext0	# Location list end address (*.LLST5)
+	.value	0x2	# Location expression size
+	.byte	0x75	# DW_OP_breg5
+	.sleb128 8
+	.long	.LCFI22-.Ltext0	# Location list begin address (*.LLST5)
+	.long	.LCFI23-.Ltext0	# Location list end address (*.LLST5)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI23-.Ltext0	# Location list begin address (*.LLST5)
+	.long	.LFE3-.Ltext0	# Location list end address (*.LLST5)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST5)
+	.long	0	# Location list terminator end (*.LLST5)
+.LLST6:
+	.long	.LVL13-.Ltext0	# Location list begin address (*.LLST6)
+	.long	.LVL14-.Ltext0	# Location list end address (*.LLST6)
+	.value	0xa	# Location expression size
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0x4
+	.uleb128 0
+	.byte	0x34	# DW_OP_lit4
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0xc
+	.uleb128 0
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x2
+	.long	.LVL14-.Ltext0	# Location list begin address (*.LLST6)
+	.long	.LVL15-.Ltext0	# Location list end address (*.LLST6)
+	.value	0x15	# Location expression size
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0x4
+	.uleb128 0
+	.byte	0x34	# DW_OP_lit4
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0xc
+	.uleb128 0
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x94	# DW_OP_deref_size
+	.byte	0x2
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x6
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0xc
+	.uleb128 0
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0x4
+	.uleb128 0
+	.long	.LVL15-.Ltext0	# Location list begin address (*.LLST6)
+	.long	.LVL16-1-.Ltext0	# Location list end address (*.LLST6)
+	.value	0x14	# Location expression size
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0x4
+	.uleb128 0
+	.byte	0x52	# DW_OP_reg2
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0xc
+	.uleb128 0
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x94	# DW_OP_deref_size
+	.byte	0x2
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x7
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0xc
+	.uleb128 0
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0x4
+	.uleb128 0
+	.long	.LVL16-1-.Ltext0	# Location list begin address (*.LLST6)
+	.long	.LVL17-.Ltext0	# Location list end address (*.LLST6)
+	.value	0x14	# Location expression size
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0x4
+	.uleb128 0
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0xc
+	.uleb128 0
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x94	# DW_OP_deref_size
+	.byte	0x2
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x7
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0xc
+	.uleb128 0
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0x4
+	.uleb128 0
+	.long	.LVL17-.Ltext0	# Location list begin address (*.LLST6)
+	.long	.LFE3-.Ltext0	# Location list end address (*.LLST6)
+	.value	0xf	# Location expression size
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x2
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x94	# DW_OP_deref_size
+	.byte	0x2
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x7
+	.byte	0x9f	# DW_OP_stack_value
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0xc
+	.uleb128 0
+	.byte	0x9d	# DW_OP_bit_piece
+	.uleb128 0x4
+	.uleb128 0
+	.long	0	# Location list terminator begin (*.LLST6)
+	.long	0	# Location list terminator end (*.LLST6)
+.LLST7:
+	.long	.LFB4-.Ltext0	# Location list begin address (*.LLST7)
+	.long	.LCFI24-.Ltext0	# Location list end address (*.LLST7)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI24-.Ltext0	# Location list begin address (*.LLST7)
+	.long	.LCFI25-.Ltext0	# Location list end address (*.LLST7)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI25-.Ltext0	# Location list begin address (*.LLST7)
+	.long	.LCFI29-.Ltext0	# Location list end address (*.LLST7)
+	.value	0x2	# Location expression size
+	.byte	0x75	# DW_OP_breg5
+	.sleb128 8
+	.long	.LCFI29-.Ltext0	# Location list begin address (*.LLST7)
+	.long	.LCFI30-.Ltext0	# Location list end address (*.LLST7)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI30-.Ltext0	# Location list begin address (*.LLST7)
+	.long	.LFE4-.Ltext0	# Location list end address (*.LLST7)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST7)
+	.long	0	# Location list terminator end (*.LLST7)
+.LLST8:
+	.long	.LVL19-.Ltext0	# Location list begin address (*.LLST8)
+	.long	.LVL20-.Ltext0	# Location list end address (*.LLST8)
+	.value	0x8	# Location expression size
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL20-.Ltext0	# Location list begin address (*.LLST8)
+	.long	.LVL21-.Ltext0	# Location list end address (*.LLST8)
+	.value	0x6	# Location expression size
+	.byte	0x53	# DW_OP_reg3
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL21-.Ltext0	# Location list begin address (*.LLST8)
+	.long	.LVL22-.Ltext0	# Location list end address (*.LLST8)
+	.value	0x5	# Location expression size
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	0	# Location list terminator begin (*.LLST8)
+	.long	0	# Location list terminator end (*.LLST8)
+.LLST9:
+	.long	.LFB5-.Ltext0	# Location list begin address (*.LLST9)
+	.long	.LCFI31-.Ltext0	# Location list end address (*.LLST9)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI31-.Ltext0	# Location list begin address (*.LLST9)
+	.long	.LCFI32-.Ltext0	# Location list end address (*.LLST9)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI32-.Ltext0	# Location list begin address (*.LLST9)
+	.long	.LCFI36-.Ltext0	# Location list end address (*.LLST9)
+	.value	0x2	# Location expression size
+	.byte	0x75	# DW_OP_breg5
+	.sleb128 8
+	.long	.LCFI36-.Ltext0	# Location list begin address (*.LLST9)
+	.long	.LCFI37-.Ltext0	# Location list end address (*.LLST9)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI37-.Ltext0	# Location list begin address (*.LLST9)
+	.long	.LFE5-.Ltext0	# Location list end address (*.LLST9)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST9)
+	.long	0	# Location list terminator end (*.LLST9)
+.LLST10:
+	.long	.LVL24-.Ltext0	# Location list begin address (*.LLST10)
+	.long	.LVL25-.Ltext0	# Location list end address (*.LLST10)
+	.value	0x8	# Location expression size
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL25-.Ltext0	# Location list begin address (*.LLST10)
+	.long	.LVL26-.Ltext0	# Location list end address (*.LLST10)
+	.value	0x6	# Location expression size
+	.byte	0x53	# DW_OP_reg3
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	.LVL26-.Ltext0	# Location list begin address (*.LLST10)
+	.long	.LVL27-.Ltext0	# Location list end address (*.LLST10)
+	.value	0x5	# Location expression size
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.byte	0x56	# DW_OP_reg6
+	.byte	0x93	# DW_OP_piece
+	.uleb128 0x4
+	.long	0	# Location list terminator begin (*.LLST10)
+	.long	0	# Location list terminator end (*.LLST10)
+.LLST11:
+	.long	.LFB6-.Ltext0	# Location list begin address (*.LLST11)
+	.long	.LCFI38-.Ltext0	# Location list end address (*.LLST11)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	.LCFI38-.Ltext0	# Location list begin address (*.LLST11)
+	.long	.LCFI39-.Ltext0	# Location list end address (*.LLST11)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 8
+	.long	.LCFI39-.Ltext0	# Location list begin address (*.LLST11)
+	.long	.LCFI43-.Ltext0	# Location list end address (*.LLST11)
+	.value	0x2	# Location expression size
+	.byte	0x75	# DW_OP_breg5
+	.sleb128 8
+	.long	.LCFI43-.Ltext0	# Location list begin address (*.LLST11)
+	.long	.LFE6-.Ltext0	# Location list end address (*.LLST11)
+	.value	0x2	# Location expression size
+	.byte	0x74	# DW_OP_breg4
+	.sleb128 4
+	.long	0	# Location list terminator begin (*.LLST11)
+	.long	0	# Location list terminator end (*.LLST11)
+.LLST12:
+	.long	.LVL28-.Ltext0	# Location list begin address (*.LLST12)
+	.long	.LVL29-.Ltext0	# Location list end address (*.LLST12)
+	.value	0x1	# Location expression size
+	.byte	0x53	# DW_OP_reg3
+	.long	0	# Location list terminator begin (*.LLST12)
+	.long	0	# Location list terminator end (*.LLST12)
+	.section	.debug_info
+	.long	0x1e3	# Length of Compilation Unit Info
+	.value	0x2	# DWARF version number
+	.long	.Ldebug_abbrev0	# Offset Into Abbrev. Section
+	.byte	0x4	# Pointer Size (in bytes)
+	.uleb128 0x1	# (DIE (0xb) DW_TAG_compile_unit)
+	.long	.LASF1	# DW_AT_producer: "GNU C 4.6.0 20100506 (experimental) [trunk revision 159117]"
+	.byte	0x1	# DW_AT_language
+	.long	.LASF2	# DW_AT_name: "pieces.c"
+	.long	.LASF3	# DW_AT_comp_dir: "/home/tromey/gnu/PRS/rh589467"
+	.long	.Ltext0	# DW_AT_low_pc
+	.long	.Letext0	# DW_AT_high_pc
+	.long	.Ldebug_line0	# DW_AT_stmt_list
+	.uleb128 0x2	# (DIE (0x25) DW_TAG_structure_type)
+	.ascii "A\0"	# DW_AT_name
+	.byte	0x8	# DW_AT_byte_size
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x5	# DW_AT_decl_line
+	.long	0x48	# DW_AT_sibling
+	.uleb128 0x3	# (DIE (0x2f) DW_TAG_member)
+	.ascii "i\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x5	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x2	# DW_AT_data_member_location
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0
+	.uleb128 0x3	# (DIE (0x3b) DW_TAG_member)
+	.ascii "j\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x5	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x2	# DW_AT_data_member_location
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0x4
+	.byte	0	# end of children of DIE 0x25
+	.uleb128 0x4	# (DIE (0x48) DW_TAG_base_type)
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0x5	# DW_AT_encoding
+	.ascii "int\0"	# DW_AT_name
+	.uleb128 0x2	# (DIE (0x4f) DW_TAG_structure_type)
+	.ascii "B\0"	# DW_AT_name
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x6	# DW_AT_decl_line
+	.long	0x78	# DW_AT_sibling
+	.uleb128 0x5	# (DIE (0x59) DW_TAG_member)
+	.ascii "i\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x6	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0xc	# DW_AT_bit_size
+	.byte	0x10	# DW_AT_bit_offset
+	.byte	0x2	# DW_AT_data_member_location
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0
+	.uleb128 0x5	# (DIE (0x68) DW_TAG_member)
+	.ascii "j\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x6	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0xc	# DW_AT_bit_size
+	.byte	0x4	# DW_AT_bit_offset
+	.byte	0x2	# DW_AT_data_member_location
+	.byte	0x23	# DW_OP_plus_uconst
+	.uleb128 0
+	.byte	0	# end of children of DIE 0x4f
+	.uleb128 0x6	# (DIE (0x78) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "bar\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x9	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	.LFB0	# DW_AT_low_pc
+	.long	.LFE0	# DW_AT_high_pc
+	.long	.LLST0	# DW_AT_frame_base
+	.long	0x9e	# DW_AT_sibling
+	.uleb128 0x7	# (DIE (0x91) DW_TAG_formal_parameter)
+	.ascii "x\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x9	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.byte	0	# end of children of DIE 0x78
+	.uleb128 0x8	# (DIE (0x9e) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f1\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0xf	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	0x48	# DW_AT_type
+	.long	.LFB1	# DW_AT_low_pc
+	.long	.LFE1	# DW_AT_high_pc
+	.long	.LLST1	# DW_AT_frame_base
+	.long	0xd4	# DW_AT_sibling
+	.uleb128 0x7	# (DIE (0xba) DW_TAG_formal_parameter)
+	.ascii "k\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0xf	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x9	# (DIE (0xc6) DW_TAG_variable)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x11	# DW_AT_decl_line
+	.long	0x25	# DW_AT_type
+	.long	.LLST2	# DW_AT_location
+	.byte	0	# end of children of DIE 0x9e
+	.uleb128 0x8	# (DIE (0xd4) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f2\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x1a	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	0x48	# DW_AT_type
+	.long	.LFB2	# DW_AT_low_pc
+	.long	.LFE2	# DW_AT_high_pc
+	.long	.LLST3	# DW_AT_frame_base
+	.long	0x10a	# DW_AT_sibling
+	.uleb128 0x7	# (DIE (0xf0) DW_TAG_formal_parameter)
+	.ascii "k\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x1a	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x9	# (DIE (0xfc) DW_TAG_variable)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x1c	# DW_AT_decl_line
+	.long	0x10a	# DW_AT_type
+	.long	.LLST4	# DW_AT_location
+	.byte	0	# end of children of DIE 0xd4
+	.uleb128 0xa	# (DIE (0x10a) DW_TAG_array_type)
+	.long	0x48	# DW_AT_type
+	.long	0x11a	# DW_AT_sibling
+	.uleb128 0xb	# (DIE (0x113) DW_TAG_subrange_type)
+	.long	0x11a	# DW_AT_type
+	.byte	0x1	# DW_AT_upper_bound
+	.byte	0	# end of children of DIE 0x10a
+	.uleb128 0xc	# (DIE (0x11a) DW_TAG_base_type)
+	.byte	0x4	# DW_AT_byte_size
+	.byte	0x7	# DW_AT_encoding
+	.uleb128 0x8	# (DIE (0x11d) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f3\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x25	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	0x48	# DW_AT_type
+	.long	.LFB3	# DW_AT_low_pc
+	.long	.LFE3	# DW_AT_high_pc
+	.long	.LLST5	# DW_AT_frame_base
+	.long	0x153	# DW_AT_sibling
+	.uleb128 0x7	# (DIE (0x139) DW_TAG_formal_parameter)
+	.ascii "k\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x25	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x9	# (DIE (0x145) DW_TAG_variable)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x27	# DW_AT_decl_line
+	.long	0x4f	# DW_AT_type
+	.long	.LLST6	# DW_AT_location
+	.byte	0	# end of children of DIE 0x11d
+	.uleb128 0x8	# (DIE (0x153) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f4\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x30	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	0x48	# DW_AT_type
+	.long	.LFB4	# DW_AT_low_pc
+	.long	.LFE4	# DW_AT_high_pc
+	.long	.LLST7	# DW_AT_frame_base
+	.long	0x189	# DW_AT_sibling
+	.uleb128 0x7	# (DIE (0x16f) DW_TAG_formal_parameter)
+	.ascii "k\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x30	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x9	# (DIE (0x17b) DW_TAG_variable)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x32	# DW_AT_decl_line
+	.long	0x10a	# DW_AT_type
+	.long	.LLST8	# DW_AT_location
+	.byte	0	# end of children of DIE 0x153
+	.uleb128 0x8	# (DIE (0x189) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.ascii "f5\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x3b	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	0x48	# DW_AT_type
+	.long	.LFB5	# DW_AT_low_pc
+	.long	.LFE5	# DW_AT_high_pc
+	.long	.LLST9	# DW_AT_frame_base
+	.long	0x1bf	# DW_AT_sibling
+	.uleb128 0x7	# (DIE (0x1a5) DW_TAG_formal_parameter)
+	.ascii "k\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x3b	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.byte	0x2	# DW_AT_location
+	.byte	0x91	# DW_OP_fbreg
+	.sleb128 0
+	.uleb128 0x9	# (DIE (0x1b1) DW_TAG_variable)
+	.ascii "a\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x3d	# DW_AT_decl_line
+	.long	0x25	# DW_AT_type
+	.long	.LLST10	# DW_AT_location
+	.byte	0	# end of children of DIE 0x189
+	.uleb128 0xd	# (DIE (0x1bf) DW_TAG_subprogram)
+	.byte	0x1	# DW_AT_external
+	.long	.LASF0	# DW_AT_name: "main"
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x46	# DW_AT_decl_line
+	.byte	0x1	# DW_AT_prototyped
+	.long	0x48	# DW_AT_type
+	.long	.LFB6	# DW_AT_low_pc
+	.long	.LFE6	# DW_AT_high_pc
+	.long	.LLST11	# DW_AT_frame_base
+	.uleb128 0x9	# (DIE (0x1d8) DW_TAG_variable)
+	.ascii "k\0"	# DW_AT_name
+	.byte	0x1	# DW_AT_decl_file (pieces.c)
+	.byte	0x48	# DW_AT_decl_line
+	.long	0x48	# DW_AT_type
+	.long	.LLST12	# DW_AT_location
+	.byte	0	# end of children of DIE 0x1bf
+	.byte	0	# end of children of DIE 0xb
+	.section	.debug_abbrev
+	.uleb128 0x1	# (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 0x6	# (DW_FORM_data4)
+	.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 0xa	# (DW_FORM_block1)
+	.byte	0
+	.byte	0
+	.uleb128 0x4	# (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 0x5	# (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 0xb	# (DW_AT_byte_size)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0xd	# (DW_AT_bit_size)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0xc	# (DW_AT_bit_offset)
+	.uleb128 0xb	# (DW_FORM_data1)
+	.uleb128 0x38	# (DW_AT_data_member_location)
+	.uleb128 0xa	# (DW_FORM_block1)
+	.byte	0
+	.byte	0
+	.uleb128 0x6	# (abbrev code)
+	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.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 0xc	# (DW_FORM_flag)
+	.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 0x6	# (DW_FORM_data4)
+	.uleb128 0x1	# (DW_AT_sibling)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0x7	# (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 0xa	# (DW_FORM_block1)
+	.byte	0
+	.byte	0
+	.uleb128 0x8	# (abbrev code)
+	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.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 0xc	# (DW_FORM_flag)
+	.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 0x6	# (DW_FORM_data4)
+	.uleb128 0x1	# (DW_AT_sibling)
+	.uleb128 0x13	# (DW_FORM_ref4)
+	.byte	0
+	.byte	0
+	.uleb128 0x9	# (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 0x6	# (DW_FORM_data4)
+	.byte	0
+	.byte	0
+	.uleb128 0xa	# (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 0xb	# (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 0xc	# (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)
+	.byte	0
+	.byte	0
+	.uleb128 0xd	# (abbrev code)
+	.uleb128 0x2e	# (TAG: DW_TAG_subprogram)
+	.byte	0x1	# DW_children_yes
+	.uleb128 0x3f	# (DW_AT_external)
+	.uleb128 0xc	# (DW_FORM_flag)
+	.uleb128 0x3	# (DW_AT_name)
+	.uleb128 0xe	# (DW_FORM_strp)
+	.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 0xc	# (DW_FORM_flag)
+	.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 0x6	# (DW_FORM_data4)
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_pubnames,"",@progbits
+	.long	0x42	# Length of Public Names Info
+	.value	0x2	# DWARF Version
+	.long	.Ldebug_info0	# Offset of Compilation Unit Info
+	.long	0x1e7	# Compilation Unit Length
+	.long	0x78	# DIE offset
+	.ascii "bar\0"	# external name
+	.long	0x9e	# DIE offset
+	.ascii "f1\0"	# external name
+	.long	0xd4	# DIE offset
+	.ascii "f2\0"	# external name
+	.long	0x11d	# DIE offset
+	.ascii "f3\0"	# external name
+	.long	0x153	# DIE offset
+	.ascii "f4\0"	# external name
+	.long	0x189	# DIE offset
+	.ascii "f5\0"	# external name
+	.long	0x1bf	# DIE offset
+	.ascii "main\0"	# external name
+	.long	0
+	.section	.debug_pubtypes,"",@progbits
+	.long	0x1a	# Length of Public Type Names Info
+	.value	0x2	# DWARF Version
+	.long	.Ldebug_info0	# Offset of Compilation Unit Info
+	.long	0x1e7	# Compilation Unit Length
+	.long	0x25	# DIE offset
+	.ascii "A\0"	# external name
+	.long	0x4f	# DIE offset
+	.ascii "B\0"	# external name
+	.long	0
+	.section	.debug_aranges,"",@progbits
+	.long	0x1c	# Length of Address Ranges Info
+	.value	0x2	# DWARF Version
+	.long	.Ldebug_info0	# Offset of Compilation Unit Info
+	.byte	0x4	# Size of Address
+	.byte	0	# Size of Segment Descriptor
+	.value	0	# Pad to 8 byte boundary
+	.value	0
+	.long	.Ltext0	# Address
+	.long	.Letext0-.Ltext0	# Length
+	.long	0
+	.long	0
+	.section	.debug_str,"MS",@progbits,1
+.LASF2:
+	.string	"pieces.c"
+.LASF1:
+	.string	"GNU C 4.6.0 20100506 (experimental) [trunk revision 159117]"
+.LASF3:
+	.string	"/home/tromey/gnu/PRS/rh589467"
+.LASF0:
+	.string	"main"
+	.ident	"GCC: (GNU) 4.6.0 20100506 (experimental) [trunk revision 159117]"
+	.section	.note.GNU-stack,"",@progbits
Index: testsuite/gdb.dwarf2/pieces.c
===================================================================
RCS file: testsuite/gdb.dwarf2/pieces.c
diff -N testsuite/gdb.dwarf2/pieces.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.dwarf2/pieces.c	13 May 2010 17:01:03 -0000
@@ -0,0 +1,80 @@
+/* The original program corresponding to pieces.c.
+   This originally came from https://bugzilla.redhat.com/show_bug.cgi?id=589467
+   Note that it is not ever compiled, pieces.S is used instead.  */
+
+struct A { int i; int j; };
+struct B { int : 4; int i : 12; int j : 12; int : 4; };
+
+__attribute__((noinline)) void
+bar (int x)
+{
+  asm volatile ("" : : "r" (x) : "memory");
+}
+
+__attribute__((noinline)) int
+f1 (int k)
+{
+  struct A a = { 4, k + 6 };
+  asm ("" : "+r" (a.i));
+  a.j++;
+  bar (a.i);		/* { dg-final { gdb-test 20 "a.i" "4" } } */
+  bar (a.j);		/* { dg-final { gdb-test 20 "a.j" "14" } } */
+  return a.i + a.j;
+}
+
+__attribute__((noinline)) int
+f2 (int k)
+{
+  int a[2] = { 4, k + 6 };
+  asm ("" : "+r" (a[0]));
+  a[1]++;
+  bar (a[0]);		/* { dg-final { gdb-test 31 "a\[0\]" "4" } } */
+  bar (a[1]);		/* { dg-final { gdb-test 31 "a\[1\]" "14" } } */
+  return a[0] + a[1];
+}
+
+__attribute__((noinline)) int
+f3 (int k)
+{
+  struct B a = { 4, k + 6 };
+  asm ("" : "+r" (a.i));
+  a.j++;
+  bar (a.i);		/* { dg-final { gdb-test 42 "a.i" "4" } } */
+  bar (a.j);		/* { dg-final { gdb-test 42 "a.j" "14" } } */
+  return a.i + a.j;
+}
+
+__attribute__((noinline)) int
+f4 (int k)
+{
+  int a[2] = { k, k };
+  asm ("" : "+r" (a[0]));
+  a[1]++;
+  bar (a[0]);		/* { dg-final { gdb-test 31 "a\[0\]" "4" } } */
+  bar (a[1]);		/* { dg-final { gdb-test 31 "a\[1\]" "14" } } */
+  return a[0] + a[1];
+}
+
+__attribute__((noinline)) int
+f5 (int k)
+{
+  struct A a = { k, k };
+  asm ("" : "+r" (a.i));
+  a.j++;
+  bar (a.i);		/* { dg-final { gdb-test 20 "a.i" "4" } } */
+  bar (a.j);		/* { dg-final { gdb-test 20 "a.j" "14" } } */
+  return a.i + a.j;
+}
+
+int
+main (void)
+{
+  int k;
+  asm ("" : "=r" (k) : "0" (7));
+  f1 (k);
+  f2 (k);
+  f3 (k);
+  f4 (k);
+  f5 (k);
+  return 0;
+}
Index: testsuite/gdb.dwarf2/pieces.exp
===================================================================
RCS file: testsuite/gdb.dwarf2/pieces.exp
diff -N testsuite/gdb.dwarf2/pieces.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.dwarf2/pieces.exp	13 May 2010 17:01:03 -0000
@@ -0,0 +1,60 @@
+# Copyright 2010 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test some DWARF piece operators.
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+# For now pick a sampling of likely targets.
+if {![istarget *-*-linux*]
+    && ![istarget *-*-gnu*]
+    && ![istarget *-*-elf*]
+    && ![istarget *-*-openbsd*]
+    && ![istarget arm-*-eabi*]
+    && ![istarget powerpc-*-eabi*]} {
+    return 0  
+}
+# This test can only be run on x86 targets.
+if {![istarget i?86-*]} {
+    return 0  
+}
+
+set testfile "pieces"
+set srcfile ${testfile}.S
+set binfile ${objdir}/${subdir}/${testfile}.x
+
+if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable \
+       [list {additional_flags=-nostdlib}]] != "" } {
+    return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+if ![runto_main] {
+    return -1
+}
+
+# Function f1 tests a particular gdb bug involving DW_OP_piece.
+proc pieces_test_f1 {} {
+    gdb_test "break pieces.c:22" "Breakpoint 2.*" \
+	"set first breakpoint for pieces"
+    gdb_continue_to_breakpoint "first continue to breakpoint for pieces"
+    gdb_test "print a" " = {i = 4, j = 14}" "print a in pieces:f1"
+    gdb_test "print a.j" " = 14" "print a.j in pieces:f1"
+}
+
+pieces_test_f1



More information about the Gdb-patches mailing list