public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] gdb: Handle multiple base address in debug_ranges data.
@ 2015-10-16 12:54 Andrew Burgess
  2015-10-26  3:49 ` Doug Evans
  2015-11-03 10:35 ` [PATCH v2] " Andrew Burgess
  0 siblings, 2 replies; 6+ messages in thread
From: Andrew Burgess @ 2015-10-16 12:54 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess

It is possible to use multiple base addresses within a single address
range series, within the .debug_ranges section.  The following is a
simplified example for 32-bit addresses:

  .section ".debug_ranges"
  .4byte	0xffffffff
  .4byte        BASE_1
  .4byte	START_OFFSET_1
  .4byte	END_OFFSET_1
  .4byte	START_OFFSET_2
  .4byte	END_OFFSET_2
  .4byte	0xffffffff
  .4byte        BASE_2
  .4byte	START_OFFSET_3
  .4byte	END_OFFSET_3
  .4byte	0
  .4byte	0

In this example START/END 1 and 2 are relative to BASE_1, while
START/END 3 are relative to BASE_2.

Currently gdb does not correctly parse this DWARF, resulting in
corrupted address range information.  This commit fixes this issue, and
adds a new test to cover this case.

gdb/ChangeLog:

	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
	reading code.

gdb/testsuite/ChangeLog:

	* gdb.arch/amd64-debug-ranges-base.c: New file.
	* gdb.arch/amd64-debug-ranges-base.exp: New file.
	* gdb.arch/amd64-debug-ranges-base.s: New file.
---
 gdb/ChangeLog                                      |    5 +
 gdb/dwarf2read.c                                   |   19 +-
 gdb/testsuite/ChangeLog                            |    6 +
 gdb/testsuite/gdb.arch/amd64-debug-ranges-base.c   |   34 +
 gdb/testsuite/gdb.arch/amd64-debug-ranges-base.exp |   39 +
 gdb/testsuite/gdb.arch/amd64-debug-ranges-base.s   | 1540 ++++++++++++++++++++
 6 files changed, 1627 insertions(+), 16 deletions(-)
 create mode 100644 gdb/testsuite/gdb.arch/amd64-debug-ranges-base.c
 create mode 100644 gdb/testsuite/gdb.arch/amd64-debug-ranges-base.exp
 create mode 100644 gdb/testsuite/gdb.arch/amd64-debug-ranges-base.s

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 8646e6d..d5649d1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-15  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
+	reading code.
+
 2015-10-15  Yao Qi  <yao.qi@linaro.org>
 
 	* aarch64-linux-nat.c (aarch64_linux_insert_hw_breakpoint):
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 0c45d29..e75d5bb 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -11894,7 +11894,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
   int found_base;
   unsigned int dummy;
   const gdb_byte *buffer;
-  CORE_ADDR marker;
   int low_set;
   CORE_ADDR low = 0;
   CORE_ADDR high = 0;
@@ -11913,18 +11912,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
     }
   buffer = dwarf2_per_objfile->ranges.buffer + offset;
 
-  /* Read in the largest possible address.  */
-  marker = read_address (obfd, buffer, cu, &dummy);
-  if ((marker & mask) == mask)
-    {
-      /* If we found the largest possible address, then
-	 read the base address.  */
-      base = read_address (obfd, buffer + addr_size, cu, &dummy);
-      buffer += 2 * addr_size;
-      offset += 2 * addr_size;
-      found_base = 1;
-    }
-
   low_set = 0;
 
   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
@@ -11949,9 +11936,9 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
 	 the base address.  Check for a base address here.  */
       if ((range_beginning & mask) == mask)
 	{
-	  /* If we found the largest possible address, then
-	     read the base address.  */
-	  base = read_address (obfd, buffer + addr_size, cu, &dummy);
+	  /* If we found the largest possible address, then we already
+	     have the base address in range_end.  */
+	  base = range_end;
 	  found_base = 1;
 	  continue;
 	}
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 74aa6ae..1587ac6 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-10-16  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* gdb.arch/amd64-debug-ranges-base.c: New file.
+	* gdb.arch/amd64-debug-ranges-base.exp: New file.
+	* gdb.arch/amd64-debug-ranges-base.s: New file.
+
 2015-10-12  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* gdb.base/dbx.exp (test_func): Remove xfails, update expected
