This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
fix Xtensa assembler line numbers
- From: Bob Wilson <bwilson at tensilica dot com>
- To: binutils at sources dot redhat dot com
- Date: Mon, 17 Oct 2005 11:16:29 -0700
- Subject: fix Xtensa assembler line numbers
The recent changes to the ".loc" directive exposed some problems in the Xtensa
port of GAS. Because some Xtensa configurations allow multi-line VLIW
instructions, we had been wrapping the dwarf2_directive_loc and dwarf2_emit_insn
functions to set the line numbers to the first line of each instruction. That
was a pretty bad hack, and it didn't really work anymore. This patch removes
that hack and replaces it with a (hopefully) simpler one. We just record the
line numbers while parsing the Xtensa instructions, and then use
new_logical_line to temporarily change the line number before calling
dwarf2_emit_insn. Tested with an xtensa-elf target and committed on the mainline.
2005-10-17 Bob Wilson <bob.wilson@acm.org>
* config/xtensa-istack.h (TInsn): Replace dwarf2_line_info with an
unsigned line number. Do not include "dwarf2dbg.h".
* config/tc-xtensa.c (md_pseudo_table): Remove entry for "loc".
(xtensa_dwarf2_directive_loc, xtensa_dwarf2_emit_insn): Delete.
(xg_build_to_insn, xg_build_token_insn): Update TInsn uses.
(md_assemble): Use as_where instead of dwarf2_where.
(xg_assemble_vliw_tokens): Use unsigned line numbers instead of
dwarf2_line_infos. Change to call new_logical_line followed by
dwarf2_emit_insn.
Index: config/xtensa-istack.h
===================================================================
RCS file: /cvs/src/src/gas/config/xtensa-istack.h,v
retrieving revision 1.5
diff -u -p -r1.5 xtensa-istack.h
--- config/xtensa-istack.h 6 May 2005 21:27:47 -0000 1.5
+++ config/xtensa-istack.h 14 Oct 2005 19:10:44 -0000
@@ -21,7 +21,6 @@
#ifndef XTENSA_ISTACK_H
#define XTENSA_ISTACK_H
-#include "dwarf2dbg.h"
#include "xtensa-isa.h"
#define MAX_ISTACK 12
@@ -47,7 +46,7 @@ typedef struct tinsn_struct
bfd_boolean keep_wide;
int ntok;
expressionS tok[MAX_INSN_ARGS];
- struct dwarf2_line_info loc;
+ unsigned linenum;
struct fixP *fixup;
Index: config/tc-xtensa.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-xtensa.c,v
retrieving revision 1.46
diff -u -p -r1.46 tc-xtensa.c
--- config/tc-xtensa.c 30 Sep 2005 21:58:28 -0000 1.46
+++ config/tc-xtensa.c 14 Oct 2005 19:10:44 -0000
@@ -422,7 +422,6 @@ bfd_boolean directive_state[] =
static void xtensa_begin_directive (int);
static void xtensa_end_directive (int);
-static void xtensa_dwarf2_directive_loc (int);
static void xtensa_literal_prefix (char const *, int);
static void xtensa_literal_position (int);
static void xtensa_literal_pseudo (int);
@@ -1016,7 +1015,6 @@ const pseudo_typeS md_pseudo_table[] =
{ "short", xtensa_elf_cons, 2 },
{ "begin", xtensa_begin_directive, 0 },
{ "end", xtensa_end_directive, 0 },
- { "loc", xtensa_dwarf2_directive_loc, 0 },
{ "literal", xtensa_literal_pseudo, 0 },
{ "frequency", xtensa_frequency_pseudo, 0 },
{ NULL, 0, 0 },
@@ -1385,28 +1383,6 @@ xtensa_end_directive (int ignore ATTRIBU
}
-/* Wrap dwarf2 functions so that we correctly support the .loc directive. */
-
-static bfd_boolean xtensa_loc_directive_seen = FALSE;
-
-static void
-xtensa_dwarf2_directive_loc (int x)
-{
- xtensa_loc_directive_seen = TRUE;
- dwarf2_directive_loc (x);
-}
-
-
-static void
-xtensa_dwarf2_emit_insn (int size, struct dwarf2_line_info *loc)
-{
- if (debug_type != DEBUG_DWARF2 && ! xtensa_loc_directive_seen)
- return;
- xtensa_loc_directive_seen = FALSE;
- dwarf2_gen_line_info (frag_now_fix () - size, loc);
-}
-
-
/* Place an aligned literal fragment at the current location. */
static void
@@ -3348,7 +3324,7 @@ xg_build_to_insn (TInsn *targ, TInsn *in
symbolS *sym;
memset (targ, 0, sizeof (TInsn));
- targ->loc = insn->loc;
+ targ->linenum = insn->linenum;
switch (bi->typ)
{
case INSTR_INSTR:
@@ -3804,13 +3780,13 @@ xg_build_token_insn (BuildInstr *instr_s
new_insn->insn_type = ITYPE_INSN;
new_insn->opcode = instr_spec->opcode;
new_insn->is_specific_opcode = FALSE;
- new_insn->loc = old_insn->loc;
+ new_insn->linenum = old_insn->linenum;
break;
case INSTR_LITERAL_DEF:
new_insn->insn_type = ITYPE_LITERAL;
new_insn->opcode = XTENSA_UNDEFINED;
new_insn->is_specific_opcode = FALSE;
- new_insn->loc = old_insn->loc;
+ new_insn->linenum = old_insn->linenum;
break;
case INSTR_LABEL_DEF:
as_bad (_("INSTR_LABEL_DEF not supported yet"));
@@ -5185,7 +5161,7 @@ void
md_assemble (char *str)
{
xtensa_isa isa = xtensa_default_isa;
- char *opname;
+ char *opname, *file_name;
unsigned opnamelen;
bfd_boolean has_underbar = FALSE;
char *arg_strings[MAX_INSN_ARGS];
@@ -5274,7 +5250,11 @@ md_assemble (char *str)
return;
}
- dwarf2_where (&orig_insn.loc);
+ /* A FLIX bundle may be spread across multiple input lines. We want to
+ report the first such line in the debug information. Record the line
+ number for each TInsn (assume the file name doesn't change), so the
+ first line can be found later. */
+ as_where (&file_name, &orig_insn.linenum);
xg_add_branch_and_loop_targets (&orig_insn);
@@ -6672,9 +6652,10 @@ xg_assemble_vliw_tokens (vliw_insn *vins
int extra_space;
char *f = NULL;
int slot;
- struct dwarf2_line_info best_loc;
+ unsigned current_line, best_linenum;
+ char *current_file;
- best_loc.line = INT_MAX;
+ best_linenum = UINT_MAX;
if (generating_literals)
{
@@ -6736,8 +6717,8 @@ xg_assemble_vliw_tokens (vliw_insn *vins
record_alignment (now_seg, 2);
/* Also determine the best line number for debug info. */
- best_loc = vinsn->slots[i].loc.line < best_loc.line
- ? vinsn->slots[i].loc : best_loc;
+ best_linenum = vinsn->slots[i].linenum < best_linenum
+ ? vinsn->slots[i].linenum : best_linenum;
}
/* Special cases for instructions that force an alignment... */
@@ -6805,7 +6786,12 @@ xg_assemble_vliw_tokens (vliw_insn *vins
xtensa_insnbuf_to_chars (isa, vinsn->insnbuf, (unsigned char *) f, 0);
- xtensa_dwarf2_emit_insn (insn_size + extra_space, &best_loc);
+ /* Temporarily set the logical line number to the one we want to appear
+ in the debug information. */
+ as_where (¤t_file, ¤t_line);
+ new_logical_line (current_file, best_linenum);
+ dwarf2_emit_insn (insn_size + extra_space);
+ new_logical_line (current_file, current_line);
for (slot = 0; slot < vinsn->num_slots; slot++)
{