* config/xtensa-istack.h (tinsn_struct): Replace linenum field
authorBob Wilson <bob.wilson@acm.org>
Mon, 19 Nov 2007 19:40:55 +0000 (19:40 +0000)
committerBob Wilson <bob.wilson@acm.org>
Mon, 19 Nov 2007 19:40:55 +0000 (19:40 +0000)
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.

gas/ChangeLog
gas/config/tc-xtensa.c
gas/config/xtensa-istack.h

index 52c09f25666d515eb178307ba5368e071b753804..a0808a784ce9283a5e126d3c7f5068b73f8b39fe 100644 (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.
index 2fd11b1e8fb15d83799c0ee01ddaeb0909067688..1170bb91d0119f60ce7352d27a993aefd1c3f1c4 100644 (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;
index 2f37765c677942e29e62eac833cddd6238605e43..0bd0974e5ea173d0e35ca24d2bf198f81ad936b0 100644 (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;