diff --git a/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.c b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.c
new file mode 100644
index 0000000..7d2f7da
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.c
@@ -0,0 +1,34 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2015 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/>.  */
+
+int __attribute__ ((section (".text.3")))
+frame3 (void)
+{
+  return 0;
+}
+
+int __attribute__ ((section (".text.2")))
+frame2 (void)
+{
+  return 0;
+}
+
+int __attribute__ ((section (".text.1")))
+main (void)
+{
+  return frame2 ();
+}
diff --git a/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.exp b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.exp
new file mode 100644
index 0000000..cee494d
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.exp
@@ -0,0 +1,39 @@
+# Copyright (C) 2015 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/>.
+
+standard_testfile .s
+set opts {}
+
+if [info exists COMPILE] {
+    # make check RUNTESTFLAGS="gdb.arch/amd64-entry-value.exp COMPILE=1"
+    set srcfile ${testfile}.cc
+    lappend opts debug optimize=-O2
+} elseif { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
+    verbose "Skipping amd64-debug-ranges-base."
+    return
+}
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} $opts] } {
+    return -1
+}
+
+if ![runto_main] {
+    return -1
+}
+
+gdb_test "info line main" "Line \[0-9\]* of .* starts at address .* and ends at .*"
+gdb_test "info line frame2" "Line \[0-9\]* of .* starts at address .* and ends at .*"
+gdb_test "info line frame3" "Line \[0-9\]* of .* starts at address .* and ends at .*"
+
diff --git a/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.s b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.s
new file mode 100644
index 0000000..d672b4d
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.s
@@ -0,0 +1,1540 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2015 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 file is compiled from gdb.arch/amd64-debug-ranges-base.c
+   using '-g3 -O0 -S', after which the .debug_ranges sections was
+   re-written by hand in order to contain the required (valid) DWARF.  */
+
+        .file	"amd64-debug-ranges-base.c"
+	.text
+.Ltext0:
+	.section	.text.3,"ax",@progbits
+	.globl	frame3
+	.type	frame3, @function
+frame3:
+.LFB0:
+	.file 1 "amd64-debug-ranges-base.c"
+	.loc 1 20 0
+	.cfi_startproc
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset 6, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register 6
+	.loc 1 21 0
+	movl	$0, %eax
+	.loc 1 22 0
+	popq	%rbp
+	.cfi_def_cfa 7, 8
+	ret
+	.cfi_endproc
+.LFE0:
+	.size	frame3, .-frame3
+	.section	.text.2,"ax",@progbits
+	.globl	frame2
+	.type	frame2, @function
+frame2:
+.LFB1:
+	.loc 1 26 0
+	.cfi_startproc
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset 6, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register 6
+	.loc 1 27 0
+	movl	$0, %eax
+	.loc 1 28 0
+	popq	%rbp
+	.cfi_def_cfa 7, 8
+	ret
+	.cfi_endproc
+.LFE1:
+	.size	frame2, .-frame2
+	.section	.text.1,"ax",@progbits
+	.globl	main
+	.type	main, @function
+main:
+.LFB2:
+	.loc 1 32 0
+	.cfi_startproc
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset 6, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register 6
+	.loc 1 33 0
+	call	frame2
+	.loc 1 34 0
+	popq	%rbp
+	.cfi_def_cfa 7, 8
+	ret
+	.cfi_endproc
+.LFE2:
+	.size	main, .-main
+	.text
+.Letext0:
+	.section	.debug_info,"",@progbits
+.Ldebug_info0:
+	.long	0x88
+	.value	0x4
+	.long	.Ldebug_abbrev0
+	.byte	0x8
+	.uleb128 0x1
+	.long	.LASF251
+	.byte	0xc
+	.long	.LASF252
+	.long	.LASF253
+	.long	.Ldebug_ranges0+0
+	.quad	0
+	.long	.Ldebug_line0
+	.long	.Ldebug_macro0
+	.uleb128 0x2
+	.long	.LASF248
+	.byte	0x1
+	.byte	0x13
+	.long	0x4a
+	.quad	.LFB0
+	.quad	.LFE0-.LFB0
+	.uleb128 0x1
+	.byte	0x9c
+	.uleb128 0x3
+	.byte	0x4
+	.byte	0x5
+	.string	"int"
+	.uleb128 0x2
+	.long	.LASF249
+	.byte	0x1
+	.byte	0x19
+	.long	0x4a
+	.quad	.LFB1
+	.quad	.LFE1-.LFB1
+	.uleb128 0x1
+	.byte	0x9c
+	.uleb128 0x4
+	.long	.LASF250
+	.byte	0x1
+	.byte	0x1f
+	.long	0x4a
+	.quad	.LFB2
+	.quad	.LFE2-.LFB2
+	.uleb128 0x1
+	.byte	0x9c
+	.byte	0
+	.section	.debug_abbrev,"",@progbits
+.Ldebug_abbrev0:
+	.uleb128 0x1
+	.uleb128 0x11
+	.byte	0x1
+	.uleb128 0x25
+	.uleb128 0xe
+	.uleb128 0x13
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x1b
+	.uleb128 0xe
+	.uleb128 0x55
+	.uleb128 0x17
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x10
+	.uleb128 0x17
+	.uleb128 0x2119
+	.uleb128 0x17
+	.byte	0
+	.byte	0
+	.uleb128 0x2
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2117
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.uleb128 0x3
+	.uleb128 0x24
+	.byte	0
+	.uleb128 0xb
+	.uleb128 0xb
+	.uleb128 0x3e
+	.uleb128 0xb
+	.uleb128 0x3
+	.uleb128 0x8
+	.byte	0
+	.byte	0
+	.uleb128 0x4
+	.uleb128 0x2e
+	.byte	0
+	.uleb128 0x3f
+	.uleb128 0x19
+	.uleb128 0x3
+	.uleb128 0xe
+	.uleb128 0x3a
+	.uleb128 0xb
+	.uleb128 0x3b
+	.uleb128 0xb
+	.uleb128 0x27
+	.uleb128 0x19
+	.uleb128 0x49
+	.uleb128 0x13
+	.uleb128 0x11
+	.uleb128 0x1
+	.uleb128 0x12
+	.uleb128 0x7
+	.uleb128 0x40
+	.uleb128 0x18
+	.uleb128 0x2116
+	.uleb128 0x19
+	.byte	0
+	.byte	0
+	.byte	0
+	.section	.debug_aranges,"",@progbits
+	.long	0x4c
+	.value	0x2
+	.long	.Ldebug_info0
+	.byte	0x8
+	.byte	0
+	.value	0
+	.value	0
+	.quad	.LFB0
+	.quad	.LFE0-.LFB0
+	.quad	.LFB1
+	.quad	.LFE1-.LFB1
+	.quad	.LFB2
+	.quad	.LFE2-.LFB2
+	.quad	0
+	.quad	0
+	.section	.debug_ranges,"",@progbits
+.Ldebug_ranges0:
+	.quad	0xffffffffffffffff
+	.quad	.LFB0
+	.quad	0
+	.quad	.LFE0 - .LFB0
+	.quad	0xffffffffffffffff
+	.quad	.LFB1
+	.quad	0
+	.quad	.LFE1 - .LFB1
+	.quad	0xffffffffffffffff
+	.quad	.LFB2
+	.quad	0
+	.quad	.LFE2 - .LFB2
+	.quad	0
+	.quad	0
+	.section	.debug_macro,"",@progbits
+.Ldebug_macro0:
+	.value	0x4
+	.byte	0x2
+	.long	.Ldebug_line0
+	.byte	0x7
+	.long	.Ldebug_macro1
+	.byte	0x3
+	.uleb128 0
+	.uleb128 0x1
+	.file 2 "/usr/include/stdc-predef.h"
+	.byte	0x3
+	.uleb128 0
+	.uleb128 0x2
+	.byte	0x7
+	.long	.Ldebug_macro2
+	.byte	0x4
+	.byte	0x4
+	.byte	0
+	.section	.debug_macro,"G",@progbits,wm4.0.9fc6967513006a990da6a9952cf266ea,comdat
+.Ldebug_macro1:
+	.value	0x4
+	.byte	0
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF0
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF1
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF2
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF3
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF4
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF5
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF6
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF7
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF8
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF9
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF10
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF11
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF12
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF13
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF14
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF15
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF16
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF17
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF18
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF19
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF20
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF21
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF22
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF23
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF24
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF25
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF26
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF27
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF28
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF29
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF30
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF31
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF32
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF33
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF34
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF35
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF36
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF37
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF38
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF39
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF40
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF41
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF42
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF43
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF44
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF45
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF46
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF47
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF48
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF49
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF50
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF51
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF52
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF53
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF54
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF55
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF56
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF57
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF58
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF59
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF60
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF61
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF62
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF63
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF64
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF65
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF66
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF67
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF68
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF69
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF70
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF71
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF72
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF73
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF74
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF75
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF76
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF77
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF78
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF79
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF80
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF81
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF82
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF83
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF84
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF85
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF86
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF87
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF88
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF89
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF90
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF91
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF92
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF93
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF94
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF95
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF96
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF97
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF98
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF99
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF100
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF101
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF102
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF103
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF104
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF105
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF106
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF107
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF108
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF109
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF110
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF111
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF112
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF113
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF114
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF115
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF116
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF117
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF118
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF119
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF120
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF121
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF122
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF123
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF124
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF125
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF126
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF127
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF128
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF129
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF130
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF131
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF132
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF133
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF134
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF135
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF136
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF137
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF138
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF139
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF140
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF141
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF142
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF143
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF144
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF145
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF146
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF147
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF148
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF149
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF150
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF151
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF152
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF153
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF154
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF155
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF156
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF157
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF158
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF159
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF160
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF161
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF162
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF163
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF164
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF165
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF166
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF167
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF168
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF169
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF170
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF171
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF172
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF173
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF174
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF175
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF176
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF177
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF178
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF179
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF180
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF181
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF182
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF183
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF184
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF185
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF186
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF187
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF188
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF189
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF190
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF191
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF192
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF193
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF194
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF195
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF196
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF197
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF198
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF199
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF200
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF201
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF202
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF203
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF204
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF205
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF206
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF207
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF208
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF209
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF210
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF211
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF212
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF213
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF214
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF215
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF216
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF217
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF218
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF219
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF220
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF221
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF222
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF223
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF224
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF225
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF226
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF227
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF228
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF229
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF230
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF231
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF232
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF233
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF234
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF235
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF236
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF237
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF238
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF239
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF240
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF241
+	.byte	0x5
+	.uleb128 0
+	.long	.LASF242
+	.byte	0
+	.section	.debug_macro,"G",@progbits,wm4.stdcpredef.h.19.52894a18705f0664f8da17e99c6c0a93,comdat
+.Ldebug_macro2:
+	.value	0x4
+	.byte	0
+	.byte	0x5
+	.uleb128 0x13
+	.long	.LASF243
+	.byte	0x5
+	.uleb128 0x26
+	.long	.LASF244
+	.byte	0x5
+	.uleb128 0x2e
+	.long	.LASF245
+	.byte	0x5
+	.uleb128 0x3b
+	.long	.LASF246
+	.byte	0x5
+	.uleb128 0x3e
+	.long	.LASF247
+	.byte	0
+	.section	.debug_line,"",@progbits
+.Ldebug_line0:
+	.section	.debug_str,"MS",@progbits,1
+.LASF106:
+	.string	"__UINT_LEAST8_MAX__ 0xff"
+.LASF153:
+	.string	"__DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)"
+.LASF218:
+	.string	"__amd64__ 1"
+.LASF235:
+	.string	"__linux 1"
+.LASF110:
+	.string	"__UINT_LEAST32_MAX__ 0xffffffffU"
+.LASF26:
+	.string	"__SIZEOF_SIZE_T__ 8"
+.LASF8:
+	.string	"__VERSION__ \"5.1.1 20150618 (Red Hat 5.1.1-4)\""
+.LASF1:
+	.string	"__STDC_VERSION__ 201112L"
+.LASF34:
+	.string	"__SIZEOF_POINTER__ 8"
+.LASF252:
+	.string	"amd64-debug-ranges-base.c"
+.LASF178:
+	.string	"__DEC64_MANT_DIG__ 16"
+.LASF128:
+	.string	"__FLT_RADIX__ 2"
+.LASF165:
+	.string	"__LDBL_MIN__ 3.36210314311209350626e-4932L"
+.LASF239:
+	.string	"__unix__ 1"
+.LASF133:
+	.string	"__FLT_MAX_EXP__ 128"
+.LASF162:
+	.string	"__LDBL_MAX_10_EXP__ 4932"
+.LASF215:
+	.string	"__SIZEOF_WINT_T__ 4"
+.LASF148:
+	.string	"__DBL_MAX_10_EXP__ 308"
+.LASF121:
+	.string	"__UINT_FAST64_MAX__ 0xffffffffffffffffUL"
+.LASF217:
+	.string	"__amd64 1"
+.LASF38:
+	.string	"__WINT_TYPE__ unsigned int"
+.LASF113:
+	.string	"__UINT64_C(c) c ## UL"
+.LASF155:
+	.string	"__DBL_HAS_INFINITY__ 1"
+.LASF233:
+	.string	"__SSE2_MATH__ 1"
+.LASF7:
+	.string	"__GNUC_PATCHLEVEL__ 1"
+.LASF236:
+	.string	"__linux__ 1"
+.LASF4:
+	.string	"__STDC_HOSTED__ 1"
+.LASF81:
+	.string	"__WINT_MIN__ 0U"
+.LASF222:
+	.string	"__SIZEOF_FLOAT128__ 16"
+.LASF246:
+	.string	"__STDC_ISO_10646__ 201304L"
+.LASF50:
+	.string	"__UINT32_TYPE__ unsigned int"
+.LASF231:
+	.string	"__FXSR__ 1"
+.LASF184:
+	.string	"__DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD"
+.LASF136:
+	.string	"__FLT_MAX__ 3.40282346638528859812e+38F"
+.LASF253:
+	.string	"/path/to/binutils-gdb/src/gdb/testsuite/gdb.arch"
+.LASF237:
+	.string	"linux 1"
+.LASF114:
+	.string	"__INT_FAST8_MAX__ 0x7f"
+.LASF156:
+	.string	"__DBL_HAS_QUIET_NAN__ 1"
+.LASF143:
+	.string	"__DBL_MANT_DIG__ 53"
+.LASF48:
+	.string	"__UINT8_TYPE__ unsigned char"
+.LASF173:
+	.string	"__DEC32_MAX_EXP__ 97"
+.LASF46:
+	.string	"__INT32_TYPE__ int"
+.LASF43:
+	.string	"__SIG_ATOMIC_TYPE__ int"
+.LASF145:
+	.string	"__DBL_MIN_EXP__ (-1021)"
+.LASF169:
+	.string	"__LDBL_HAS_INFINITY__ 1"
+.LASF20:
+	.string	"__SIZEOF_LONG__ 8"
+.LASF140:
+	.string	"__FLT_HAS_DENORM__ 1"
+.LASF95:
+	.string	"__UINT16_MAX__ 0xffff"
+.LASF204:
+	.string	"__GCC_ATOMIC_WCHAR_T_LOCK_FREE 2"
+.LASF67:
+	.string	"__UINT_FAST64_TYPE__ long unsigned int"
+.LASF123:
+	.string	"__UINTPTR_MAX__ 0xffffffffffffffffUL"
+.LASF33:
+	.string	"__FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__"
+.LASF108:
+	.string	"__UINT_LEAST16_MAX__ 0xffff"
+.LASF212:
+	.string	"__PRAGMA_REDEFINE_EXTNAME 1"
+.LASF53:
+	.string	"__INT_LEAST16_TYPE__ short int"
+.LASF18:
+	.string	"__LP64__ 1"
+.LASF163:
+	.string	"__DECIMAL_DIG__ 21"
+.LASF71:
+	.string	"__has_include_next(STR) __has_include_next__(STR)"
+.LASF122:
+	.string	"__INTPTR_MAX__ 0x7fffffffffffffffL"
+.LASF234:
+	.string	"__gnu_linux__ 1"
+.LASF150:
+	.string	"__DBL_MAX__ ((double)1.79769313486231570815e+308L)"
+.LASF45:
+	.string	"__INT16_TYPE__ short int"
+.LASF170:
+	.string	"__LDBL_HAS_QUIET_NAN__ 1"
+.LASF24:
+	.string	"__SIZEOF_DOUBLE__ 8"
+.LASF94:
+	.string	"__UINT8_MAX__ 0xff"
+.LASF17:
+	.string	"_LP64 1"
+.LASF51:
+	.string	"__UINT64_TYPE__ long unsigned int"
+.LASF54:
+	.string	"__INT_LEAST32_TYPE__ int"
+.LASF93:
+	.string	"__INT64_MAX__ 0x7fffffffffffffffL"
+.LASF224:
+	.string	"__ATOMIC_HLE_RELEASE 131072"
+.LASF230:
+	.string	"__SSE2__ 1"
+.LASF85:
+	.string	"__INTMAX_C(c) c ## L"
+.LASF203:
+	.string	"__GCC_ATOMIC_CHAR32_T_LOCK_FREE 2"
+.LASF213:
+	.string	"__SIZEOF_INT128__ 16"
+.LASF36:
+	.string	"__PTRDIFF_TYPE__ long int"
+.LASF174:
+	.string	"__DEC32_MIN__ 1E-95DF"
+.LASF99:
+	.string	"__INT8_C(c) c"
+.LASF21:
+	.string	"__SIZEOF_LONG_LONG__ 8"
+.LASF130:
+	.string	"__FLT_DIG__ 6"
+.LASF214:
+	.string	"__SIZEOF_WCHAR_T__ 4"
+.LASF105:
+	.string	"__INT64_C(c) c ## L"
+.LASF119:
+	.string	"__UINT_FAST16_MAX__ 0xffffffffffffffffUL"
+.LASF134:
+	.string	"__FLT_MAX_10_EXP__ 38"
+.LASF137:
+	.string	"__FLT_MIN__ 1.17549435082228750797e-38F"
+.LASF59:
+	.string	"__UINT_LEAST64_TYPE__ long unsigned int"
+.LASF25:
+	.string	"__SIZEOF_LONG_DOUBLE__ 16"
+.LASF73:
+	.string	"__SCHAR_MAX__ 0x7f"
+.LASF6:
+	.string	"__GNUC_MINOR__ 1"
+.LASF55:
+	.string	"__INT_LEAST64_TYPE__ long int"
+.LASF127:
+	.string	"__DEC_EVAL_METHOD__ 2"
+.LASF175:
+	.string	"__DEC32_MAX__ 9.999999E96DF"
+.LASF77:
+	.string	"__LONG_LONG_MAX__ 0x7fffffffffffffffLL"
+.LASF200:
+	.string	"__GCC_ATOMIC_BOOL_LOCK_FREE 2"
+.LASF35:
+	.string	"__SIZE_TYPE__ long unsigned int"
+.LASF159:
+	.string	"__LDBL_MIN_EXP__ (-16381)"
+.LASF125:
+	.string	"__GCC_IEC_559_COMPLEX 2"
+.LASF142:
+	.string	"__FLT_HAS_QUIET_NAN__ 1"
+.LASF152:
+	.string	"__DBL_EPSILON__ ((double)2.22044604925031308085e-16L)"
+.LASF32:
+	.string	"__BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__"
+.LASF100:
+	.string	"__INT_LEAST16_MAX__ 0x7fff"
+.LASF83:
+	.string	"__SIZE_MAX__ 0xffffffffffffffffUL"
+.LASF112:
+	.string	"__UINT_LEAST64_MAX__ 0xffffffffffffffffUL"
+.LASF117:
+	.string	"__INT_FAST64_MAX__ 0x7fffffffffffffffL"
+.LASF30:
+	.string	"__ORDER_BIG_ENDIAN__ 4321"
+.LASF68:
+	.string	"__INTPTR_TYPE__ long int"
+.LASF160:
+	.string	"__LDBL_MIN_10_EXP__ (-4931)"
+.LASF210:
+	.string	"__GCC_ATOMIC_POINTER_LOCK_FREE 2"
+.LASF22:
+	.string	"__SIZEOF_SHORT__ 2"
+.LASF243:
+	.string	"_STDC_PREDEF_H 1"
+.LASF101:
+	.string	"__INT16_C(c) c"
+.LASF240:
+	.string	"unix 1"
+.LASF63:
+	.string	"__INT_FAST64_TYPE__ long int"
+.LASF182:
+	.string	"__DEC64_MAX__ 9.999999999999999E384DD"
+.LASF82:
+	.string	"__PTRDIFF_MAX__ 0x7fffffffffffffffL"
+.LASF138:
+	.string	"__FLT_EPSILON__ 1.19209289550781250000e-7F"
+.LASF75:
+	.string	"__INT_MAX__ 0x7fffffff"
+.LASF208:
+	.string	"__GCC_ATOMIC_LLONG_LOCK_FREE 2"
+.LASF104:
+	.string	"__INT_LEAST64_MAX__ 0x7fffffffffffffffL"
+.LASF186:
+	.string	"__DEC128_MIN_EXP__ (-6142)"
+.LASF13:
+	.string	"__ATOMIC_RELEASE 3"
+.LASF149:
+	.string	"__DBL_DECIMAL_DIG__ 17"
+.LASF144:
+	.string	"__DBL_DIG__ 15"
+.LASF135:
+	.string	"__FLT_DECIMAL_DIG__ 9"
+.LASF11:
+	.string	"__ATOMIC_SEQ_CST 5"
+.LASF188:
+	.string	"__DEC128_MIN__ 1E-6143DL"
+.LASF28:
+	.string	"__BIGGEST_ALIGNMENT__ 16"
+.LASF19:
+	.string	"__SIZEOF_INT__ 4"
+.LASF62:
+	.string	"__INT_FAST32_TYPE__ long int"
+.LASF206:
+	.string	"__GCC_ATOMIC_INT_LOCK_FREE 2"
+.LASF187:
+	.string	"__DEC128_MAX_EXP__ 6145"
+.LASF91:
+	.string	"__INT16_MAX__ 0x7fff"
+.LASF198:
+	.string	"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1"
+.LASF180:
+	.string	"__DEC64_MAX_EXP__ 385"
+.LASF14:
+	.string	"__ATOMIC_ACQ_REL 4"
+.LASF129:
+	.string	"__FLT_MANT_DIG__ 24"
+.LASF5:
+	.string	"__GNUC__ 5"
+.LASF40:
+	.string	"__UINTMAX_TYPE__ long unsigned int"
+.LASF245:
+	.string	"__STDC_IEC_559_COMPLEX__ 1"
+.LASF205:
+	.string	"__GCC_ATOMIC_SHORT_LOCK_FREE 2"
+.LASF189:
+	.string	"__DEC128_MAX__ 9.999999999999999999999999999999999E6144DL"
+.LASF9:
+	.string	"__GNUC_RH_RELEASE__ 4"
+.LASF57:
+	.string	"__UINT_LEAST16_TYPE__ short unsigned int"
+.LASF69:
+	.string	"__UINTPTR_TYPE__ long unsigned int"
+.LASF147:
+	.string	"__DBL_MAX_EXP__ 1024"
+.LASF0:
+	.string	"__STDC__ 1"
+.LASF241:
+	.string	"__ELF__ 1"
+.LASF126:
+	.string	"__FLT_EVAL_METHOD__ 0"
+.LASF84:
+	.string	"__INTMAX_MAX__ 0x7fffffffffffffffL"
+.LASF12:
+	.string	"__ATOMIC_ACQUIRE 2"
+.LASF66:
+	.string	"__UINT_FAST32_TYPE__ long unsigned int"
+.LASF102:
+	.string	"__INT_LEAST32_MAX__ 0x7fffffff"
+.LASF201:
+	.string	"__GCC_ATOMIC_CHAR_LOCK_FREE 2"
+.LASF190:
+	.string	"__DEC128_EPSILON__ 1E-33DL"
+.LASF64:
+	.string	"__UINT_FAST8_TYPE__ unsigned char"
+.LASF61:
+	.string	"__INT_FAST16_TYPE__ long int"
+.LASF172:
+	.string	"__DEC32_MIN_EXP__ (-94)"
+.LASF92:
+	.string	"__INT32_MAX__ 0x7fffffff"
+.LASF158:
+	.string	"__LDBL_DIG__ 18"
+.LASF244:
+	.string	"__STDC_IEC_559__ 1"
+.LASF191:
+	.string	"__DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL"
+.LASF164:
+	.string	"__LDBL_MAX__ 1.18973149535723176502e+4932L"
+.LASF223:
+	.string	"__ATOMIC_HLE_ACQUIRE 65536"
+.LASF232:
+	.string	"__SSE_MATH__ 1"
+.LASF115:
+	.string	"__INT_FAST16_MAX__ 0x7fffffffffffffffL"
+.LASF151:
+	.string	"__DBL_MIN__ ((double)2.22507385850720138309e-308L)"
+.LASF185:
+	.string	"__DEC128_MANT_DIG__ 34"
+.LASF103:
+	.string	"__INT32_C(c) c"
+.LASF179:
+	.string	"__DEC64_MIN_EXP__ (-382)"
+.LASF79:
+	.string	"__WCHAR_MIN__ (-__WCHAR_MAX__ - 1)"
+.LASF197:
+	.string	"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1"
+.LASF161:
+	.string	"__LDBL_MAX_EXP__ 16384"
+.LASF226:
+	.string	"__k8__ 1"
+.LASF42:
+	.string	"__CHAR32_TYPE__ unsigned int"
+.LASF86:
+	.string	"__UINTMAX_MAX__ 0xffffffffffffffffUL"
+.LASF76:
+	.string	"__LONG_MAX__ 0x7fffffffffffffffL"
+.LASF52:
+	.string	"__INT_LEAST8_TYPE__ signed char"
+.LASF109:
+	.string	"__UINT16_C(c) c"
+.LASF74:
+	.string	"__SHRT_MAX__ 0x7fff"
+.LASF23:
+	.string	"__SIZEOF_FLOAT__ 4"
+.LASF199:
+	.string	"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1"
+.LASF78:
+	.string	"__WCHAR_MAX__ 0x7fffffff"
+.LASF166:
+	.string	"__LDBL_EPSILON__ 1.08420217248550443401e-19L"
+.LASF31:
+	.string	"__ORDER_PDP_ENDIAN__ 3412"
+.LASF29:
+	.string	"__ORDER_LITTLE_ENDIAN__ 1234"
+.LASF251:
+	.string	"GNU C11 5.1.1 20150618 (Red Hat 5.1.1-4) -mtune=generic -march=x86-64 -g3 -O0"
+.LASF238:
+	.string	"__unix 1"
+.LASF10:
+	.string	"__ATOMIC_RELAXED 0"
+.LASF80:
+	.string	"__WINT_MAX__ 0xffffffffU"
+.LASF220:
+	.string	"__x86_64__ 1"
+.LASF171:
+	.string	"__DEC32_MANT_DIG__ 7"
+.LASF183:
+	.string	"__DEC64_EPSILON__ 1E-15DD"
+.LASF124:
+	.string	"__GCC_IEC_559 2"
+.LASF120:
+	.string	"__UINT_FAST32_MAX__ 0xffffffffffffffffUL"
+.LASF228:
+	.string	"__MMX__ 1"
+.LASF131:
+	.string	"__FLT_MIN_EXP__ (-125)"
+.LASF72:
+	.string	"__GXX_ABI_VERSION 1008"
+.LASF88:
+	.string	"__SIG_ATOMIC_MAX__ 0x7fffffff"
+.LASF247:
+	.string	"__STDC_NO_THREADS__ 1"
+.LASF65:
+	.string	"__UINT_FAST16_TYPE__ long unsigned int"
+.LASF167:
+	.string	"__LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L"
+.LASF141:
+	.string	"__FLT_HAS_INFINITY__ 1"
+.LASF116:
+	.string	"__INT_FAST32_MAX__ 0x7fffffffffffffffL"
+.LASF44:
+	.string	"__INT8_TYPE__ signed char"
+.LASF87:
+	.string	"__UINTMAX_C(c) c ## UL"
+.LASF2:
+	.string	"__STDC_UTF_16__ 1"
+.LASF39:
+	.string	"__INTMAX_TYPE__ long int"
+.LASF195:
+	.string	"__NO_INLINE__ 1"
+.LASF168:
+	.string	"__LDBL_HAS_DENORM__ 1"
+.LASF70:
+	.string	"__has_include(STR) __has_include__(STR)"
+.LASF202:
+	.string	"__GCC_ATOMIC_CHAR16_T_LOCK_FREE 2"
+.LASF221:
+	.string	"__SIZEOF_FLOAT80__ 16"
+.LASF192:
+	.string	"__REGISTER_PREFIX__ "
+.LASF15:
+	.string	"__ATOMIC_CONSUME 1"
+.LASF97:
+	.string	"__UINT64_MAX__ 0xffffffffffffffffUL"
+.LASF3:
+	.string	"__STDC_UTF_32__ 1"
+.LASF49:
+	.string	"__UINT16_TYPE__ short unsigned int"
+.LASF229:
+	.string	"__SSE__ 1"
+.LASF111:
+	.string	"__UINT32_C(c) c ## U"
+.LASF225:
+	.string	"__k8 1"
+.LASF177:
+	.string	"__DEC32_SUBNORMAL_MIN__ 0.000001E-95DF"
+.LASF249:
+	.string	"frame2"
+.LASF248:
+	.string	"frame3"
+.LASF216:
+	.string	"__SIZEOF_PTRDIFF_T__ 8"
+.LASF27:
+	.string	"__CHAR_BIT__ 8"
+.LASF60:
+	.string	"__INT_FAST8_TYPE__ signed char"
+.LASF89:
+	.string	"__SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)"
+.LASF176:
+	.string	"__DEC32_EPSILON__ 1E-6DF"
+.LASF58:
+	.string	"__UINT_LEAST32_TYPE__ unsigned int"
+.LASF154:
+	.string	"__DBL_HAS_DENORM__ 1"
+.LASF227:
+	.string	"__code_model_small__ 1"
+.LASF157:
+	.string	"__LDBL_MANT_DIG__ 64"
+.LASF207:
+	.string	"__GCC_ATOMIC_LONG_LOCK_FREE 2"
+.LASF242:
+	.string	"__DECIMAL_BID_FORMAT__ 1"
+.LASF90:
+	.string	"__INT8_MAX__ 0x7f"
+.LASF118:
+	.string	"__UINT_FAST8_MAX__ 0xff"
+.LASF132:
+	.string	"__FLT_MIN_10_EXP__ (-37)"
+.LASF209:
+	.string	"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1"
+.LASF37:
+	.string	"__WCHAR_TYPE__ int"
+.LASF16:
+	.string	"__FINITE_MATH_ONLY__ 0"
+.LASF193:
+	.string	"__USER_LABEL_PREFIX__ "
+.LASF41:
+	.string	"__CHAR16_TYPE__ short unsigned int"
+.LASF107:
+	.string	"__UINT8_C(c) c"
+.LASF219:
+	.string	"__x86_64 1"
+.LASF56:
+	.string	"__UINT_LEAST8_TYPE__ unsigned char"
+.LASF47:
+	.string	"__INT64_TYPE__ long int"
+.LASF196:
+	.string	"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1"
+.LASF250:
+	.string	"main"
+.LASF96:
+	.string	"__UINT32_MAX__ 0xffffffffU"
+.LASF211:
+	.string	"__GCC_HAVE_DWARF2_CFI_ASM 1"
+.LASF98:
+	.string	"__INT_LEAST8_MAX__ 0x7f"
+.LASF181:
+	.string	"__DEC64_MIN__ 1E-383DD"
+.LASF146:
+	.string	"__DBL_MIN_10_EXP__ (-307)"
+.LASF139:
+	.string	"__FLT_DENORM_MIN__ 1.40129846432481707092e-45F"
+.LASF194:
+	.string	"__GNUC_STDC_INLINE__ 1"
+	.ident	"GCC: (GNU) 5.1.1 20150618 (Red Hat 5.1.1-4)"
+	.section	.note.GNU-stack,"",@progbits
-- 
2.5.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] gdb: Handle multiple base address in debug_ranges data.
  2015-10-16 12:54 [PATCH] gdb: Handle multiple base address in debug_ranges data Andrew Burgess
