* config/xtensa-istack.h (tinsn_struct): Replace linenum field

with loc_directive_seen and debug_line.
	* config/tc-xtensa.c: Include xtensa-istack.h after dwarf2dbg.h.
	(xg_build_to_insn): Copy the new fields instead of linenum.
	(xg_build_token_insn): Likewise.  Abort on INSTR_LABEL_DEF and move
	common code out of the switch.
	(md_assemble): Set new tinsn fields from DWARF information.  Call
	dwarf2_consume_line_info.
	(xg_assemble_vliw_tokens): Update the code to select the "best" line
	number to use new information.  Call dwarf2_gen_line_info instead
	of dwarf2_emit_insn.
This commit is contained in:
Bob Wilson 2007-11-19 19:40:55 +00:00
parent 1eee4adcdb
commit b224e962a8
3 changed files with 50 additions and 31 deletions

View File

@ -1,3 +1,17 @@
2007-11-19 Bob Wilson <bob.wilson@acm.org>
* config/xtensa-istack.h (tinsn_struct): Replace linenum field
with loc_directive_seen and debug_line.
* config/tc-xtensa.c: Include xtensa-istack.h after dwarf2dbg.h.
(xg_build_to_insn): Copy the new fields instead of linenum.
(xg_build_token_insn): Likewise. Abort on INSTR_LABEL_DEF and move
common code out of the switch.
(md_assemble): Set new tinsn fields from DWARF information. Call
dwarf2_consume_line_info.
(xg_assemble_vliw_tokens): Update the code to select the "best" line
number to use new information. Call dwarf2_gen_line_info instead
of dwarf2_emit_insn.
2007-11-19 Bob Wilson <bob.wilson@acm.org>
* dwarf2dbg.h (dwarf2_loc_directive_seen): New.

View File

@ -25,8 +25,8 @@
#include "tc-xtensa.h"
#include "subsegs.h"
#include "xtensa-relax.h"
#include "xtensa-istack.h"
#include "dwarf2dbg.h"
#include "xtensa-istack.h"
#include "struc-symbol.h"
#include "xtensa-config.h"
@ -3288,7 +3288,8 @@ xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
symbolS *sym;
tinsn_init (targ);
targ->linenum = insn->linenum;
targ->debug_line = insn->debug_line;
targ->loc_directive_seen = insn->loc_directive_seen;
switch (bi->typ)
{
case INSTR_INSTR:
@ -3766,19 +3767,17 @@ xg_build_token_insn (BuildInstr *instr_spec, TInsn *old_insn, TInsn *new_insn)
case INSTR_INSTR:
new_insn->insn_type = ITYPE_INSN;
new_insn->opcode = instr_spec->opcode;
new_insn->is_specific_opcode = FALSE;
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->linenum = old_insn->linenum;
break;
case INSTR_LABEL_DEF:
as_bad (_("INSTR_LABEL_DEF not supported yet"));
break;
abort ();
}
new_insn->is_specific_opcode = FALSE;
new_insn->debug_line = old_insn->debug_line;
new_insn->loc_directive_seen = old_insn->loc_directive_seen;
for (b_op = instr_spec->ops; b_op != NULL; b_op = b_op->next)
{
@ -5235,7 +5234,7 @@ void
md_assemble (char *str)
{
xtensa_isa isa = xtensa_default_isa;
char *opname, *file_name;
char *opname;
unsigned opnamelen;
bfd_boolean has_underbar = FALSE;
char *arg_strings[MAX_INSN_ARGS];
@ -5324,11 +5323,12 @@ md_assemble (char *str)
return;
}
/* 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);
/* Record the line number for each TInsn, because a FLIX bundle may be
spread across multiple input lines and individual instructions may be
moved around in some cases. */
orig_insn.loc_directive_seen = dwarf2_loc_directive_seen;
dwarf2_where (&orig_insn.debug_line);
dwarf2_consume_line_info ();
xg_add_branch_and_loop_targets (&orig_insn);
@ -6691,15 +6691,15 @@ xg_assemble_vliw_tokens (vliw_insn *vinsn)
bfd_boolean is_jump = FALSE;
bfd_boolean is_branch = FALSE;
xtensa_isa isa = xtensa_default_isa;
int i;
int insn_size;
int extra_space;
char *f = NULL;
int slot;
unsigned current_line, best_linenum;
char *current_file;
struct dwarf2_line_info debug_line;
bfd_boolean loc_directive_seen = FALSE;
TInsn *tinsn;
best_linenum = UINT_MAX;
memset (&debug_line, 0, sizeof (struct dwarf2_line_info));
if (generating_literals)
{
@ -6754,15 +6754,22 @@ xg_assemble_vliw_tokens (vliw_insn *vinsn)
xtensa_set_frag_assembly_state (frag_now);
}
for (i = 0; i < vinsn->num_slots; i++)
for (slot = 0; slot < vinsn->num_slots; slot++)
{
tinsn = &vinsn->slots[slot];
/* See if the instruction implies an aligned section. */
if (xtensa_opcode_is_loop (isa, vinsn->slots[i].opcode) == 1)
if (xtensa_opcode_is_loop (isa, tinsn->opcode) == 1)
record_alignment (now_seg, 2);
/* Also determine the best line number for debug info. */
best_linenum = vinsn->slots[i].linenum < best_linenum
? vinsn->slots[i].linenum : best_linenum;
/* Determine the best line number for debug info. */
if ((tinsn->loc_directive_seen || !loc_directive_seen)
&& (tinsn->debug_line.filenum != debug_line.filenum
|| tinsn->debug_line.line < debug_line.line
|| tinsn->debug_line.column < debug_line.column))
debug_line = tinsn->debug_line;
if (tinsn->loc_directive_seen)
loc_directive_seen = TRUE;
}
/* Special cases for instructions that force an alignment... */
@ -6833,16 +6840,13 @@ xg_assemble_vliw_tokens (vliw_insn *vinsn)
xtensa_insnbuf_to_chars (isa, vinsn->insnbuf, (unsigned char *) f, 0);
/* Temporarily set the logical line number to the one we want to appear
in the debug information. */
as_where (&current_file, &current_line);
new_logical_line (current_file, best_linenum);
dwarf2_emit_insn (insn_size + extra_space);
new_logical_line (current_file, current_line);
if (debug_type == DEBUG_DWARF2 || loc_directive_seen)
dwarf2_gen_line_info (frag_now_fix () - (insn_size + extra_space),
&debug_line);
for (slot = 0; slot < vinsn->num_slots; slot++)
{
TInsn *tinsn = &vinsn->slots[slot];
tinsn = &vinsn->slots[slot];
frag_now->tc_frag_data.slot_subtypes[slot] = tinsn->subtype;
frag_now->tc_frag_data.slot_symbols[slot] = tinsn->symbol;
frag_now->tc_frag_data.slot_offsets[slot] = tinsn->offset;

View File

@ -46,7 +46,8 @@ typedef struct tinsn_struct
bfd_boolean keep_wide;
int ntok;
expressionS tok[MAX_INSN_ARGS];
unsigned linenum;
bfd_boolean loc_directive_seen;
struct dwarf2_line_info debug_line;
/* Filled out by relaxation_requirements: */
enum xtensa_relax_statesE subtype;