diff --git a/gas/ChangeLog b/gas/ChangeLog index 7471e5389e..ec11c63477 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2014-09-27 Alan Modra + + * 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 PR gas/17421 diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index 5cc466237c..3067b8c24b 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 e3ba8c7027..8b2fd098ae 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 e740c02a4e..5d74ceaace 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-09-27 Alan Modra + + * gas/elf/group2.d, * gas/elf/group2.s: New test. + * gas/elf/elf.exp: Run it. + 2014-09-23 H.J. Lu PR gas/17421 diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp index f17f7e00b3..af5dbb2a6a 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 0000000000..1cea13c97e --- /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 0000000000..1e1c951926 --- /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