@ 2015-10-26  3:49 ` Doug Evans
  2015-10-26 12:55   ` Andrew Burgess
  2015-11-03 10:35 ` [PATCH v2] " Andrew Burgess
  1 sibling, 1 reply; 6+ messages in thread
From: Doug Evans @ 2015-10-26  3:49 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: gdb-patches

Andrew Burgess <andrew.burgess@embecosm.com> writes:
> It is possible to use multiple base addresses within a single address
> range series, within the .debug_ranges section.  The following is a
> simplified example for 32-bit addresses:
>
>   .section ".debug_ranges"
>   .4byte	0xffffffff
>   .4byte        BASE_1
>   .4byte	START_OFFSET_1
>   .4byte	END_OFFSET_1
>   .4byte	START_OFFSET_2
>   .4byte	END_OFFSET_2
>   .4byte	0xffffffff
>   .4byte        BASE_2
>   .4byte	START_OFFSET_3
>   .4byte	END_OFFSET_3
>   .4byte	0
>   .4byte	0
>
> In this example START/END 1 and 2 are relative to BASE_1, while
> START/END 3 are relative to BASE_2.
>
> Currently gdb does not correctly parse this DWARF, resulting in
> corrupted address range information.  This commit fixes this issue, and
> adds a new test to cover this case.
>
> gdb/ChangeLog:
>
> 	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
> 	reading code.
>
> gdb/testsuite/ChangeLog:
>
> 	* gdb.arch/amd64-debug-ranges-base.c: New file.
> 	* gdb.arch/amd64-debug-ranges-base.exp: New file.
> 	* gdb.arch/amd64-debug-ranges-base.s: New file.

Hi.

The code patch is fine with me, nice find.

IWBN to enhance the dwarf assembler (testsuite/lib/dwarf.exp)
to handle .debug_ranges. The more we get away from checking in
generated assembler the better.
Can do?
If not, I'll volunteer to take that on, but I can't promise to
get to it this week. .debug_ranges is pretty simple so I think(!)
this will be easy.

[Though if we go with the generated assembler, take out the 3 in -g3.
I mention this more for completeness sake though, as I'd really like
to see if we can do this with the dwarf assembler first.]

>
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog
> index 8646e6d..d5649d1 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -1,3 +1,8 @@
> +2015-10-15  Andrew Burgess  <andrew.burgess@embecosm.com>
> +
> +	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
> +	reading code.
> +
>  2015-10-15  Yao Qi  <yao.qi@linaro.org>
>  
>  	* aarch64-linux-nat.c (aarch64_linux_insert_hw_breakpoint):
> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> index 0c45d29..e75d5bb 100644
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -11894,7 +11894,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
>    int found_base;
>    unsigned int dummy;
>    const gdb_byte *buffer;
> -  CORE_ADDR marker;
>    int low_set;
>    CORE_ADDR low = 0;
>    CORE_ADDR high = 0;
> @@ -11913,18 +11912,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
>      }
>    buffer = dwarf2_per_objfile->ranges.buffer + offset;
>  
> -  /* Read in the largest possible address.  */
> -  marker = read_address (obfd, buffer, cu, &dummy);
> -  if ((marker & mask) == mask)
> -    {
> -      /* If we found the largest possible address, then
> -	 read the base address.  */
> -      base = read_address (obfd, buffer + addr_size, cu, &dummy);
> -      buffer += 2 * addr_size;
> -      offset += 2 * addr_size;
> -      found_base = 1;
> -    }
> -
>    low_set = 0;
>  
>    baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
> @@ -11949,9 +11936,9 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
>  	 the base address.  Check for a base address here.  */
>        if ((range_beginning & mask) == mask)
>  	{
> -	  /* If we found the largest possible address, then
> -	     read the base address.  */
> -	  base = read_address (obfd, buffer + addr_size, cu, &dummy);
> +	  /* If we found the largest possible address, then we already
> +	     have the base address in range_end.  */
> +	  base = range_end;
>  	  found_base = 1;
>  	  continue;
>  	}
> diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
> index 74aa6ae..1587ac6 100644
> --- a/gdb/testsuite/ChangeLog
> +++ b/gdb/testsuite/ChangeLog
> @@ -1,3 +1,9 @@
> +2015-10-16  Andrew Burgess  <andrew.burgess@embecosm.com>
> +
> +	* gdb.arch/amd64-debug-ranges-base.c: New file.
> +	* gdb.arch/amd64-debug-ranges-base.exp: New file.
> +	* gdb.arch/amd64-debug-ranges-base.s: New file.
> +
>  2015-10-12  Andrew Burgess  <andrew.burgess@embecosm.com>
>  
>  	* gdb.base/dbx.exp (test_func): Remove xfails, update expected
> diff --git a/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.c b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.c
> new file mode 100644
> index 0000000..7d2f7da
> --- /dev/null
> +++ b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.c
> @@ -0,0 +1,34 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2015 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/>.  */
> +
> +int __attribute__ ((section (".text.3")))
> +frame3 (void)
> +{
> +  return 0;
> +}
> +
> +int __attribute__ ((section (".text.2")))
> +frame2 (void)
> +{
> +  return 0;
> +}
> +
> +int __attribute__ ((section (".text.1")))
> +main (void)
> +{
> +  return frame2 ();
> +}
> diff --git a/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.exp b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.exp
> new file mode 100644
> index 0000000..cee494d
> --- /dev/null
> +++ b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.exp
> @@ -0,0 +1,39 @@
> +# Copyright (C) 2015 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/>.
> +
> +standard_testfile .s
> +set opts {}
> +
> +if [info exists COMPILE] {
> +    # make check RUNTESTFLAGS="gdb.arch/amd64-entry-value.exp COMPILE=1"
> +    set srcfile ${testfile}.cc
> +    lappend opts debug optimize=-O2
> +} elseif { ![istarget x86_64-*-* ] || ![is_lp64_target] } {
> +    verbose "Skipping amd64-debug-ranges-base."
> +    return
> +}
> +
> +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} $opts] } {
> +    return -1
> +}
> +
> +if ![runto_main] {
> +    return -1
> +}
> +
> +gdb_test "info line main" "Line \[0-9\]* of .* starts at address .* and ends at .*"
> +gdb_test "info line frame2" "Line \[0-9\]* of .* starts at address .* and ends at .*"
> +gdb_test "info line frame3" "Line \[0-9\]* of .* starts at address .* and ends at .*"
> +
> diff --git a/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.s b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.s
> new file mode 100644
> index 0000000..d672b4d
> --- /dev/null
> +++ b/gdb/testsuite/gdb.arch/amd64-debug-ranges-base.s
> @@ -0,0 +1,1540 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2015 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 file is compiled from gdb.arch/amd64-debug-ranges-base.c
> +   using '-g3 -O0 -S', after which the .debug_ranges sections was
> +   re-written by hand in order to contain the required (valid) DWARF.  */
> +
> +        .file	"amd64-debug-ranges-base.c"
> +	.text
> +.Ltext0:
> +	.section	.text.3,"ax",@progbits
> +	.globl	frame3
> +	.type	frame3, @function
> +frame3:
> +.LFB0:
> +	.file 1 "amd64-debug-ranges-base.c"
> +	.loc 1 20 0
> +	.cfi_startproc
> +	pushq	%rbp
> +	.cfi_def_cfa_offset 16
> +	.cfi_offset 6, -16
> +	movq	%rsp, %rbp
> +	.cfi_def_cfa_register 6
> +	.loc 1 21 0
> +	movl	$0, %eax
> +	.loc 1 22 0
> +	popq	%rbp
> +	.cfi_def_cfa 7, 8
> +	ret
> +	.cfi_endproc
> +.LFE0:
> +	.size	frame3, .-frame3
> +	.section	.text.2,"ax",@progbits
> +	.globl	frame2
> +	.type	frame2, @function
> +frame2:
> +.LFB1:
> +	.loc 1 26 0
> +	.cfi_startproc
> +	pushq	%rbp
> +	.cfi_def_cfa_offset 16
> +	.cfi_offset 6, -16
> +	movq	%rsp, %rbp
> +	.cfi_def_cfa_register 6
> +	.loc 1 27 0
> +	movl	$0, %eax
> +	.loc 1 28 0
> +	popq	%rbp
> +	.cfi_def_cfa 7, 8
> +	ret
> +	.cfi_endproc
> +.LFE1:
> +	.size	frame2, .-frame2
> +	.section	.text.1,"ax",@progbits
> +	.globl	main
> +	.type	main, @function
> +main:
> +.LFB2:
> +	.loc 1 32 0
> +	.cfi_startproc
> +	pushq	%rbp
> +	.cfi_def_cfa_offset 16
> +	.cfi_offset 6, -16
> +	movq	%rsp, %rbp
> +	.cfi_def_cfa_register 6
> +	.loc 1 33 0
> +	call	frame2
> +	.loc 1 34 0
> +	popq	%rbp
> +	.cfi_def_cfa 7, 8
> +	ret
> +	.cfi_endproc
> +.LFE2:
> +	.size	main, .-main
> +	.text
> +.Letext0:
> +	.section	.debug_info,"",@progbits
> +.Ldebug_info0:
> +	.long	0x88
> +	.value	0x4
> +	.long	.Ldebug_abbrev0
> +	.byte	0x8
> +	.uleb128 0x1
> +	.long	.LASF251
> +	.byte	0xc
> +	.long	.LASF252
> +	.long	.LASF253
> +	.long	.Ldebug_ranges0+0
> +	.quad	0
> +	.long	.Ldebug_line0
> +	.long	.Ldebug_macro0
> +	.uleb128 0x2
> +	.long	.LASF248
> +	.byte	0x1
> +	.byte	0x13
> +	.long	0x4a
> +	.quad	.LFB0
> +	.quad	.LFE0-.LFB0
> +	.uleb128 0x1
> +	.byte	0x9c
> +	.uleb128 0x3
> +	.byte	0x4
> +	.byte	0x5
> +	.string	"int"
> +	.uleb128 0x2
> +	.long	.LASF249
> +	.byte	0x1
> +	.byte	0x19
> +	.long	0x4a
> +	.quad	.LFB1
> +	.quad	.LFE1-.LFB1
> +	.uleb128 0x1
> +	.byte	0x9c
> +	.uleb128 0x4
> +	.long	.LASF250
> +	.byte	0x1
> +	.byte	0x1f
> +	.long	0x4a
> +	.quad	.LFB2
> +	.quad	.LFE2-.LFB2
> +	.uleb128 0x1
> +	.byte	0x9c
> +	.byte	0
> +	.section	.debug_abbrev,"",@progbits
> +.Ldebug_abbrev0:
> +	.uleb128 0x1
> +	.uleb128 0x11
> +	.byte	0x1
> +	.uleb128 0x25
> +	.uleb128 0xe
> +	.uleb128 0x13
> +	.uleb128 0xb
> +	.uleb128 0x3
> +	.uleb128 0xe
> +	.uleb128 0x1b
> +	.uleb128 0xe
> +	.uleb128 0x55
> +	.uleb128 0x17
> +	.uleb128 0x11
> +	.uleb128 0x1
> +	.uleb128 0x10
> +	.uleb128 0x17
> +	.uleb128 0x2119
> +	.uleb128 0x17
> +	.byte	0
> +	.byte	0
> +	.uleb128 0x2
> +	.uleb128 0x2e
> +	.byte	0
> +	.uleb128 0x3f
> +	.uleb128 0x19
> +	.uleb128 0x3
> +	.uleb128 0xe
> +	.uleb128 0x3a
> +	.uleb128 0xb
> +	.uleb128 0x3b
> +	.uleb128 0xb
> +	.uleb128 0x27
> +	.uleb128 0x19
> +	.uleb128 0x49
> +	.uleb128 0x13
> +	.uleb128 0x11
> +	.uleb128 0x1
> +	.uleb128 0x12
> +	.uleb128 0x7
> +	.uleb128 0x40
> +	.uleb128 0x18
> +	.uleb128 0x2117
> +	.uleb128 0x19
> +	.byte	0
> +	.byte	0
> +	.uleb128 0x3
> +	.uleb128 0x24
> +	.byte	0
> +	.uleb128 0xb
> +	.uleb128 0xb
> +	.uleb128 0x3e
> +	.uleb128 0xb
> +	.uleb128 0x3
> +	.uleb128 0x8
> +	.byte	0
> +	.byte	0
> +	.uleb128 0x4
> +	.uleb128 0x2e
> +	.byte	0
> +	.uleb128 0x3f
> +	.uleb128 0x19
> +	.uleb128 0x3
> +	.uleb128 0xe
> +	.uleb128 0x3a
> +	.uleb128 0xb
> +	.uleb128 0x3b
> +	.uleb128 0xb
> +	.uleb128 0x27
> +	.uleb128 0x19
> +	.uleb128 0x49
> +	.uleb128 0x13
> +	.uleb128 0x11
> +	.uleb128 0x1
> +	.uleb128 0x12
> +	.uleb128 0x7
> +	.uleb128 0x40
> +	.uleb128 0x18
> +	.uleb128 0x2116
> +	.uleb128 0x19
> +	.byte	0
> +	.byte	0
> +	.byte	0
> +	.section	.debug_aranges,"",@progbits
> +	.long	0x4c
> +	.value	0x2
> +	.long	.Ldebug_info0
> +	.byte	0x8
> +	.byte	0
> +	.value	0
> +	.value	0
> +	.quad	.LFB0
> +	.quad	.LFE0-.LFB0
> +	.quad	.LFB1
> +	.quad	.LFE1-.LFB1
> +	.quad	.LFB2
> +	.quad	.LFE2-.LFB2
> +	.quad	0
> +	.quad	0
> +	.section	.debug_ranges,"",@progbits
> +.Ldebug_ranges0:
> +	.quad	0xffffffffffffffff
> +	.quad	.LFB0
> +	.quad	0
> +	.quad	.LFE0 - .LFB0
> +	.quad	0xffffffffffffffff
> +	.quad	.LFB1
> +	.quad	0
> +	.quad	.LFE1 - .LFB1
> +	.quad	0xffffffffffffffff
> +	.quad	.LFB2
> +	.quad	0
> +	.quad	.LFE2 - .LFB2
> +	.quad	0
> +	.quad	0
> +	.section	.debug_macro,"",@progbits
> +.Ldebug_macro0:
> +	.value	0x4
> +	.byte	0x2
> +	.long	.Ldebug_line0
> +	.byte	0x7
> +	.long	.Ldebug_macro1
> +	.byte	0x3
> +	.uleb128 0
> +	.uleb128 0x1
> +	.file 2 "/usr/include/stdc-predef.h"
> +	.byte	0x3
> +	.uleb128 0
> +	.uleb128 0x2
> +	.byte	0x7
> +	.long	.Ldebug_macro2
> +	.byte	0x4
> +	.byte	0x4
> +	.byte	0
> +	.section	.debug_macro,"G",@progbits,wm4.0.9fc6967513006a990da6a9952cf266ea,comdat
> +.Ldebug_macro1:
> +	.value	0x4
> +	.byte	0
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF0
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF1
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF2
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF3
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF4
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF5
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF6
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF7
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF8
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF9
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF10
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF11
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF12
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF13
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF14
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF15
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF16
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF17
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF18
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF19
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF20
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF21
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF22
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF23
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF24
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF25
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF26
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF27
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF28
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF29
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF30
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF31
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF32
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF33
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF34
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF35
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF36
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF37
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF38
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF39
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF40
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF41
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF42
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF43
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF44
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF45
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF46
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF47
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF48
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF49
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF50
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF51
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF52
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF53
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF54
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF55
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF56
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF57
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF58
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF59
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF60
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF61
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF62
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF63
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF64
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF65
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF66
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF67
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF68
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF69
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF70
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF71
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF72
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF73
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF74
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF75
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF76
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF77
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF78
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF79
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF80
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF81
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF82
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF83
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF84
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF85
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF86
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF87
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF88
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF89
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF90
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF91
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF92
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF93
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF94
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF95
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF96
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF97
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF98
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF99
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF100
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF101
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF102
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF103
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF104
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF105
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF106
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF107
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF108
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF109
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF110
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF111
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF112
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF113
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF114
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF115
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF116
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF117
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF118
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF119
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF120
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF121
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF122
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF123
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF124
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF125
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF126
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF127
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF128
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF129
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF130
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF131
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF132
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF133
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF134
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF135
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF136
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF137
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF138
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF139
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF140
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF141
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF142
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF143
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF144
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF145
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF146
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF147
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF148
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF149
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF150
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF151
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF152
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF153
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF154
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF155
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF156
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF157
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF158
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF159
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF160
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF161
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF162
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF163
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF164
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF165
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF166
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF167
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF168
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF169
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF170
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF171
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF172
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF173
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF174
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF175
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF176
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF177
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF178
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF179
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF180
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF181
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF182
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF183
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF184
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF185
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF186
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF187
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF188
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF189
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF190
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF191
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF192
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF193
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF194
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF195
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF196
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF197
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF198
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF199
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF200
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF201
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF202
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF203
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF204
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF205
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF206
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF207
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF208
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF209
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF210
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF211
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF212
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF213
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF214
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF215
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF216
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF217
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF218
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF219
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF220
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF221
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF222
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF223
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF224
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF225
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF226
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF227
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF228
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF229
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF230
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF231
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF232
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF233
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF234
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF235
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF236
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF237
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF238
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF239
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF240
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF241
> +	.byte	0x5
> +	.uleb128 0
> +	.long	.LASF242
> +	.byte	0
> +	.section	.debug_macro,"G",@progbits,wm4.stdcpredef.h.19.52894a18705f0664f8da17e99c6c0a93,comdat
> +.Ldebug_macro2:
> +	.value	0x4
> +	.byte	0
> +	.byte	0x5
> +	.uleb128 0x13
> +	.long	.LASF243
> +	.byte	0x5
> +	.uleb128 0x26
> +	.long	.LASF244
> +	.byte	0x5
> +	.uleb128 0x2e
> +	.long	.LASF245
> +	.byte	0x5
> +	.uleb128 0x3b
> +	.long	.LASF246
> +	.byte	0x5
> +	.uleb128 0x3e
> +	.long	.LASF247
> +	.byte	0
> +	.section	.debug_line,"",@progbits
> +.Ldebug_line0:
> +	.section	.debug_str,"MS",@progbits,1
> +.LASF106:
> +	.string	"__UINT_LEAST8_MAX__ 0xff"
> +.LASF153:
> +	.string	"__DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)"
> +.LASF218:
> +	.string	"__amd64__ 1"
> +.LASF235:
> +	.string	"__linux 1"
> +.LASF110:
> +	.string	"__UINT_LEAST32_MAX__ 0xffffffffU"
> +.LASF26:
> +	.string	"__SIZEOF_SIZE_T__ 8"
> +.LASF8:
> +	.string	"__VERSION__ \"5.1.1 20150618 (Red Hat 5.1.1-4)\""
> +.LASF1:
> +	.string	"__STDC_VERSION__ 201112L"
> +.LASF34:
> +	.string	"__SIZEOF_POINTER__ 8"
> +.LASF252:
> +	.string	"amd64-debug-ranges-base.c"
> +.LASF178:
> +	.string	"__DEC64_MANT_DIG__ 16"
> +.LASF128:
> +	.string	"__FLT_RADIX__ 2"
> +.LASF165:
> +	.string	"__LDBL_MIN__ 3.36210314311209350626e-4932L"
> +.LASF239:
> +	.string	"__unix__ 1"
> +.LASF133:
> +	.string	"__FLT_MAX_EXP__ 128"
> +.LASF162:
> +	.string	"__LDBL_MAX_10_EXP__ 4932"
> +.LASF215:
> +	.string	"__SIZEOF_WINT_T__ 4"
> +.LASF148:
> +	.string	"__DBL_MAX_10_EXP__ 308"
> +.LASF121:
> +	.string	"__UINT_FAST64_MAX__ 0xffffffffffffffffUL"
> +.LASF217:
> +	.string	"__amd64 1"
> +.LASF38:
> +	.string	"__WINT_TYPE__ unsigned int"
> +.LASF113:
> +	.string	"__UINT64_C(c) c ## UL"
> +.LASF155:
> +	.string	"__DBL_HAS_INFINITY__ 1"
> +.LASF233:
> +	.string	"__SSE2_MATH__ 1"
> +.LASF7:
> +	.string	"__GNUC_PATCHLEVEL__ 1"
> +.LASF236:
> +	.string	"__linux__ 1"
> +.LASF4:
> +	.string	"__STDC_HOSTED__ 1"
> +.LASF81:
> +	.string	"__WINT_MIN__ 0U"
> +.LASF222:
> +	.string	"__SIZEOF_FLOAT128__ 16"
> +.LASF246:
> +	.string	"__STDC_ISO_10646__ 201304L"
> +.LASF50:
> +	.string	"__UINT32_TYPE__ unsigned int"
> +.LASF231:
> +	.string	"__FXSR__ 1"
> +.LASF184:
> +	.string	"__DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD"
> +.LASF136:
> +	.string	"__FLT_MAX__ 3.40282346638528859812e+38F"
> +.LASF253:
> +	.string	"/path/to/binutils-gdb/src/gdb/testsuite/gdb.arch"
> +.LASF237:
> +	.string	"linux 1"
> +.LASF114:
> +	.string	"__INT_FAST8_MAX__ 0x7f"
> +.LASF156:
> +	.string	"__DBL_HAS_QUIET_NAN__ 1"
> +.LASF143:
> +	.string	"__DBL_MANT_DIG__ 53"
> +.LASF48:
> +	.string	"__UINT8_TYPE__ unsigned char"
> +.LASF173:
> +	.string	"__DEC32_MAX_EXP__ 97"
> +.LASF46:
> +	.string	"__INT32_TYPE__ int"
> +.LASF43:
> +	.string	"__SIG_ATOMIC_TYPE__ int"
> +.LASF145:
> +	.string	"__DBL_MIN_EXP__ (-1021)"
> +.LASF169:
> +	.string	"__LDBL_HAS_INFINITY__ 1"
> +.LASF20:
> +	.string	"__SIZEOF_LONG__ 8"
> +.LASF140:
> +	.string	"__FLT_HAS_DENORM__ 1"
> +.LASF95:
> +	.string	"__UINT16_MAX__ 0xffff"
> +.LASF204:
> +	.string	"__GCC_ATOMIC_WCHAR_T_LOCK_FREE 2"
> +.LASF67:
> +	.string	"__UINT_FAST64_TYPE__ long unsigned int"
> +.LASF123:
> +	.string	"__UINTPTR_MAX__ 0xffffffffffffffffUL"
> +.LASF33:
> +	.string	"__FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__"
> +.LASF108:
> +	.string	"__UINT_LEAST16_MAX__ 0xffff"
> +.LASF212:
> +	.string	"__PRAGMA_REDEFINE_EXTNAME 1"
> +.LASF53:
> +	.string	"__INT_LEAST16_TYPE__ short int"
> +.LASF18:
> +	.string	"__LP64__ 1"
> +.LASF163:
> +	.string	"__DECIMAL_DIG__ 21"
> +.LASF71:
> +	.string	"__has_include_next(STR) __has_include_next__(STR)"
> +.LASF122:
> +	.string	"__INTPTR_MAX__ 0x7fffffffffffffffL"
> +.LASF234:
> +	.string	"__gnu_linux__ 1"
> +.LASF150:
> +	.string	"__DBL_MAX__ ((double)1.79769313486231570815e+308L)"
> +.LASF45:
> +	.string	"__INT16_TYPE__ short int"
> +.LASF170:
> +	.string	"__LDBL_HAS_QUIET_NAN__ 1"
> +.LASF24:
> +	.string	"__SIZEOF_DOUBLE__ 8"
> +.LASF94:
> +	.string	"__UINT8_MAX__ 0xff"
> +.LASF17:
> +	.string	"_LP64 1"
> +.LASF51:
> +	.string	"__UINT64_TYPE__ long unsigned int"
> +.LASF54:
> +	.string	"__INT_LEAST32_TYPE__ int"
> +.LASF93:
> +	.string	"__INT64_MAX__ 0x7fffffffffffffffL"
> +.LASF224:
> +	.string	"__ATOMIC_HLE_RELEASE 131072"
> +.LASF230:
> +	.string	"__SSE2__ 1"
> +.LASF85:
> +	.string	"__INTMAX_C(c) c ## L"
> +.LASF203:
> +	.string	"__GCC_ATOMIC_CHAR32_T_LOCK_FREE 2"
> +.LASF213:
> +	.string	"__SIZEOF_INT128__ 16"
> +.LASF36:
> +	.string	"__PTRDIFF_TYPE__ long int"
> +.LASF174:
> +	.string	"__DEC32_MIN__ 1E-95DF"
> +.LASF99:
> +	.string	"__INT8_C(c) c"
> +.LASF21:
> +	.string	"__SIZEOF_LONG_LONG__ 8"
> +.LASF130:
> +	.string	"__FLT_DIG__ 6"
> +.LASF214:
> +	.string	"__SIZEOF_WCHAR_T__ 4"
> +.LASF105:
> +	.string	"__INT64_C(c) c ## L"
> +.LASF119:
> +	.string	"__UINT_FAST16_MAX__ 0xffffffffffffffffUL"
> +.LASF134:
> +	.string	"__FLT_MAX_10_EXP__ 38"
> +.LASF137:
> +	.string	"__FLT_MIN__ 1.17549435082228750797e-38F"
> +.LASF59:
> +	.string	"__UINT_LEAST64_TYPE__ long unsigned int"
> +.LASF25:
> +	.string	"__SIZEOF_LONG_DOUBLE__ 16"
> +.LASF73:
> +	.string	"__SCHAR_MAX__ 0x7f"
> +.LASF6:
> +	.string	"__GNUC_MINOR__ 1"
> +.LASF55:
> +	.string	"__INT_LEAST64_TYPE__ long int"
> +.LASF127:
> +	.string	"__DEC_EVAL_METHOD__ 2"
> +.LASF175:
> +	.string	"__DEC32_MAX__ 9.999999E96DF"
> +.LASF77:
> +	.string	"__LONG_LONG_MAX__ 0x7fffffffffffffffLL"
> +.LASF200:
> +	.string	"__GCC_ATOMIC_BOOL_LOCK_FREE 2"
> +.LASF35:
> +	.string	"__SIZE_TYPE__ long unsigned int"
> +.LASF159:
> +	.string	"__LDBL_MIN_EXP__ (-16381)"
> +.LASF125:
> +	.string	"__GCC_IEC_559_COMPLEX 2"
> +.LASF142:
> +	.string	"__FLT_HAS_QUIET_NAN__ 1"
> +.LASF152:
> +	.string	"__DBL_EPSILON__ ((double)2.22044604925031308085e-16L)"
> +.LASF32:
> +	.string	"__BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__"
> +.LASF100:
> +	.string	"__INT_LEAST16_MAX__ 0x7fff"
> +.LASF83:
> +	.string	"__SIZE_MAX__ 0xffffffffffffffffUL"
> +.LASF112:
> +	.string	"__UINT_LEAST64_MAX__ 0xffffffffffffffffUL"
> +.LASF117:
> +	.string	"__INT_FAST64_MAX__ 0x7fffffffffffffffL"
> +.LASF30:
> +	.string	"__ORDER_BIG_ENDIAN__ 4321"
> +.LASF68:
> +	.string	"__INTPTR_TYPE__ long int"
> +.LASF160:
> +	.string	"__LDBL_MIN_10_EXP__ (-4931)"
> +.LASF210:
> +	.string	"__GCC_ATOMIC_POINTER_LOCK_FREE 2"
> +.LASF22:
> +	.string	"__SIZEOF_SHORT__ 2"
> +.LASF243:
> +	.string	"_STDC_PREDEF_H 1"
> +.LASF101:
> +	.string	"__INT16_C(c) c"
> +.LASF240:
> +	.string	"unix 1"
> +.LASF63:
> +	.string	"__INT_FAST64_TYPE__ long int"
> +.LASF182:
> +	.string	"__DEC64_MAX__ 9.999999999999999E384DD"
> +.LASF82:
> +	.string	"__PTRDIFF_MAX__ 0x7fffffffffffffffL"
> +.LASF138:
> +	.string	"__FLT_EPSILON__ 1.19209289550781250000e-7F"
> +.LASF75:
> +	.string	"__INT_MAX__ 0x7fffffff"
> +.LASF208:
> +	.string	"__GCC_ATOMIC_LLONG_LOCK_FREE 2"
> +.LASF104:
> +	.string	"__INT_LEAST64_MAX__ 0x7fffffffffffffffL"
> +.LASF186:
> +	.string	"__DEC128_MIN_EXP__ (-6142)"
> +.LASF13:
> +	.string	"__ATOMIC_RELEASE 3"
> +.LASF149:
> +	.string	"__DBL_DECIMAL_DIG__ 17"
> +.LASF144:
> +	.string	"__DBL_DIG__ 15"
> +.LASF135:
> +	.string	"__FLT_DECIMAL_DIG__ 9"
> +.LASF11:
> +	.string	"__ATOMIC_SEQ_CST 5"
> +.LASF188:
> +	.string	"__DEC128_MIN__ 1E-6143DL"
> +.LASF28:
> +	.string	"__BIGGEST_ALIGNMENT__ 16"
> +.LASF19:
> +	.string	"__SIZEOF_INT__ 4"
> +.LASF62:
> +	.string	"__INT_FAST32_TYPE__ long int"
> +.LASF206:
> +	.string	"__GCC_ATOMIC_INT_LOCK_FREE 2"
> +.LASF187:
> +	.string	"__DEC128_MAX_EXP__ 6145"
> +.LASF91:
> +	.string	"__INT16_MAX__ 0x7fff"
> +.LASF198:
> +	.string	"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1"
> +.LASF180:
> +	.string	"__DEC64_MAX_EXP__ 385"
> +.LASF14:
> +	.string	"__ATOMIC_ACQ_REL 4"
> +.LASF129:
> +	.string	"__FLT_MANT_DIG__ 24"
> +.LASF5:
> +	.string	"__GNUC__ 5"
> +.LASF40:
> +	.string	"__UINTMAX_TYPE__ long unsigned int"
> +.LASF245:
> +	.string	"__STDC_IEC_559_COMPLEX__ 1"
> +.LASF205:
> +	.string	"__GCC_ATOMIC_SHORT_LOCK_FREE 2"
> +.LASF189:
> +	.string	"__DEC128_MAX__ 9.999999999999999999999999999999999E6144DL"
> +.LASF9:
> +	.string	"__GNUC_RH_RELEASE__ 4"
> +.LASF57:
> +	.string	"__UINT_LEAST16_TYPE__ short unsigned int"
> +.LASF69:
> +	.string	"__UINTPTR_TYPE__ long unsigned int"
> +.LASF147:
> +	.string	"__DBL_MAX_EXP__ 1024"
> +.LASF0:
> +	.string	"__STDC__ 1"
> +.LASF241:
> +	.string	"__ELF__ 1"
> +.LASF126:
> +	.string	"__FLT_EVAL_METHOD__ 0"
> +.LASF84:
> +	.string	"__INTMAX_MAX__ 0x7fffffffffffffffL"
> +.LASF12:
> +	.string	"__ATOMIC_ACQUIRE 2"
> +.LASF66:
> +	.string	"__UINT_FAST32_TYPE__ long unsigned int"
> +.LASF102:
> +	.string	"__INT_LEAST32_MAX__ 0x7fffffff"
> +.LASF201:
> +	.string	"__GCC_ATOMIC_CHAR_LOCK_FREE 2"
> +.LASF190:
> +	.string	"__DEC128_EPSILON__ 1E-33DL"
> +.LASF64:
> +	.string	"__UINT_FAST8_TYPE__ unsigned char"
> +.LASF61:
> +	.string	"__INT_FAST16_TYPE__ long int"
> +.LASF172:
> +	.string	"__DEC32_MIN_EXP__ (-94)"
> +.LASF92:
> +	.string	"__INT32_MAX__ 0x7fffffff"
> +.LASF158:
> +	.string	"__LDBL_DIG__ 18"
> +.LASF244:
> +	.string	"__STDC_IEC_559__ 1"
> +.LASF191:
> +	.string	"__DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL"
> +.LASF164:
> +	.string	"__LDBL_MAX__ 1.18973149535723176502e+4932L"
> +.LASF223:
> +	.string	"__ATOMIC_HLE_ACQUIRE 65536"
> +.LASF232:
> +	.string	"__SSE_MATH__ 1"
> +.LASF115:
> +	.string	"__INT_FAST16_MAX__ 0x7fffffffffffffffL"
> +.LASF151:
> +	.string	"__DBL_MIN__ ((double)2.22507385850720138309e-308L)"
> +.LASF185:
> +	.string	"__DEC128_MANT_DIG__ 34"
> +.LASF103:
> +	.string	"__INT32_C(c) c"
> +.LASF179:
> +	.string	"__DEC64_MIN_EXP__ (-382)"
> +.LASF79:
> +	.string	"__WCHAR_MIN__ (-__WCHAR_MAX__ - 1)"
> +.LASF197:
> +	.string	"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1"
> +.LASF161:
> +	.string	"__LDBL_MAX_EXP__ 16384"
> +.LASF226:
> +	.string	"__k8__ 1"
> +.LASF42:
> +	.string	"__CHAR32_TYPE__ unsigned int"
> +.LASF86:
> +	.string	"__UINTMAX_MAX__ 0xffffffffffffffffUL"
> +.LASF76:
> +	.string	"__LONG_MAX__ 0x7fffffffffffffffL"
> +.LASF52:
> +	.string	"__INT_LEAST8_TYPE__ signed char"
> +.LASF109:
> +	.string	"__UINT16_C(c) c"
> +.LASF74:
> +	.string	"__SHRT_MAX__ 0x7fff"
> +.LASF23:
> +	.string	"__SIZEOF_FLOAT__ 4"
> +.LASF199:
> +	.string	"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1"
> +.LASF78:
> +	.string	"__WCHAR_MAX__ 0x7fffffff"
> +.LASF166:
> +	.string	"__LDBL_EPSILON__ 1.08420217248550443401e-19L"
> +.LASF31:
> +	.string	"__ORDER_PDP_ENDIAN__ 3412"
> +.LASF29:
> +	.string	"__ORDER_LITTLE_ENDIAN__ 1234"
> +.LASF251:
> +	.string	"GNU C11 5.1.1 20150618 (Red Hat 5.1.1-4) -mtune=generic -march=x86-64 -g3 -O0"
> +.LASF238:
> +	.string	"__unix 1"
> +.LASF10:
> +	.string	"__ATOMIC_RELAXED 0"
> +.LASF80:
> +	.string	"__WINT_MAX__ 0xffffffffU"
> +.LASF220:
> +	.string	"__x86_64__ 1"
> +.LASF171:
> +	.string	"__DEC32_MANT_DIG__ 7"
> +.LASF183:
> +	.string	"__DEC64_EPSILON__ 1E-15DD"
> +.LASF124:
> +	.string	"__GCC_IEC_559 2"
> +.LASF120:
> +	.string	"__UINT_FAST32_MAX__ 0xffffffffffffffffUL"
> +.LASF228:
> +	.string	"__MMX__ 1"
> +.LASF131:
> +	.string	"__FLT_MIN_EXP__ (-125)"
> +.LASF72:
> +	.string	"__GXX_ABI_VERSION 1008"
> +.LASF88:
> +	.string	"__SIG_ATOMIC_MAX__ 0x7fffffff"
> +.LASF247:
> +	.string	"__STDC_NO_THREADS__ 1"
> +.LASF65:
> +	.string	"__UINT_FAST16_TYPE__ long unsigned int"
> +.LASF167:
> +	.string	"__LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L"
> +.LASF141:
> +	.string	"__FLT_HAS_INFINITY__ 1"
> +.LASF116:
> +	.string	"__INT_FAST32_MAX__ 0x7fffffffffffffffL"
> +.LASF44:
> +	.string	"__INT8_TYPE__ signed char"
> +.LASF87:
> +	.string	"__UINTMAX_C(c) c ## UL"
> +.LASF2:
> +	.string	"__STDC_UTF_16__ 1"
> +.LASF39:
> +	.string	"__INTMAX_TYPE__ long int"
> +.LASF195:
> +	.string	"__NO_INLINE__ 1"
> +.LASF168:
> +	.string	"__LDBL_HAS_DENORM__ 1"
> +.LASF70:
> +	.string	"__has_include(STR) __has_include__(STR)"
> +.LASF202:
> +	.string	"__GCC_ATOMIC_CHAR16_T_LOCK_FREE 2"
> +.LASF221:
> +	.string	"__SIZEOF_FLOAT80__ 16"
> +.LASF192:
> +	.string	"__REGISTER_PREFIX__ "
> +.LASF15:
> +	.string	"__ATOMIC_CONSUME 1"
> +.LASF97:
> +	.string	"__UINT64_MAX__ 0xffffffffffffffffUL"
> +.LASF3:
> +	.string	"__STDC_UTF_32__ 1"
> +.LASF49:
> +	.string	"__UINT16_TYPE__ short unsigned int"
> +.LASF229:
> +	.string	"__SSE__ 1"
> +.LASF111:
> +	.string	"__UINT32_C(c) c ## U"
> +.LASF225:
> +	.string	"__k8 1"
> +.LASF177:
> +	.string	"__DEC32_SUBNORMAL_MIN__ 0.000001E-95DF"
> +.LASF249:
> +	.string	"frame2"
> +.LASF248:
> +	.string	"frame3"
> +.LASF216:
> +	.string	"__SIZEOF_PTRDIFF_T__ 8"
> +.LASF27:
> +	.string	"__CHAR_BIT__ 8"
> +.LASF60:
> +	.string	"__INT_FAST8_TYPE__ signed char"
> +.LASF89:
> +	.string	"__SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)"
> +.LASF176:
> +	.string	"__DEC32_EPSILON__ 1E-6DF"
> +.LASF58:
> +	.string	"__UINT_LEAST32_TYPE__ unsigned int"
> +.LASF154:
> +	.string	"__DBL_HAS_DENORM__ 1"
> +.LASF227:
> +	.string	"__code_model_small__ 1"
> +.LASF157:
> +	.string	"__LDBL_MANT_DIG__ 64"
> +.LASF207:
> +	.string	"__GCC_ATOMIC_LONG_LOCK_FREE 2"
> +.LASF242:
> +	.string	"__DECIMAL_BID_FORMAT__ 1"
> +.LASF90:
> +	.string	"__INT8_MAX__ 0x7f"
> +.LASF118:
> +	.string	"__UINT_FAST8_MAX__ 0xff"
> +.LASF132:
> +	.string	"__FLT_MIN_10_EXP__ (-37)"
> +.LASF209:
> +	.string	"__GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1"
> +.LASF37:
> +	.string	"__WCHAR_TYPE__ int"
> +.LASF16:
> +	.string	"__FINITE_MATH_ONLY__ 0"
> +.LASF193:
> +	.string	"__USER_LABEL_PREFIX__ "
> +.LASF41:
> +	.string	"__CHAR16_TYPE__ short unsigned int"
> +.LASF107:
> +	.string	"__UINT8_C(c) c"
> +.LASF219:
> +	.string	"__x86_64 1"
> +.LASF56:
> +	.string	"__UINT_LEAST8_TYPE__ unsigned char"
> +.LASF47:
> +	.string	"__INT64_TYPE__ long int"
> +.LASF196:
> +	.string	"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1"
> +.LASF250:
> +	.string	"main"
> +.LASF96:
> +	.string	"__UINT32_MAX__ 0xffffffffU"
> +.LASF211:
> +	.string	"__GCC_HAVE_DWARF2_CFI_ASM 1"
> +.LASF98:
> +	.string	"__INT_LEAST8_MAX__ 0x7f"
> +.LASF181:
> +	.string	"__DEC64_MIN__ 1E-383DD"
> +.LASF146:
> +	.string	"__DBL_MIN_10_EXP__ (-307)"
> +.LASF139:
> +	.string	"__FLT_DENORM_MIN__ 1.40129846432481707092e-45F"
> +.LASF194:
> +	.string	"__GNUC_STDC_INLINE__ 1"
> +	.ident	"GCC: (GNU) 5.1.1 20150618 (Red Hat 5.1.1-4)"
> +	.section	.note.GNU-stack,"",@progbits

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] gdb: Handle multiple base address in debug_ranges data.
  2015-10-26  3:49 ` Doug Evans
