diff options
author | Bob Wilson <bob.wilson@acm.org> | 2007-11-19 19:40:55 +0000 |
---|---|---|
committer | Bob Wilson <bob.wilson@acm.org> | 2007-11-19 19:40:55 +0000 |
commit | b224e962a8c9617f9b04f07393c70776b8edb9b2 (patch) | |
tree | ed4109f0381ed0054fc2cde3901c1b98b144ea70 /gas/config/tc-xtensa.c | |
parent | 1eee4adcdbd8631ec670405f6d61ada09164de5d (diff) | |
download | fsf-binutils-gdb-b224e962a8c9617f9b04f07393c70776b8edb9b2.zip fsf-binutils-gdb-b224e962a8c9617f9b04f07393c70776b8edb9b2.tar.gz fsf-binutils-gdb-b224e962a8c9617f9b04f07393c70776b8edb9b2.tar.bz2 |
* 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.
Diffstat (limited to 'gas/config/tc-xtensa.c')
-rw-r--r-- | gas/config/tc-xtensa.c | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index 2fd11b1..1170bb9 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -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 (¤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); + 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; |