aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/dwarf2dbg.c20
-rw-r--r--gas/subsegs.h3
-rw-r--r--gas/testsuite/ChangeLog5
-rw-r--r--gas/testsuite/gas/elf/elf.exp1
-rw-r--r--gas/testsuite/gas/elf/group2.d12
-rw-r--r--gas/testsuite/gas/elf/group2.s9
7 files changed, 39 insertions, 18 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 7471e53..ec11c63 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2014-09-27 Alan Modra <amodra@gmail.com>
+
+ * dwarf2dbg.c (all_segs_hash): Delete.
+ (get_line_subseg): Delete last_seg, last_subseg, last_line_subseg.
+ Retrieve line_seg for section via seg_info.
+ * subsegs.h (segment_info_typet): Add dwarf2_line_seg.
+
2014-09-23 H.J. Lu <hongjiu.lu@intel.com>
PR gas/17421
diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index 5cc4662..3067b8c 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -186,9 +186,6 @@ struct line_seg {
/* Collects data for all line table entries during assembly. */
static struct line_seg *all_segs;
-/* Hash used to quickly lookup a segment by name, avoiding the need to search
- through the all_segs list. */
-static struct hash_control *all_segs_hash;
static struct line_seg **last_seg_ptr;
struct file_entry {
@@ -248,17 +245,9 @@ generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
static struct line_subseg *
get_line_subseg (segT seg, subsegT subseg, bfd_boolean create_p)
{
- static segT last_seg;
- static subsegT last_subseg;
- static struct line_subseg *last_line_subseg;
-
- struct line_seg *s;
+ struct line_seg *s = seg_info (seg)->dwarf2_line_seg;
struct line_subseg **pss, *lss;
- if (seg == last_seg && subseg == last_subseg)
- return last_line_subseg;
-
- s = (struct line_seg *) hash_find (all_segs_hash, seg->name);
if (s == NULL)
{
if (!create_p)
@@ -270,7 +259,7 @@ get_line_subseg (segT seg, subsegT subseg, bfd_boolean create_p)
s->head = NULL;
*last_seg_ptr = s;
last_seg_ptr = &s->next;
- hash_insert (all_segs_hash, seg->name, s);
+ seg_info (seg)->dwarf2_line_seg = s;
}
gas_assert (seg == s->seg);
@@ -291,10 +280,6 @@ get_line_subseg (segT seg, subsegT subseg, bfd_boolean create_p)
*pss = lss;
found_subseg:
- last_seg = seg;
- last_subseg = subseg;
- last_line_subseg = lss;
-
return lss;
}
@@ -1847,7 +1832,6 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg)
void
dwarf2_init (void)
{
- all_segs_hash = hash_new ();
last_seg_ptr = &all_segs;
}
diff --git a/gas/subsegs.h b/gas/subsegs.h
index e3ba8c7..8b2fd09 100644
--- a/gas/subsegs.h
+++ b/gas/subsegs.h
@@ -90,6 +90,9 @@ typedef struct segment_info_struct {
this section. sym->bsym and bfd_section->symbol should be the same. */
symbolS *sym;
+ /* Used by dwarf2dbg.c for this section's line table entries. */
+ void *dwarf2_line_seg;
+
union {
/* Current size of section holding stabs strings. */
unsigned long stab_string_size;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index e740c02..5d74cea 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-09-27 Alan Modra <amodra@gmail.com>
+
+ * gas/elf/group2.d, * gas/elf/group2.s: New test.
+ * gas/elf/elf.exp: Run it.
+
2014-09-23 H.J. Lu <hongjiu.lu@intel.com>
PR gas/17421
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index f17f7e0..af5dbb2 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -110,6 +110,7 @@ if { [is_elf_format] } then {
run_dump_test "group0c"
run_dump_test "group1a"
run_dump_test "group1b"
+ run_dump_test "group2"
case $target_triplet in {
{ hppa64*-*-hpux* } { }
default {
diff --git a/gas/testsuite/gas/elf/group2.d b/gas/testsuite/gas/elf/group2.d
new file mode 100644
index 0000000..1cea13c
--- /dev/null
+++ b/gas/testsuite/gas/elf/group2.d
@@ -0,0 +1,12 @@
+#readelf: -SW
+#name: debug info in group section and non-group section with same name
+#source: group2.s
+# The RX port uses non-standard section names.
+#not-target: rx-*
+
+#...
+[ ]*\[.*\][ ]+\.group[ ]+GROUP.*
+#...
+[ ]*\[.*\][ ]+\.text\.startup[ ]+PROGBITS.*[ ]+AXG[ ]+.*
+[ ]*\[.*\][ ]+\.text\.startup[ ]+PROGBITS.*[ ]+AX[ ]+.*
+#pass
diff --git a/gas/testsuite/gas/elf/group2.s b/gas/testsuite/gas/elf/group2.s
new file mode 100644
index 0000000..1e1c951
--- /dev/null
+++ b/gas/testsuite/gas/elf/group2.s
@@ -0,0 +1,9 @@
+ .file 1 "test.c"
+
+ .section .text.startup,"axG",%progbits,test,comdat
+ .loc 1 1
+ .org 8
+
+ .section .text.startup,"ax",%progbits
+ .loc 1 1
+ .org 8