@ 2015-10-26 12:55   ` Andrew Burgess
  0 siblings, 0 replies; 6+ messages in thread
From: Andrew Burgess @ 2015-10-26 12:55 UTC (permalink / raw)
  To: Doug Evans; +Cc: gdb-patches

* Doug Evans <xdje42@gmail.com> [2015-10-26 01:57:08 +0000]:

> Andrew Burgess <andrew.burgess@embecosm.com> writes:
> > It is possible to use multiple base addresses within a single address
> > range series, within the .debug_ranges section.  The following is a
> > simplified example for 32-bit addresses:
> >
> >   .section ".debug_ranges"
> >   .4byte	0xffffffff
> >   .4byte        BASE_1
> >   .4byte	START_OFFSET_1
> >   .4byte	END_OFFSET_1
> >   .4byte	START_OFFSET_2
> >   .4byte	END_OFFSET_2
> >   .4byte	0xffffffff
> >   .4byte        BASE_2
> >   .4byte	START_OFFSET_3
> >   .4byte	END_OFFSET_3
> >   .4byte	0
> >   .4byte	0
> >
> > In this example START/END 1 and 2 are relative to BASE_1, while
> > START/END 3 are relative to BASE_2.
> >
> > Currently gdb does not correctly parse this DWARF, resulting in
> > corrupted address range information.  This commit fixes this issue, and
> > adds a new test to cover this case.
> >
> > gdb/ChangeLog:
> >
> > 	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
> > 	reading code.
> >
> > gdb/testsuite/ChangeLog:
> >
> > 	* gdb.arch/amd64-debug-ranges-base.c: New file.
> > 	* gdb.arch/amd64-debug-ranges-base.exp: New file.
> > 	* gdb.arch/amd64-debug-ranges-base.s: New file.
> 
> Hi.
> 
> The code patch is fine with me, nice find.
> 
> IWBN to enhance the dwarf assembler (testsuite/lib/dwarf.exp)
> to handle .debug_ranges. The more we get away from checking in
> generated assembler the better.
> Can do?
> If not, I'll volunteer to take that on, but I can't promise to
> get to it this week. .debug_ranges is pretty simple so I think(!)
> this will be easy.

This was absolutely my first thought too, and I even stated working on
exactly this feature.

I got the .debug_ranges table generation to a reasonable state, but
then I needed more features from the .debug_line table generator, but
I ran out of time....

Anyway, you can find the initial work I did here:
  https://github.com/T-J-Teru/binutils-gdb/commits/gdb-dwarf-ranges

that branch doesn't contain the fix, just the initial work on writing
a test to expose the bug.  Feel free to take any code out of that
branch if it is useful to you.

> [Though if we go with the generated assembler, take out the 3 in -g3.
> I mention this more for completeness sake though, as I'd really like
> to see if we can do this with the dwarf assembler first.]

I'd rather not push the fix without a test, and I don't think you're
approving the current test, so...

I'll hopefully get more time to work on this next month, if I don't
get approval for the current patch before then I'll return to working
on the dwarf assembler style testing.

Thanks for the review,
Andrew

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] gdb: Handle multiple base address in debug_ranges data.
  2015-10-16 12:54 [PATCH] gdb: Handle multiple base address in debug_ranges data Andrew Burgess
  2015-10-26  3:49 ` Doug Evans
