aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/dwarf2read.c76
-rw-r--r--gdb/testsuite/ChangeLog9
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S151
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c28
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S151
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c28
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.c28
-rw-r--r--gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp35
9 files changed, 491 insertions, 28 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 71723e9..bb7060c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,16 @@
+2014-02-27 Joel Brobecker <brobecker@adacore.com>
+
+ * dwarf2read.c (attr_value_as_address): New function.
+ (dwarf2_find_base_address, read_call_site_scope): Use
+ attr_value_as_address in place of DW_ADDR.
+ (dwarf2_get_pc_bounds): Use attr_value_as_address to get
+ the low and high addresses. Slight rework of the handling
+ of the high pc being a constant form, and limit it to
+ DWARF verson 4 or higher.
+ (dwarf2_record_block_ranges): Likewise.
+ (read_partial_die): Likewise.
+ (new_symbol_full): Use attr_value_as_address in place of DW_ADDR.
+
2014-02-26 Tom Tromey <tromey@redhat.com>
* exec.c (exec_file_attach): Hold a reference to exec_bfd.
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 8c20f15..8a850f1 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -1942,6 +1942,36 @@ byte_swap (offset_type value)
#define MAYBE_SWAP(V) (V)
#endif /* WORDS_BIGENDIAN */
+/* Read the given attribute value as an address, taking the attribute's
+ form into account. */
+
+static CORE_ADDR
+attr_value_as_address (struct attribute *attr)
+{
+ CORE_ADDR addr;
+
+ if (attr->form != DW_FORM_addr && attr->form != DW_FORM_GNU_addr_index)
+ {
+ /* Aside from a few clearly defined exceptions, attributes that
+ contain an address must always be in DW_FORM_addr form.
+ Unfortunately, some compilers happen to be violating this
+ requirement by encoding addresses using other forms, such
+ as DW_FORM_data4 for example. For those broken compilers,
+ we try to do our best, without any guarantee of success,
+ to interpret the address correctly. It would also be nice
+ to generate a complaint, but that would require us to maintain
+ a list of legitimate cases where a non-address form is allowed,
+ as well as update callers to pass in at least the CU's DWARF
+ version. This is more overhead than what we're willing to
+ expand for a pretty rare case. */
+ addr = DW_UNSND (attr);
+ }
+ else
+ addr = DW_ADDR (attr);
+
+ return addr;
+}
+
/* The suffix for an index file. */
#define INDEX_SUFFIX ".gdb-index"
@@ -4204,7 +4234,7 @@ dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu)
attr = dwarf2_attr (die, DW_AT_entry_pc, cu);
if (attr)
{
- cu->base_address = DW_ADDR (attr);
+ cu->base_address = attr_value_as_address (attr);
cu->base_known = 1;
}
else
@@ -4212,7 +4242,7 @@ dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu)
attr = dwarf2_attr (die, DW_AT_low_pc, cu);
if (attr)
{
- cu->base_address = DW_ADDR (attr);
+ cu->base_address = attr_value_as_address (attr);
cu->base_known = 1;
}
}
@@ -11260,7 +11290,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
die->offset.sect_off, objfile_name (objfile));
return;
}
- pc = DW_ADDR (attr) + baseaddr;
+ pc = attr_value_as_address (attr) + baseaddr;
if (cu->call_site_htab == NULL)
cu->call_site_htab = htab_create_alloc_ex (16, core_addr_hash, core_addr_eq,
@@ -11701,12 +11731,10 @@ dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
attr = dwarf2_attr (die, DW_AT_low_pc, cu);
if (attr)
{
- low = DW_ADDR (attr);
- if (attr_high->form == DW_FORM_addr
- || attr_high->form == DW_FORM_GNU_addr_index)
- high = DW_ADDR (attr_high);
- else
- high = low + DW_UNSND (attr_high);
+ low = attr_value_as_address (attr);
+ high = attr_value_as_address (attr_high);
+ if (cu->header.version >= 4 && attr_form_is_constant (attr_high))
+ high += low;
}
else
/* Found high w/o low attribute. */
@@ -11872,13 +11900,11 @@ dwarf2_record_block_ranges (struct die_info *die, struct block *block,
attr = dwarf2_attr (die, DW_AT_low_pc, cu);
if (attr)
{
- CORE_ADDR low = DW_ADDR (attr);
- CORE_ADDR high;
- if (attr_high->form == DW_FORM_addr
- || attr_high->form == DW_FORM_GNU_addr_index)
- high = DW_ADDR (attr_high);
- else
- high = low + DW_UNSND (attr_high);
+ CORE_ADDR low = attr_value_as_address (attr);
+ CORE_ADDR high = attr_value_as_address (attr_high);
+
+ if (cu->header.version >= 4 && attr_form_is_constant (attr_high))
+ high += low;
record_block_range (block, baseaddr + low, baseaddr + high - 1);
}
@@ -15336,18 +15362,13 @@ read_partial_die (const struct die_reader_specs *reader,
break;
case DW_AT_low_pc:
has_low_pc_attr = 1;
- part_die->lowpc = DW_ADDR (&attr);
+ part_die->lowpc = attr_value_as_address (&attr);
break;
case DW_AT_high_pc:
has_high_pc_attr = 1;
- if (attr.form == DW_FORM_addr
- || attr.form == DW_FORM_GNU_addr_index)
- part_die->highpc = DW_ADDR (&attr);
- else
- {
- high_pc_relative = 1;
- part_die->highpc = DW_UNSND (&attr);
- }
+ part_die->highpc = attr_value_as_address (&attr);
+ if (cu->header.version >= 4 && attr_form_is_constant (&attr))
+ high_pc_relative = 1;
break;
case DW_AT_location:
/* Support the .debug_loc offsets. */
@@ -17560,9 +17581,8 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
case DW_TAG_label:
attr = dwarf2_attr (die, DW_AT_low_pc, cu);
if (attr)
- {
- SYMBOL_VALUE_ADDRESS (sym) = DW_ADDR (attr) + baseaddr;
- }
+ SYMBOL_VALUE_ADDRESS (sym)
+ = attr_value_as_address (attr) + baseaddr;
SYMBOL_TYPE (sym) = objfile_type (objfile)->builtin_core_addr;
SYMBOL_DOMAIN (sym) = LABEL_DOMAIN;
SYMBOL_ACLASS_INDEX (sym) = LOC_LABEL;
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 1a45048..431e3ca 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,14 @@
2014-02-26 Joel Brobecker <brobecker@adacore.com>
+ * gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S: New file.
+ * gdb.dwarf2/dw2-abs-hi-pc-hello.c: New file.
+ * gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S: New file.
+ * gdb.dwarf2/dw2-abs-hi-pc-world.c: New file.
+ * gdb.dwarf2/dw2-abs-hi-pc.c: New file.
+ * gdb.dwarf2/dw2-abs-hi-pc.exp: New file.
+
+2014-02-26 Joel Brobecker <brobecker@adacore.com>
+
* testsuite/gdb.python/py-pp-re-notag.c: New file.
* testsuite/gdb.python/py-pp-re-notag.ex: New file.
* testsuite/gdb.python/py-pp-re-notag.p: New file.
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S
new file mode 100644
index 0000000..03f9442
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S
@@ -0,0 +1,151 @@
+/* Copyright 2014 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/>. */
+
+ .section .debug_info
+ .4byte .Ledebug_info0 - .Lsdebug_info0 /* Length of Compilation Unit Info */
+.Lsdebug_info0:
+ .2byte 0x2 /* DWARF version number */
+ .4byte .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+ .byte 0x4 /* Pointer Size (in bytes) */
+ .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */
+ .ascii "GNU C 4.7.4 20140206 for GNAT Pro 7.3.0w (20140206)\0"
+ .byte 0x1 /* DW_AT_language */
+ .ascii "dw2-abs-hi-pc-hello.c\0" /* DW_AT_name */
+ .ascii "/tmp\0" /* DW_AT_comp_dir */
+ .4byte .hello_start /* DW_AT_low_pc */
+ .4byte .hello_end /* DW_AT_high_pc */
+ .4byte .Ldebug_line0 /* DW_AT_stmt_list */
+ .uleb128 0x2 /* (DIE (0x2d) DW_TAG_subprogram) */
+ .byte 0x1 /* DW_AT_external */
+ .ascii "hello\0"
+ .byte 0x1 /* DW_AT_decl_file (hello.c) */
+ .byte 0x13 /* DW_AT_decl_line */
+ .byte 0x1 /* DW_AT_prototyped */
+ .4byte .hello_start /* DW_AT_low_pc */
+ .4byte .hello_end /* DW_AT_high_pc */
+ .byte 0 /* end of children of DIE 0xb */
+.Ledebug_info0:
+
+ .section .debug_abbrev
+.Ldebug_abbrev0:
+ .uleb128 0x1 /* (abbrev code) */
+ .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x25 /* (DW_AT_producer) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x13 /* (DW_AT_language) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x1b /* (DW_AT_comp_dir) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .uleb128 0x12 /* (DW_AT_high_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .uleb128 0x10 /* (DW_AT_stmt_list) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .byte 0
+ .byte 0
+ .uleb128 0x2 /* (abbrev code) */
+ .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3f /* (DW_AT_external) */
+ .uleb128 0xc /* (DW_FORM_flag) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x27 /* (DW_AT_prototyped) */
+ .uleb128 0xc /* (DW_FORM_flag) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .uleb128 0x12 /* (DW_AT_high_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .byte 0
+ .byte 0
+ .byte 0
+
+ .section .debug_line
+.Ldebug_line0:
+ .4byte LELT-LSLT /* Length of Source Line Info */
+LSLT:
+ .2byte 0x2 /* DWARF Version */
+ .4byte LELTP-LASLTP /* Prolog Length */
+LASLTP:
+ .byte 0x1 /* Minimum Instruction Length */
+ .byte 0x1 /* Default is_stmt_start flag */
+ .byte 0x1 /* Line Base Value (Special Opcodes) */
+ .byte 0x1 /* Line Range Value (Special Opcodes) */
+ .byte 0xd /* Special Opcode Base */
+ .byte 0 /* opcode: 0x1 has 0 args */
+ .byte 0x1 /* opcode: 0x2 has 1 args */
+ .byte 0x1 /* opcode: 0x3 has 1 args */
+ .byte 0x1 /* opcode: 0x4 has 1 args */
+ .byte 0x1 /* opcode: 0x5 has 1 args */
+ .byte 0 /* opcode: 0x6 has 0 args */
+ .byte 0 /* opcode: 0x7 has 0 args */
+ .byte 0 /* opcode: 0x8 has 0 args */
+ .byte 0x1 /* opcode: 0x9 has 1 args */
+ .byte 0 /* opcode: 0xa has 0 args */
+ .byte 0 /* opcode: 0xb has 0 args */
+ .byte 0x1 /* opcode: 0xc has 1 args */
+ .byte 0 /* End directory table */
+ .ascii "dw2-abs-hi-pc-hello.c\0" /* File Entry: 0x1 */
+ .uleb128 0
+ .uleb128 0
+ .uleb128 0
+ .byte 0 /* End file name table */
+LELTP:
+ .byte 0 /* set address to .hello_start */
+ .uleb128 0x5
+ .byte 0x2
+ .4byte .hello_start
+ .byte 0x3 /* DW_LNS_advance_line */
+ .sleb128 22 /* ... to 23 */
+ .byte 0x5 /* column 0 */
+ .uleb128 0 /* 0 */
+ .byte 1 /* DW_LNS_copy */
+
+ .byte 0 /* set address to .hello0 */
+ .uleb128 0x5
+ .byte 0x2
+ .4byte .hello0
+ .byte 0x3 /* DW_LNS_advance_line */
+ .sleb128 1 /* ... to 24 */
+ .byte 0x5 /* column 0 */
+ .uleb128 0 /* 0 */
+ .byte 1 /* DW_LNS_copy */
+
+ .byte 0 /* set address to .hello1 */
+ .uleb128 0x5
+ .byte 0x2
+ .4byte .hello1
+ .byte 0x3 /* DW_LNS_advance_line */
+ .sleb128 1 /* ... to 25 */
+ .byte 0x5 /* column 0 */
+ .uleb128 0 /* 0 */
+ .byte 1 /* DW_LNS_copy */
+
+ .byte 0 /* set address to .hello_end */
+ .uleb128 0x5
+ .byte 0x2
+ .4byte .hello_end
+ .byte 0 /* end sequence */
+ .uleb128 0x1
+ .byte 0x1
+LELT:
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c
new file mode 100644
index 0000000..59c761d
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello.c
@@ -0,0 +1,28 @@
+/* Copyright 2014 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ 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/>. */
+
+extern int v;
+
+asm (".hello_start: .globl .hello_start\n");
+void
+hello (void)
+{
+asm (".hello0: .globl .hello0\n");
+ v++;
+asm (".hello1: .globl .hello1\n");
+}
+asm (".hello_end: .globl .hello_end\n");
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S
new file mode 100644
index 0000000..c3e89a6
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S
@@ -0,0 +1,151 @@
+/* Copyright 2014 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/>. */
+
+ .section .debug_info
+ .4byte .Ledebug_info0 - .Lsdebug_info0 /* Length of Compilation Unit Info */
+.Lsdebug_info0:
+ .2byte 0x2 /* DWARF version number */
+ .4byte .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+ .byte 0x4 /* Pointer Size (in bytes) */
+ .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */
+ .ascii "GNU C 4.7.4 20140206 for GNAT Pro 7.3.0w (20140206)\0"
+ .byte 0x1 /* DW_AT_language */
+ .ascii "dw2-abs-hi-pc-world.c\0" /* DW_AT_name */
+ .ascii "/tmp\0" /* DW_AT_comp_dir */
+ .4byte .world_start /* DW_AT_low_pc */
+ .4byte .world_end /* DW_AT_high_pc */
+ .4byte .Ldebug_line0 /* DW_AT_stmt_list */
+ .uleb128 0x2 /* (DIE (0x2d) DW_TAG_subprogram) */
+ .byte 0x1 /* DW_AT_external */
+ .ascii "world\0"
+ .byte 0x1 /* DW_AT_decl_file (world.c) */
+ .byte 0x13 /* DW_AT_decl_line */
+ .byte 0x1 /* DW_AT_prototyped */
+ .4byte .world_start /* DW_AT_low_pc */
+ .4byte .world_end /* DW_AT_high_pc */
+ .byte 0 /* end of children of DIE 0xb */
+.Ledebug_info0:
+
+ .section .debug_abbrev
+.Ldebug_abbrev0:
+ .uleb128 0x1 /* (abbrev code) */
+ .uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
+ .byte 0x1 /* DW_children_yes */
+ .uleb128 0x25 /* (DW_AT_producer) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x13 /* (DW_AT_language) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x1b /* (DW_AT_comp_dir) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .uleb128 0x12 /* (DW_AT_high_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .uleb128 0x10 /* (DW_AT_stmt_list) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .byte 0
+ .byte 0
+ .uleb128 0x2 /* (abbrev code) */
+ .uleb128 0x2e /* (TAG: DW_TAG_subprogram) */
+ .byte 0 /* DW_children_no */
+ .uleb128 0x3f /* (DW_AT_external) */
+ .uleb128 0xc /* (DW_FORM_flag) */
+ .uleb128 0x3 /* (DW_AT_name) */
+ .uleb128 0x8 /* (DW_FORM_string) */
+ .uleb128 0x3a /* (DW_AT_decl_file) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x3b /* (DW_AT_decl_line) */
+ .uleb128 0xb /* (DW_FORM_data1) */
+ .uleb128 0x27 /* (DW_AT_prototyped) */
+ .uleb128 0xc /* (DW_FORM_flag) */
+ .uleb128 0x11 /* (DW_AT_low_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .uleb128 0x12 /* (DW_AT_high_pc) */
+ .uleb128 0x6 /* (DW_FORM_data4) */
+ .byte 0
+ .byte 0
+ .byte 0
+
+ .section .debug_line
+.Ldebug_line0:
+ .4byte LELT-LSLT /* Length of Source Line Info */
+LSLT:
+ .2byte 0x2 /* DWARF Version */
+ .4byte LELTP-LASLTP /* Prolog Length */
+LASLTP:
+ .byte 0x1 /* Minimum Instruction Length */
+ .byte 0x1 /* Default is_stmt_start flag */
+ .byte 0x1 /* Line Base Value (Special Opcodes) */
+ .byte 0x1 /* Line Range Value (Special Opcodes) */
+ .byte 0xd /* Special Opcode Base */
+ .byte 0 /* opcode: 0x1 has 0 args */
+ .byte 0x1 /* opcode: 0x2 has 1 args */
+ .byte 0x1 /* opcode: 0x3 has 1 args */
+ .byte 0x1 /* opcode: 0x4 has 1 args */
+ .byte 0x1 /* opcode: 0x5 has 1 args */
+ .byte 0 /* opcode: 0x6 has 0 args */
+ .byte 0 /* opcode: 0x7 has 0 args */
+ .byte 0 /* opcode: 0x8 has 0 args */
+ .byte 0x1 /* opcode: 0x9 has 1 args */
+ .byte 0 /* opcode: 0xa has 0 args */
+ .byte 0 /* opcode: 0xb has 0 args */
+ .byte 0x1 /* opcode: 0xc has 1 args */
+ .byte 0 /* End directory table */
+ .ascii "dw2-abs-hi-pc-world.c\0" /* File Entry: 0x1 */
+ .uleb128 0
+ .uleb128 0
+ .uleb128 0
+ .byte 0 /* End file name table */
+LELTP:
+ .byte 0 /* set address to .world_start */
+ .uleb128 0x5
+ .byte 0x2
+ .4byte .world_start
+ .byte 0x3 /* DW_LNS_advance_line */
+ .sleb128 22 /* ... to 23 */
+ .byte 0x5 /* column 0 */
+ .uleb128 0 /* 0 */
+ .byte 1 /* DW_LNS_copy */
+
+ .byte 0 /* set address to .world0 */
+ .uleb128 0x5
+ .byte 0x2
+ .4byte .world0
+ .byte 0x3 /* DW_LNS_advance_line */
+ .sleb128 1 /* ... to 24 */
+ .byte 0x5 /* column 0 */
+ .uleb128 0 /* 0 */
+ .byte 1 /* DW_LNS_copy */
+
+ .byte 0 /* set address to .world1 */
+ .uleb128 0x5
+ .byte 0x2
+ .4byte .world1
+ .byte 0x3 /* DW_LNS_advance_line */
+ .sleb128 1 /* ... to 25 */
+ .byte 0x5 /* column 0 */
+ .uleb128 0 /* 0 */
+ .byte 1 /* DW_LNS_copy */
+
+ .byte 0 /* set address to .world_end */
+ .uleb128 0x5
+ .byte 0x2
+ .4byte .world_end
+ .byte 0 /* end sequence */
+ .uleb128 0x1
+ .byte 0x1
+LELT:
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c
new file mode 100644
index 0000000..04f17bd
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world.c
@@ -0,0 +1,28 @@
+/* Copyright 2014 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ 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/>. */
+
+extern int v;
+
+asm (".world_start: .globl .world_start\n");
+void
+world (void)
+{
+asm (".world0: .globl .world0\n");
+ v++;
+asm (".world1: .globl .world1\n");
+}
+asm (".world_end: .globl .world_end\n");
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.c b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.c
new file mode 100644
index 0000000..95773a2
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.c
@@ -0,0 +1,28 @@
+/* Copyright 2014 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ 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/>. */
+
+extern void hello (void);
+extern void world (void);
+
+int v;
+
+int
+main (void)
+{
+ hello ();
+ world ();
+}
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp
new file mode 100644
index 0000000..3353fda
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc.exp
@@ -0,0 +1,35 @@
+# Copyright 2014 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
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+ return 0
+}
+
+standard_testfile
+set executable ${testfile}
+
+if {[build_executable ${testfile}.exp ${executable} "${testfile}.c ${testfile}-hello-dbg.S ${testfile}-hello.c ${testfile}-world-dbg.S ${testfile}-world.c"] == -1} {
+ return -1
+}
+
+clean_restart $executable
+
+gdb_test "break hello" \
+ "Breakpoint $decimal at $hex: file .*dw2-abs-hi-pc-hello\\.c, line 24\\."
+
+gdb_test "break world" \
+ "Breakpoint $decimal at $hex: file .*dw2-abs-hi-pc-world\\.c, line 24\\."