summaryrefslogtreecommitdiff
path: root/gas/dwarf2dbg.c
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@nildram.co.uk>2013-06-14 13:24:40 +0000
committerRichard Sandiford <rsandifo@nildram.co.uk>2013-06-14 13:24:40 +0000
commit3295a35cc0ce621849ce3910bd23f8923bf9ebed (patch)
treebeb9bdc1c898830149b761aecbbc1d9e63460673 /gas/dwarf2dbg.c
parent607da17a596d0b5e64885919a43eb41b04d24102 (diff)
downloadbinutils-redhat-3295a35cc0ce621849ce3910bd23f8923bf9ebed.tar.gz
gas/
Revert: 2011-09-05 Richard Sandiford <rdsandiford@googlemail.com> PR gas/13024 * dwarf2dbg.c (pending_lines, pending_lines_tail): New variables. (dwarf2_gen_line_info_1): Delete. (dwarf2_push_line, dwarf2_flush_pending_lines): New functions. (dwarf2_gen_line_info, dwarf2_emit_label): Use them. (dwarf2_consume_line_info): Call dwarf2_flush_pending_lines. (dwarf2_directive_loc): Push previous .locs instead of generating them immediately.
Diffstat (limited to 'gas/dwarf2dbg.c')
-rw-r--r--gas/dwarf2dbg.c61
1 files changed, 14 insertions, 47 deletions
diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
index df93bac2c7..f5623f6c5a 100644
--- a/gas/dwarf2dbg.c
+++ b/gas/dwarf2dbg.c
@@ -216,10 +216,6 @@ static struct dwarf2_line_info current = {
0
};
-/* Lines that are at the same location as CURRENT, and which are waiting
- for a label. */
-static struct line_entry *pending_lines, **pending_lines_tail = &pending_lines;
-
/* The size of an address on the target. */
static unsigned int sizeof_address;
@@ -293,47 +289,22 @@ get_line_subseg (segT seg, subsegT subseg)
return lss;
}
-/* Push LOC onto the pending lines list. */
+/* Record an entry for LOC occurring at LABEL. */
static void
-dwarf2_push_line (struct dwarf2_line_info *loc)
+dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc)
{
+ struct line_subseg *lss;
struct line_entry *e;
e = (struct line_entry *) xmalloc (sizeof (*e));
e->next = NULL;
- e->label = NULL;
+ e->label = label;
e->loc = *loc;
- *pending_lines_tail = e;
- pending_lines_tail = &(*pending_lines_tail)->next;
-}
-
-/* Emit all pending line information. LABEL is the label with which the
- lines should be associated, or null if they should be associated with
- the current position. */
-
-static void
-dwarf2_flush_pending_lines (symbolS *label)
-{
- if (pending_lines)
- {
- struct line_subseg *lss;
- struct line_entry *e;
-
- if (!label)
- label = symbol_temp_new_now ();
-
- for (e = pending_lines; e; e = e->next)
- e->label = label;
-
- lss = get_line_subseg (now_seg, now_subseg);
- *lss->ptail = pending_lines;
- lss->ptail = pending_lines_tail;
-
- pending_lines = NULL;
- pending_lines_tail = &pending_lines;
- }
+ lss = get_line_subseg (now_seg, now_subseg);
+ *lss->ptail = e;
+ lss->ptail = &e->next;
}
/* Record an entry for LOC occurring at OFS within the current fragment. */
@@ -344,6 +315,8 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
static unsigned int line = -1;
static unsigned int filenum = -1;
+ symbolS *sym;
+
/* Early out for as-yet incomplete location information. */
if (loc->filenum == 0 || loc->line == 0)
return;
@@ -359,7 +332,6 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
line = loc->line;
filenum = loc->filenum;
- dwarf2_push_line (loc);
if (linkrelax)
{
char name[120];
@@ -367,10 +339,11 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
/* Use a non-fake name for the line number location,
so that it can be referred to by relocations. */
sprintf (name, ".Loc.%u.%u", line, filenum);
- dwarf2_flush_pending_lines (symbol_new (name, now_seg, ofs, frag_now));
+ sym = symbol_new (name, now_seg, ofs, frag_now);
}
else
- dwarf2_flush_pending_lines (symbol_temp_new (now_seg, ofs, frag_now));
+ sym = symbol_temp_new (now_seg, ofs, frag_now);
+ dwarf2_gen_line_info_1 (sym, loc);
}
/* Returns the current source information. If .file directives have
@@ -431,11 +404,6 @@ dwarf2_emit_insn (int size)
void
dwarf2_consume_line_info (void)
{
- /* If the consumer has stashed the current location away for later use,
- assume that any earlier location information should be associated
- with ".". */
- dwarf2_flush_pending_lines (NULL);
-
/* Unless we generate DWARF2 debugging information for each
assembler line, we only emit one line symbol for one LOC. */
dwarf2_loc_directive_seen = FALSE;
@@ -467,8 +435,7 @@ dwarf2_emit_label (symbolS *label)
loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
- dwarf2_push_line (&loc);
- dwarf2_flush_pending_lines (label);
+ dwarf2_gen_line_info_1 (label, &loc);
dwarf2_consume_line_info ();
}
@@ -628,7 +595,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
/* If we see two .loc directives in a row, force the first one to be
output now. */
if (dwarf2_loc_directive_seen)
- dwarf2_push_line (&current);
+ dwarf2_emit_insn (0);
filenum = get_absolute_expression ();
SKIP_WHITESPACE ();