@ 2015-11-03 10:35 ` Andrew Burgess
  2015-11-25 10:54   ` PING: " Andrew Burgess
  2015-12-09 12:42   ` Pedro Alves
  1 sibling, 2 replies; 6+ messages in thread
From: Andrew Burgess @ 2015-11-03 10:35 UTC (permalink / raw)
  To: gdb-patches; +Cc: Doug Evans

Below is a second attempt at fixing the multiple base address bug in
the gdb DWARF parsing code.

The actual fix is identical to the first patch, the big change here is
in the testing.

Gone is the x86-64 assembler example, and instead I have tried[1] to
extend the dwarf assembler to generate sufficient information to
trigger this bug, this required extensions to the .debug_line
generation, and new code to handle .debug_ranges generation.

I've tested this new tests on x86-64 Linux compiling as a 64-bit
target, and when passing '-m32' to the test to compile as a 32-bit
target.

My TCL skills are pretty weak[2] so constructive guidance on how to
improve this code would be great, alternatively if someone (anyone)
would like to show me how easy this is, please do improve on this
patch.

Alternatively, how do you feel about letting this in ... for now.

Thanks,
Andrew


[1] Really, I tried.  No matter how bad the TCL code might look,
    please don't think I've not tried :)

[2] As evidence I present .... this patch :)

---

It is possible to use multiple base addresses within a single address
range series, within the .debug_ranges section.  The following is a
simplified example for 32-bit addresses:

  .section ".debug_ranges"
  .4byte	0xffffffff
  .4byte	BASE_1
  .4byte	START_OFFSET_1
  .4byte	END_OFFSET_1
  .4byte	START_OFFSET_2
  .4byte	END_OFFSET_2
  .4byte	0xffffffff
  .4byte	BASE_2
  .4byte	START_OFFSET_3
  .4byte	END_OFFSET_3
  .4byte	0
  .4byte	0

In this example START/END 1 and 2 are relative to BASE_1, while
START/END 3 are relative to BASE_2.

Currently gdb does not correctly parse this DWARF, resulting in
corrupted address range information.  This commit fixes this issue, and
adds a new test to cover this case.

In order to support testing of this feature extensions were made to the
testsuite dwarf assembler, additional functionality was added to the
.debug_line generation function, and a new function for generating the
.debug_ranges section was added.

gdb/ChangeLog:

	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
	reading code.

gdb/testsuite/ChangeLog:

	* gdb.dwarf2/dw2-ranges-base.c: New file.
	* gdb.dwarf2/dw2-ranges-base.exp: New file.
	* lib/dwarf.exp (namespace eval Dwarf): Add new variables to
	support additional line table, and debug ranges generation.
	(Dwarf::ranges): New function, generate .debug_ranges.
	(Dwarf::lines): Support generating simple line table programs.
	(Dwarf::assemble): Initialise new namespace variables.
---
 gdb/ChangeLog                                |   5 +
 gdb/dwarf2read.c                             |  19 +--
 gdb/testsuite/ChangeLog                      |  10 ++
 gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c   |  36 ++++++
 gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp | 143 ++++++++++++++++++++++
 gdb/testsuite/lib/dwarf.exp                  | 175 +++++++++++++++++++++++++--
 6 files changed, 362 insertions(+), 26 deletions(-)
 create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c
 create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 38a42ea..3a9e992 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2015-10-15  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
+	reading code.
+
 2015-10-30  Pedro Alves  <palves@redhat.com>
 
 	* breakpoint.c (breakpoint_in_range_p)
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 87dc8b4..a560ed8 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -11894,7 +11894,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
   int found_base;
   unsigned int dummy;
   const gdb_byte *buffer;
-  CORE_ADDR marker;
   int low_set;
   CORE_ADDR low = 0;
   CORE_ADDR high = 0;
@@ -11913,18 +11912,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
     }
   buffer = dwarf2_per_objfile->ranges.buffer + offset;
 
-  /* Read in the largest possible address.  */
-  marker = read_address (obfd, buffer, cu, &dummy);
-  if ((marker & mask) == mask)
-    {
-      /* If we found the largest possible address, then
-	 read the base address.  */
-      base = read_address (obfd, buffer + addr_size, cu, &dummy);
-      buffer += 2 * addr_size;
-      offset += 2 * addr_size;
-      found_base = 1;
-    }
-
   low_set = 0;
 
   baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
@@ -11949,9 +11936,9 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
 	 the base address.  Check for a base address here.  */
       if ((range_beginning & mask) == mask)
 	{
-	  /* If we found the largest possible address, then
-	     read the base address.  */
-	  base = read_address (obfd, buffer + addr_size, cu, &dummy);
+	  /* If we found the largest possible address, then we already
+	     have the base address in range_end.  */
+	  base = range_end;
 	  found_base = 1;
 	  continue;
 	}
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index e01ee86..5ab6199 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2015-10-16  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+	* gdb.dwarf2/dw2-ranges-base.c: New file.
+	* gdb.dwarf2/dw2-ranges-base.exp: New file.
+	* lib/dwarf.exp (namespace eval Dwarf): Add new variables to
+	support additional line table, and debug ranges generation.
+	(Dwarf::ranges): New function, generate .debug_ranges.
+	(Dwarf::lines): Support generating simple line table programs.
+	(Dwarf::assemble): Initialise new namespace variables.
+
 2015-10-30  Yao Qi  <yao.qi@linaro.org>
 
 	* gdb.threads/wp-replication.c (watch_count_done): Remove.
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c
new file mode 100644
index 0000000..4d52b6e
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c
@@ -0,0 +1,36 @@
+/*
+   Copyright 2015 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/>.  */
+
+void __attribute__ ((section (".text.3")))
+frame3 (void)
+{
+  asm ("frame3_label: .globl frame3_label");
+}
+
+void __attribute__ ((section (".text.2")))
+frame2 (void)
+{
+  asm ("frame2_label: .globl frame2_label");
+  frame3 ();
+}
+
+void __attribute__ ((section (".text.1")))
+main (void)
+{
+  asm ("main_label: .globl main_label");
+  frame2 ();
+}
+
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp
new file mode 100644
index 0000000..ae891c3
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp
@@ -0,0 +1,143 @@
+# Copyright 2015 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/>.
+load_lib dwarf.exp
+
+# Test DW_TAG_compile_unit with no children and with neither DW_AT_low_pc nor
+# DW_AT_high_pc but with DW_AT_ranges instead.
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+    verbose "Skipping DW_AT_ranges test."
+    return 0
+}
+
+# The .c files use __attribute__.
+if [get_compiler_info] {
+    return -1
+}
+if !$gcc_compiled {
+    verbose "Skipping DW_AT_ranges test."
+    return 0
+}
+
+standard_testfile dw2-ranges-base.c dw2-ranges-base-dw.S
+
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    global srcdir subdir srcfile srcfile2
+    declare_labels ranges_label;
+    declare_labels L;
+
+    # Find start address and length for our functions.
+    set main_func \
+	[function_range main [list ${srcdir}/${subdir}/$srcfile]]
+    set frame2_func \
+	[function_range frame2 [list ${srcdir}/${subdir}/$srcfile]]
+    set frame3_func \
+	[function_range frame3 [list ${srcdir}/${subdir}/$srcfile]]
+
+    # Very simple info for this test program.  We don't care about
+    # this information being correct (w.r.t. funtion / argument types)
+    # just so long as the compilation using makes use of the
+    # .debug_ranges data then the test achieves its objective.
+    cu {} {
+	compile_unit {
+	    {language @DW_LANG_C}
+	    {name dw-ranges-base.c}
+	    {stmt_list $L DW_FORM_sec_offset}
+	    {ranges ${ranges_label} DW_FORM_sec_offset}
+	} {
+	    subprogram {
+		{external 1 flag}
+		{name main}
+	    }
+	    subprogram {
+		{external 1 flag}
+		{name frame2}
+	    }
+	    subprogram {
+		{external 1 flag}
+		{name frame3}
+	    }
+	}
+    }
+
+    lines {version 2} L {
+	include_dir "${srcdir}/${subdir}"
+	file_name "$srcfile" 1
+
+	# Generate simple line table program.  The line table
+	# information contained here is not correct, and we really
+	# don't care, just so long as each function has some line
+	# table data associated with it.  We do make use of the fake
+	# line numbers that we pick here in the tests below.
+	program {
+	    {DW_LNE_set_address [lindex $main_func 0]}
+	    {DW_LNS_advance_line 10}
+	    {DW_LNS_copy}
+	    {DW_LNS_advance_pc [lindex $main_func 1]}
+	    {DW_LNS_advance_line 19}
+	    {DW_LNS_copy}
+	    {DW_LNE_end_sequence}
+
+	    {DW_LNE_set_address [lindex $frame2_func 0]}
+	    {DW_LNS_advance_line 20}
+	    {DW_LNS_copy}
+	    {DW_LNS_advance_pc [lindex $frame2_func 1]}
+	    {DW_LNS_advance_line 29}
+	    {DW_LNS_copy}
+	    {DW_LNE_end_sequence}
+
+	    {DW_LNE_set_address [lindex $frame3_func 0]}
+	    {DW_LNS_advance_line 30}
+	    {DW_LNS_copy}
+	    {DW_LNS_advance_pc [lindex $frame3_func 1]}
+	    {DW_LNS_advance_line 39}
+	    {DW_LNS_copy}
+	    {DW_LNE_end_sequence}
+	}
+    }
+
+    # Generate ranges data.  This is the point of this whole test
+    # file, we must have multiple bases specified, so we use a new
+    # base for each function.
+    ranges {is_64 [is_64_target]} {
+	ranges_label: sequence {
+	    {base [lindex $main_func 0]}
+	    {range 0 [lindex $main_func 1]}
+	    {base [lindex $frame2_func 0]}
+	    {range 0 [lindex $frame2_func 1]}
+	    {base [lindex $frame3_func 0]}
+	    {range 0 [lindex $frame3_func 1]}
+	}
+    }
+}
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} \
+	  [list $srcfile $asm_file] {nodebug}] } {
+    return -1
+}
+
+if ![runto_main] {
+    return -1
+}
+
+# Make use of the line numbers we faked in the .debug_line table above.
+gdb_test "info line main" \
+    "Line 11 of .* starts at address .* and ends at .*"
+gdb_test "info line frame2" \
+    "Line 21 of .* starts at address .* and ends at .*"
+gdb_test "info line frame3" \
+    "Line 31 of .* starts at address .* and ends at .*"
diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
index 5dc7ea8..03b59ce 100644
--- a/gdb/testsuite/lib/dwarf.exp
+++ b/gdb/testsuite/lib/dwarf.exp
@@ -303,6 +303,15 @@ namespace eval Dwarf {
     # Whether a file_name entry was seen.
     variable _line_saw_file
 
+    # Whether a line table program has been seen.
+    variable _line_saw_program
+
+    # A Label for line table header generation.
+    variable _line_header_end_label
+
+    # The address size for debug ranges section.
+    variable _debug_ranges_64_bit
+
     proc _process_one_constant {name value} {
 	variable _constants
 	variable _AT
@@ -981,7 +990,7 @@ namespace eval Dwarf {
 	set _cu_label [_compute_label "cu${cu_num}_begin"]
 	set start_label [_compute_label "cu${cu_num}_start"]
 	set end_label [_compute_label "cu${cu_num}_end"]
-	
+
 	define_label $_cu_label
 	if {$is_64} {
 	    _op .4byte 0xffffffff
@@ -1118,6 +1127,78 @@ namespace eval Dwarf {
 	define_label $end_label
     }
 
+    # Emit a DWARF .debug_ranges unit.
+    # OPTIONS is a list with an even number of elements containing
+    # option-name and option-value pairs.
+    # Current options are:
+    # is_64 0|1    - boolean indicating if you want to emit 64-bit DWARF
+    #                default = 0 (32-bit)
+    #
+    # BODY is Tcl code that emits the content of the .debug_ranges
+    # unit, it is evaluated in the caller's context.
+    proc ranges {options body} {
+	variable _debug_ranges_64_bit
+
+	foreach { name value } $options {
+	    switch -exact -- $name {
+		is_64 { set _debug_ranges_64_bit [subst $value] }
+		default { error "unknown option $name" }
+	    }
+	}
+
+	set section ".debug_ranges"
+	_section $section
+
+	proc sequence {{ranges {}}} {
+	    variable _debug_ranges_64_bit
+
+	    # Emit the sequence of addresses.
+	    set base ""
+	    foreach range $ranges {
+		set range [uplevel 1 "subst \"$range\""]
+		set type [lindex $range 0]
+		switch -exact -- $type {
+		    base {
+			set base [lrange $range 1 end]
+
+			if { $_debug_ranges_64_bit } then {
+			    _op .8byte 0xffffffffffffffff "Base Marker"
+			    _op .8byte $base "Base Address"
+			} else {
+			    _op .4byte 0xffffffff "Base Marker"
+			    _op .4byte $base "Base Address"
+			}
+		    }
+		    range {
+			set start [lindex $range 1]
+			set end [lrange $range 2 end]
+
+			if { $_debug_ranges_64_bit } then {
+			    _op .8byte $start "Start Address"
+			    _op .8byte $end "End Address"
+			} else {
+			    _op .4byte $start "Start Address"
+			    _op .4byte $end "End Address"
+			}
+		    }
+		    default { error "unknown range type: $type " }
+		}
+	    }
+
+	    # End of the sequence.
+	    if { $_debug_ranges_64_bit } then {
+		_op .8byte 0x0 "End of Sequence Marker (Part 1)"
+		_op .8byte 0x0 "End of Sequence Marker (Part 2)"
+	    } else {
+		_op .4byte 0x0 "End of Sequence Marker (Part 1)"
+		_op .4byte 0x0 "End of Sequence Marker (Part 2)"
+	    }
+	}
+
+	uplevel $body
+    }
+
+
     # Emit a DWARF .debug_line unit.
     # OPTIONS is a list with an even number of elements containing
     # option-name and option-value pairs.
@@ -1146,6 +1227,8 @@ namespace eval Dwarf {
     proc lines {options label body} {
 	variable _line_count
 	variable _line_saw_file
+	variable _line_saw_program
+	variable _line_header_end_label
 
 	# Establish the defaults.
 	set is_64 0
@@ -1181,7 +1264,7 @@ namespace eval Dwarf {
 	set unit_len_label [_compute_label "line${_line_count}_start"]
 	set unit_end_label [_compute_label "line${_line_count}_end"]
 	set header_len_label [_compute_label "line${_line_count}_header_start"]
-	set header_end_label [_compute_label "line${_line_count}_header_end"]
+	set _line_header_end_label [_compute_label "line${_line_count}_header_end"]
 
 	if {$is_64} {
 	    _op .4byte 0xffffffff
@@ -1195,20 +1278,34 @@ namespace eval Dwarf {
 	_op .2byte $_unit_version version
 
 	if {$is_64} {
-	    _op .8byte "$header_end_label - $header_len_label" "header_length"
+	    _op .8byte "$_line_header_end_label - $header_len_label" "header_length"
 	} else {
-	    _op .4byte "$header_end_label - $header_len_label" "header_length"
+	    _op .4byte "$_line_header_end_label - $header_len_label" "header_length"
 	}
 
 	define_label $header_len_label
 
 	_op .byte 1 "minimum_instruction_length"
-	_op .byte 0 "default_is_stmt"
+	_op .byte 1 "default_is_stmt"
 	_op .byte 1 "line_base"
 	_op .byte 1 "line_range"
-	_op .byte 1 "opcode_base"
-	# Since we emit opcode_base==1, we skip
-	# standard_opcode_length table altogether.
+	_op .byte 10 "opcode_base"
+
+	# The standard_opcode_lengths table.  The number of arguments
+	# for each of the standard opcodes.  Generating 9 entries here
+	# matches the use of 10 in the opcode_base above.  These 9
+	# entries match the 9 standard opcodes for DWARF2, making use
+	# of only 9 should be fine, even if we are generating DWARF3
+	# or DWARF4.
+	_op .byte 0 "standard opcode 1"
+	_op .byte 1 "standard opcode 2"
+	_op .byte 1 "standard opcode 3"
+	_op .byte 1 "standard opcode 4"
+	_op .byte 1 "standard opcode 5"
+	_op .byte 0 "standard opcode 6"
+	_op .byte 0 "standard opcode 7"
+	_op .byte 0 "standard opcode 8"
+	_op .byte 1 "standard opcode 9"
 
 	proc include_dir {dirname} {
 	    _op .ascii [_quote $dirname]
@@ -1228,6 +1325,57 @@ namespace eval Dwarf {
 	    _op .sleb128 0 "length"
 	}
 
+	proc program {statements} {
+	    variable _line_saw_program
+	    variable _line_header_end_label
+
+	    if "! $_line_saw_program" {
+		# Terminate the file list.
+		_op .byte 0 "Terminator."
+		define_label $_line_header_end_label
+		set _line_saw_program 1
+	    }
+
+	    proc DW_LNE_set_address {addr} {
+		_op .byte 0
+		set start [new_label "set_address_start"]
+		set end [new_label "set_address_end"]
+		_op .uleb128 "${end} - ${start}"
+		define_label ${start}
+		_op .byte 2
+		if {[is_64_target]} {
+		    _op .8byte ${addr}
+		} else {
+		    _op .4byte ${addr}
+		}
+		define_label ${end}
+	    }
+
+	    proc DW_LNE_end_sequence {} {
+		_op .byte 0
+		_op .uleb128 1
+		_op .byte 1
+	    }
+
+	    proc DW_LNS_copy {} {
+		_op .byte 1
+	    }
+
+	    proc DW_LNS_advance_pc {offset} {
+		_op .byte 2
+		_op .uleb128 ${offset}
+	    }
+
+	    proc DW_LNS_advance_line {offset} {
+		_op .byte 3
+		_op .sleb128 ${offset}
+	    }
+
+	    foreach statement $statements {
+		uplevel 1 $statement
+	    }
+	}
+
 	uplevel $body
 
 	rename include_dir ""
@@ -1239,9 +1387,11 @@ namespace eval Dwarf {
 	}
 
 	# Terminate the file list.
-	_op .byte 0 "Terminator."
+	if "! $_line_saw_program" {
+	    _op .byte 0 "Terminator."
+	    define_label $_line_header_end_label
+	}
 
-	define_label $header_end_label
 	define_label $unit_end_label
     }
 
@@ -1326,6 +1476,9 @@ namespace eval Dwarf {
 	variable _cu_count
 	variable _line_count
 	variable _line_saw_file
+	variable _line_saw_program
+	variable _line_header_end_label
+	variable _debug_ranges_64_bit
 
 	if {!$_initialized} {
 	    _read_constants
@@ -1341,6 +1494,8 @@ namespace eval Dwarf {
 
 	set _line_count 0
 	set _line_saw_file 0
+	set _line_saw_program 0
+	set _debug_ranges_64_bit [is_64_target]
 
 	# Not "uplevel" here, because we want to evaluate in this
 	# namespace.  This is somewhat bad because it means we can't
-- 
2.5.1

^ permalink raw reply	[flat|nested] 6+ messages in thread

* PING: [PATCH v2] gdb: Handle multiple base address in debug_ranges data.
  2015-11-03 10:35 ` [PATCH v2] " Andrew Burgess
@ 2015-11-25 10:54   ` Andrew Burgess
  2015-12-09 12:42   ` Pedro Alves
  1 sibling, 0 replies; 6+ messages in thread
From: Andrew Burgess @ 2015-11-25 10:54 UTC (permalink / raw)
  To: gdb-patches

Ping!

* Andrew Burgess <andrew.burgess@embecosm.com> [2015-11-03 10:35:06 +0000]:

> Below is a second attempt at fixing the multiple base address bug in
> the gdb DWARF parsing code.
> 
> The actual fix is identical to the first patch, the big change here is
> in the testing.
> 
> Gone is the x86-64 assembler example, and instead I have tried[1] to
> extend the dwarf assembler to generate sufficient information to
> trigger this bug, this required extensions to the .debug_line
> generation, and new code to handle .debug_ranges generation.
> 
> I've tested this new tests on x86-64 Linux compiling as a 64-bit
> target, and when passing '-m32' to the test to compile as a 32-bit
> target.
> 
> My TCL skills are pretty weak[2] so constructive guidance on how to
> improve this code would be great, alternatively if someone (anyone)
> would like to show me how easy this is, please do improve on this
> patch.
> 
> Alternatively, how do you feel about letting this in ... for now.
> 
> Thanks,
> Andrew
> 
> 
> [1] Really, I tried.  No matter how bad the TCL code might look,
>     please don't think I've not tried :)
> 
> [2] As evidence I present .... this patch :)
> 
> ---
> 
> It is possible to use multiple base addresses within a single address
> range series, within the .debug_ranges section.  The following is a
> simplified example for 32-bit addresses:
> 
>   .section ".debug_ranges"
>   .4byte	0xffffffff
>   .4byte	BASE_1
>   .4byte	START_OFFSET_1
>   .4byte	END_OFFSET_1
>   .4byte	START_OFFSET_2
>   .4byte	END_OFFSET_2
>   .4byte	0xffffffff
>   .4byte	BASE_2
>   .4byte	START_OFFSET_3
>   .4byte	END_OFFSET_3
>   .4byte	0
>   .4byte	0
> 
> In this example START/END 1 and 2 are relative to BASE_1, while
> START/END 3 are relative to BASE_2.
> 
> Currently gdb does not correctly parse this DWARF, resulting in
> corrupted address range information.  This commit fixes this issue, and
> adds a new test to cover this case.
> 
> In order to support testing of this feature extensions were made to the
> testsuite dwarf assembler, additional functionality was added to the
> .debug_line generation function, and a new function for generating the
> .debug_ranges section was added.
> 
> gdb/ChangeLog:
> 
> 	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
> 	reading code.
> 
> gdb/testsuite/ChangeLog:
> 
> 	* gdb.dwarf2/dw2-ranges-base.c: New file.
> 	* gdb.dwarf2/dw2-ranges-base.exp: New file.
> 	* lib/dwarf.exp (namespace eval Dwarf): Add new variables to
> 	support additional line table, and debug ranges generation.
> 	(Dwarf::ranges): New function, generate .debug_ranges.
> 	(Dwarf::lines): Support generating simple line table programs.
> 	(Dwarf::assemble): Initialise new namespace variables.
> ---
>  gdb/ChangeLog                                |   5 +
>  gdb/dwarf2read.c                             |  19 +--
>  gdb/testsuite/ChangeLog                      |  10 ++
>  gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c   |  36 ++++++
>  gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp | 143 ++++++++++++++++++++++
>  gdb/testsuite/lib/dwarf.exp                  | 175 +++++++++++++++++++++++++--
>  6 files changed, 362 insertions(+), 26 deletions(-)
>  create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c
>  create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp
> 
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog
> index 38a42ea..3a9e992 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -1,3 +1,8 @@
> +2015-10-15  Andrew Burgess  <andrew.burgess@embecosm.com>
> +
> +	* dwarf2read.c (dwarf2_ranges_read): Unify and fix base address
> +	reading code.
> +
>  2015-10-30  Pedro Alves  <palves@redhat.com>
>  
>  	* breakpoint.c (breakpoint_in_range_p)
> diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
> index 87dc8b4..a560ed8 100644
> --- a/gdb/dwarf2read.c
> +++ b/gdb/dwarf2read.c
> @@ -11894,7 +11894,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
>    int found_base;
>    unsigned int dummy;
>    const gdb_byte *buffer;
> -  CORE_ADDR marker;
>    int low_set;
>    CORE_ADDR low = 0;
>    CORE_ADDR high = 0;
> @@ -11913,18 +11912,6 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
>      }
>    buffer = dwarf2_per_objfile->ranges.buffer + offset;
>  
> -  /* Read in the largest possible address.  */
> -  marker = read_address (obfd, buffer, cu, &dummy);
> -  if ((marker & mask) == mask)
> -    {
> -      /* If we found the largest possible address, then
> -	 read the base address.  */
> -      base = read_address (obfd, buffer + addr_size, cu, &dummy);
> -      buffer += 2 * addr_size;
> -      offset += 2 * addr_size;
> -      found_base = 1;
> -    }
> -
>    low_set = 0;
>  
>    baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
> @@ -11949,9 +11936,9 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
>  	 the base address.  Check for a base address here.  */
>        if ((range_beginning & mask) == mask)
>  	{
> -	  /* If we found the largest possible address, then
> -	     read the base address.  */
> -	  base = read_address (obfd, buffer + addr_size, cu, &dummy);
> +	  /* If we found the largest possible address, then we already
> +	     have the base address in range_end.  */
> +	  base = range_end;
>  	  found_base = 1;
>  	  continue;
>  	}
> diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
> index e01ee86..5ab6199 100644
> --- a/gdb/testsuite/ChangeLog
> +++ b/gdb/testsuite/ChangeLog
> @@ -1,3 +1,13 @@
> +2015-10-16  Andrew Burgess  <andrew.burgess@embecosm.com>
> +
> +	* gdb.dwarf2/dw2-ranges-base.c: New file.
> +	* gdb.dwarf2/dw2-ranges-base.exp: New file.
> +	* lib/dwarf.exp (namespace eval Dwarf): Add new variables to
> +	support additional line table, and debug ranges generation.
> +	(Dwarf::ranges): New function, generate .debug_ranges.
> +	(Dwarf::lines): Support generating simple line table programs.
> +	(Dwarf::assemble): Initialise new namespace variables.
> +
>  2015-10-30  Yao Qi  <yao.qi@linaro.org>
>  
>  	* gdb.threads/wp-replication.c (watch_count_done): Remove.
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c
> new file mode 100644
> index 0000000..4d52b6e
> --- /dev/null
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.c
> @@ -0,0 +1,36 @@
> +/*
> +   Copyright 2015 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/>.  */
> +
> +void __attribute__ ((section (".text.3")))
> +frame3 (void)
> +{
> +  asm ("frame3_label: .globl frame3_label");
> +}
> +
> +void __attribute__ ((section (".text.2")))
> +frame2 (void)
> +{
> +  asm ("frame2_label: .globl frame2_label");
> +  frame3 ();
> +}
> +
> +void __attribute__ ((section (".text.1")))
> +main (void)
> +{
> +  asm ("main_label: .globl main_label");
> +  frame2 ();
> +}
> +
> diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp
> new file mode 100644
> index 0000000..ae891c3
> --- /dev/null
> +++ b/gdb/testsuite/gdb.dwarf2/dw2-ranges-base.exp
> @@ -0,0 +1,143 @@
> +# Copyright 2015 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/>.
> +load_lib dwarf.exp
> +
> +# Test DW_TAG_compile_unit with no children and with neither DW_AT_low_pc nor
> +# DW_AT_high_pc but with DW_AT_ranges instead.
> +
> +# This test can only be run on targets which support DWARF-2 and use gas.
> +if {![dwarf2_support]} {
> +    verbose "Skipping DW_AT_ranges test."
> +    return 0
> +}
> +
> +# The .c files use __attribute__.
> +if [get_compiler_info] {
> +    return -1
> +}
> +if !$gcc_compiled {
> +    verbose "Skipping DW_AT_ranges test."
> +    return 0
> +}
> +
> +standard_testfile dw2-ranges-base.c dw2-ranges-base-dw.S
> +
> +set asm_file [standard_output_file $srcfile2]
> +Dwarf::assemble $asm_file {
> +    global srcdir subdir srcfile srcfile2
> +    declare_labels ranges_label;
> +    declare_labels L;
> +
> +    # Find start address and length for our functions.
> +    set main_func \
> +	[function_range main [list ${srcdir}/${subdir}/$srcfile]]
> +    set frame2_func \
> +	[function_range frame2 [list ${srcdir}/${subdir}/$srcfile]]
> +    set frame3_func \
> +	[function_range frame3 [list ${srcdir}/${subdir}/$srcfile]]
> +
> +    # Very simple info for this test program.  We don't care about
> +    # this information being correct (w.r.t. funtion / argument types)
> +    # just so long as the compilation using makes use of the
> +    # .debug_ranges data then the test achieves its objective.
> +    cu {} {
> +	compile_unit {
> +	    {language @DW_LANG_C}
> +	    {name dw-ranges-base.c}
> +	    {stmt_list $L DW_FORM_sec_offset}
> +	    {ranges ${ranges_label} DW_FORM_sec_offset}
> +	} {
> +	    subprogram {
> +		{external 1 flag}
> +		{name main}
> +	    }
> +	    subprogram {
> +		{external 1 flag}
> +		{name frame2}
> +	    }
> +	    subprogram {
> +		{external 1 flag}
> +		{name frame3}
> +	    }
> +	}
> +    }
> +
> +    lines {version 2} L {
> +	include_dir "${srcdir}/${subdir}"
> +	file_name "$srcfile" 1
> +
> +	# Generate simple line table program.  The line table
> +	# information contained here is not correct, and we really
> +	# don't care, just so long as each function has some line
> +	# table data associated with it.  We do make use of the fake
> +	# line numbers that we pick here in the tests below.
> +	program {
> +	    {DW_LNE_set_address [lindex $main_func 0]}
> +	    {DW_LNS_advance_line 10}
> +	    {DW_LNS_copy}
> +	    {DW_LNS_advance_pc [lindex $main_func 1]}
> +	    {DW_LNS_advance_line 19}
> +	    {DW_LNS_copy}
> +	    {DW_LNE_end_sequence}
> +
> +	    {DW_LNE_set_address [lindex $frame2_func 0]}
> +	    {DW_LNS_advance_line 20}
> +	    {DW_LNS_copy}
> +	    {DW_LNS_advance_pc [lindex $frame2_func 1]}
> +	    {DW_LNS_advance_line 29}
> +	    {DW_LNS_copy}
> +	    {DW_LNE_end_sequence}
> +
> +	    {DW_LNE_set_address [lindex $frame3_func 0]}
> +	    {DW_LNS_advance_line 30}
> +	    {DW_LNS_copy}
> +	    {DW_LNS_advance_pc [lindex $frame3_func 1]}
> +	    {DW_LNS_advance_line 39}
> +	    {DW_LNS_copy}
> +	    {DW_LNE_end_sequence}
> +	}
> +    }
> +
> +    # Generate ranges data.  This is the point of this whole test
> +    # file, we must have multiple bases specified, so we use a new
> +    # base for each function.
> +    ranges {is_64 [is_64_target]} {
> +	ranges_label: sequence {
> +	    {base [lindex $main_func 0]}
> +	    {range 0 [lindex $main_func 1]}
> +	    {base [lindex $frame2_func 0]}
> +	    {range 0 [lindex $frame2_func 1]}
> +	    {base [lindex $frame3_func 0]}
> +	    {range 0 [lindex $frame3_func 1]}
> +	}
> +    }
> +}
> +
> +if { [prepare_for_testing ${testfile}.exp ${testfile} \
> +	  [list $srcfile $asm_file] {nodebug}] } {
> +    return -1
> +}
> +
> +if ![runto_main] {
> +    return -1
> +}
> +
> +# Make use of the line numbers we faked in the .debug_line table above.
> +gdb_test "info line main" \
> +    "Line 11 of .* starts at address .* and ends at .*"
> +gdb_test "info line frame2" \
> +    "Line 21 of .* starts at address .* and ends at .*"
> +gdb_test "info line frame3" \
> +    "Line 31 of .* starts at address .* and ends at .*"
> diff --git a/gdb/testsuite/lib/dwarf.exp b/gdb/testsuite/lib/dwarf.exp
> index 5dc7ea8..03b59ce 100644
> --- a/gdb/testsuite/lib/dwarf.exp
> +++ b/gdb/testsuite/lib/dwarf.exp
> @@ -303,6 +303,15 @@ namespace eval Dwarf {
>      # Whether a file_name entry was seen.
>      variable _line_saw_file
>  
> +    # Whether a line table program has been seen.
> +    variable _line_saw_program
> +
> +    # A Label for line table header generation.
> +    variable _line_header_end_label
> +
> +    # The address size for debug ranges section.
> +    variable _debug_ranges_64_bit
> +
>      proc _process_one_constant {name value} {
>  	variable _constants
>  	variable _AT
> @@ -981,7 +990,7 @@ namespace eval Dwarf {
>  	set _cu_label [_compute_label "cu${cu_num}_begin"]
>  	set start_label [_compute_label "cu${cu_num}_start"]
>  	set end_label [_compute_label "cu${cu_num}_end"]
> -	
> +
>  	define_label $_cu_label
>  	if {$is_64} {
>  	    _op .4byte 0xffffffff
> @@ -1118,6 +1127,78 @@ namespace eval Dwarf {
>  	define_label $end_label
>      }
>  
> +    # Emit a DWARF .debug_ranges unit.
> +    # OPTIONS is a list with an even number of elements containing
> +    # option-name and option-value pairs.
> +    # Current options are:
> +    # is_64 0|1    - boolean indicating if you want to emit 64-bit DWARF
> +    #                default = 0 (32-bit)
> +    #
> +    # BODY is Tcl code that emits the content of the .debug_ranges
> +    # unit, it is evaluated in the caller's context.
> +    proc ranges {options body} {
> +	variable _debug_ranges_64_bit
> +
> +	foreach { name value } $options {
> +	    switch -exact -- $name {
> +		is_64 { set _debug_ranges_64_bit [subst $value] }
> +		default { error "unknown option $name" }
> +	    }
> +	}
> +
> +	set section ".debug_ranges"
> +	_section $section
> +
> +	proc sequence {{ranges {}}} {
> +	    variable _debug_ranges_64_bit
> +
> +	    # Emit the sequence of addresses.
> +	    set base ""
> +	    foreach range $ranges {
> +		set range [uplevel 1 "subst \"$range\""]
> +		set type [lindex $range 0]
> +		switch -exact -- $type {
> +		    base {
> +			set base [lrange $range 1 end]
> +
> +			if { $_debug_ranges_64_bit } then {
> +			    _op .8byte 0xffffffffffffffff "Base Marker"
> +			    _op .8byte $base "Base Address"
> +			} else {
> +			    _op .4byte 0xffffffff "Base Marker"
> +			    _op .4byte $base "Base Address"
> +			}
> +		    }
> +		    range {
> +			set start [lindex $range 1]
> +			set end [lrange $range 2 end]
> +
> +			if { $_debug_ranges_64_bit } then {
> +			    _op .8byte $start "Start Address"
> +			    _op .8byte $end "End Address"
> +			} else {
> +			    _op .4byte $start "Start Address"
> +			    _op .4byte $end "End Address"
> +			}
> +		    }
> +		    default { error "unknown range type: $type " }
> +		}
> +	    }
> +
> +	    # End of the sequence.
> +	    if { $_debug_ranges_64_bit } then {
> +		_op .8byte 0x0 "End of Sequence Marker (Part 1)"
> +		_op .8byte 0x0 "End of Sequence Marker (Part 2)"
> +	    } else {
> +		_op .4byte 0x0 "End of Sequence Marker (Part 1)"
> +		_op .4byte 0x0 "End of Sequence Marker (Part 2)"
> +	    }
> +	}
> +
> +	uplevel $body
> +    }
> +
> +
>      # Emit a DWARF .debug_line unit.
>      # OPTIONS is a list with an even number of elements containing
>      # option-name and option-value pairs.
> @@ -1146,6 +1227,8 @@ namespace eval Dwarf {
>      proc lines {options label body} {
>  	variable _line_count
>  	variable _line_saw_file
> +	variable _line_saw_program
> +	variable _line_header_end_label
>  
>  	# Establish the defaults.
>  	set is_64 0
> @@ -1181,7 +1264,7 @@ namespace eval Dwarf {
>  	set unit_len_label [_compute_label "line${_line_count}_start"]
>  	set unit_end_label [_compute_label "line${_line_count}_end"]
>  	set header_len_label [_compute_label "line${_line_count}_header_start"]
> -	set header_end_label [_compute_label "line${_line_count}_header_end"]
> +	set _line_header_end_label [_compute_label "line${_line_count}_header_end"]
>  
>  	if {$is_64} {
>  	    _op .4byte 0xffffffff
> @@ -1195,20 +1278,34 @@ namespace eval Dwarf {
>  	_op .2byte $_unit_version version
>  
>  	if {$is_64} {
> -	    _op .8byte "$header_end_label - $header_len_label" "header_length"
> +	    _op .8byte "$_line_header_end_label - $header_len_label" "header_length"
>  	} else {
> -	    _op .4byte "$header_end_label - $header_len_label" "header_length"
> +	    _op .4byte "$_line_header_end_label - $header_len_label" "header_length"
>  	}
>  
>  	define_label $header_len_label
>  
>  	_op .byte 1 "minimum_instruction_length"
> -	_op .byte 0 "default_is_stmt"
> +	_op .byte 1 "default_is_stmt"
>  	_op .byte 1 "line_base"
>  	_op .byte 1 "line_range"
> -	_op .byte 1 "opcode_base"
> -	# Since we emit opcode_base==1, we skip
> -	# standard_opcode_length table altogether.
> +	_op .byte 10 "opcode_base"
> +
> +	# The standard_opcode_lengths table.  The number of arguments
> +	# for each of the standard opcodes.  Generating 9 entries here
> +	# matches the use of 10 in the opcode_base above.  These 9
> +	# entries match the 9 standard opcodes for DWARF2, making use
> +	# of only 9 should be fine, even if we are generating DWARF3
> +	# or DWARF4.
> +	_op .byte 0 "standard opcode 1"
> +	_op .byte 1 "standard opcode 2"
> +	_op .byte 1 "standard opcode 3"
> +	_op .byte 1 "standard opcode 4"
> +	_op .byte 1 "standard opcode 5"
> +	_op .byte 0 "standard opcode 6"
> +	_op .byte 0 "standard opcode 7"
> +	_op .byte 0 "standard opcode 8"
> +	_op .byte 1 "standard opcode 9"
>  
>  	proc include_dir {dirname} {
>  	    _op .ascii [_quote $dirname]
> @@ -1228,6 +1325,57 @@ namespace eval Dwarf {
>  	    _op .sleb128 0 "length"
>  	}
>  
> +	proc program {statements} {
> +	    variable _line_saw_program
> +	    variable _line_header_end_label
> +
> +	    if "! $_line_saw_program" {
> +		# Terminate the file list.
> +		_op .byte 0 "Terminator."
> +		define_label $_line_header_end_label
> +		set _line_saw_program 1
> +	    }
> +
> +	    proc DW_LNE_set_address {addr} {
> +		_op .byte 0
> +		set start [new_label "set_address_start"]
> +		set end [new_label "set_address_end"]
> +		_op .uleb128 "${end} - ${start}"
> +		define_label ${start}
> +		_op .byte 2
> +		if {[is_64_target]} {
> +		    _op .8byte ${addr}
> +		} else {
> +		    _op .4byte ${addr}
> +		}
> +		define_label ${end}
> +	    }
> +
> +	    proc DW_LNE_end_sequence {} {
> +		_op .byte 0
> +		_op .uleb128 1
> +		_op .byte 1
> +	    }
> +
> +	    proc DW_LNS_copy {} {
> +		_op .byte 1
> +	    }
> +
> +	    proc DW_LNS_advance_pc {offset} {
> +		_op .byte 2
> +		_op .uleb128 ${offset}
> +	    }
> +
> +	    proc DW_LNS_advance_line {offset} {
> +		_op .byte 3
> +		_op .sleb128 ${offset}
> +	    }
> +
> +	    foreach statement $statements {
> +		uplevel 1 $statement
> +	    }
> +	}
> +
>  	uplevel $body
>  
>  	rename include_dir ""
> @@ -1239,9 +1387,11 @@ namespace eval Dwarf {
>  	}
>  
>  	# Terminate the file list.
> -	_op .byte 0 "Terminator."
> +	if "! $_line_saw_program" {
> +	    _op .byte 0 "Terminator."
> +	    define_label $_line_header_end_label
> +	}
>  
> -	define_label $header_end_label
>  	define_label $unit_end_label
>      }
>  
> @@ -1326,6 +1476,9 @@ namespace eval Dwarf {
>  	variable _cu_count
>  	variable _line_count
>  	variable _line_saw_file
> +	variable _line_saw_program
> +	variable _line_header_end_label
> +	variable _debug_ranges_64_bit
>  
>  	if {!$_initialized} {
>  	    _read_constants
> @@ -1341,6 +1494,8 @@ namespace eval Dwarf {
>  
>  	set _line_count 0
>  	set _line_saw_file 0
> +	set _line_saw_program 0
> +	set _debug_ranges_64_bit [is_64_target]
>  
>  	# Not "uplevel" here, because we want to evaluate in this
>  	# namespace.  This is somewhat bad because it means we can't
> -- 
> 2.5.1
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2] gdb: Handle multiple base address in debug_ranges data.
  2015-11-03 10:35 ` [PATCH v2] " Andrew Burgess
  2015-11-25 10:54   ` PING: " Andrew Burgess
@ 2015-12-09 12:42   ` Pedro Alves
  1 sibling, 0 replies; 6+ messages in thread
From: Pedro Alves @ 2015-12-09 12:42 UTC (permalink / raw)
  To: Andrew Burgess, gdb-patches; +Cc: Doug Evans

On 11/03/2015 10:35 AM, Andrew Burgess wrote:
> Below is a second attempt at fixing the multiple base address bug in
> the gdb DWARF parsing code.
> 
> The actual fix is identical to the first patch, the big change here is
> in the testing.
> 
> Gone is the x86-64 assembler example, and instead I have tried[1] to
> extend the dwarf assembler to generate sufficient information to
> trigger this bug, this required extensions to the .debug_line
> generation, and new code to handle .debug_ranges generation.
> 
> I've tested this new tests on x86-64 Linux compiling as a 64-bit
> target, and when passing '-m32' to the test to compile as a 32-bit
> target.
> 
> My TCL skills are pretty weak[2] so constructive guidance on how to
> improve this code would be great, alternatively if someone (anyone)
> would like to show me how easy this is, please do improve on this
> patch.
> 
> Alternatively, how do you feel about letting this in ... for now.

Thanks for doing this!

I skimmed it, and it looks like the same style of code as the rest
of the Dwarf assembler, so I'd feel quite comfortable putting
this in as is.

Tiny nit:

> +Dwarf::assemble $asm_file {
> +    global srcdir subdir srcfile srcfile2
> +    declare_labels ranges_label;
> +    declare_labels L;
> +

No need for ; at the end of those declare_labels lines.

Thanks,
Pedro Alves

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-12-09 12:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-16 12:54 [PATCH] gdb: Handle multiple base address in debug_ranges data Andrew Burgess
2015-10-26  3:49 ` Doug Evans
2015-10-26 12:55   ` Andrew Burgess
2015-11-03 10:35 ` [PATCH v2] " Andrew Burgess
2015-11-25 10:54   ` PING: " Andrew Burgess
2015-12-09 12:42   ` Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).