Fix dwarf2_emit_insn calls when frag_var breaks things.
authorAlan Modra <amodra@gmail.com>
Wed, 16 May 2001 01:08:21 +0000 (01:08 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 16 May 2001 01:08:21 +0000 (01:08 +0000)
Put back an old entry in ChangeLog-9899, deleted when ChangeLog split.

gas/ChangeLog
gas/ChangeLog-9899
gas/config/tc-arc.c
gas/config/tc-i386.c
gas/config/tc-v850.c

index 916bca24aed7a31ec77632855ca7075155f402cf..bb2f95db1cb3e9fcb050b1279b170e50d1bb8e56 100644 (file)
@@ -1,3 +1,12 @@
+2001-05-16  Alan Modra  <amodra@one.net.au>
+
+       * config/tc-arc.c (md_assemble): Correct dwarf2_emit_insn param
+       for 8 byte insns.
+       * config/tc-i386.c (md_assemble): Call dwarf2_emit_insn before
+       opcodes are output rather than after.  Delete insn_size.
+       * config/tc-v850.c (md_assemble): Similarly, but delete
+       total_insn_size.
+
 2001-05-14  Richard Henderson  <rth@redhat.com>
 
        * ehopt.c (eh_frame_convert_frag): Fix missed subtype adjustment
index b71f2094e489e9d5f03adcae830e31bec51a3a96..c2e4d897aa0ac15bfc9add79c504c546e98863d1 100644 (file)
@@ -1,3 +1,9 @@
+1999-12-27  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * config/tc-i386.c (MATCH): Relax JumpAbsolute check.  Emit a
+       warning for absolute jump/call without `*' in non-intel mode.  No
+       need to set i.types[0] JumpAbsolute in intel mode.
+
 1999-12-22  Philip Blundell  <pb@futuretv.com>
 
        * config/tc-arm.c (arm_s_text): If OBJ_ELF, call the appropriate
index 3cbd3c018e0d89d7a403f4f4c6c65df07a8a73a4..730cfc6767ab3d81283e0c503cb3d49215596500 100644 (file)
@@ -806,6 +806,7 @@ md_assemble (str)
              f = frag_more (8);
              md_number_to_chars (f, insn, 4);
              md_number_to_chars (f + 4, limm, 4);
+             dwarf2_emit_insn (8);
            }
          else if (limm_reloc_p)
            {
@@ -816,6 +817,7 @@ md_assemble (str)
            {
              f = frag_more (4);
              md_number_to_chars (f, insn, 4);
+             dwarf2_emit_insn (4);
            }
 
          /* Create any fixups.  */
@@ -870,8 +872,6 @@ md_assemble (str)
                           (bfd_reloc_code_real_type) reloc_type);
            }
 
-         dwarf2_emit_insn (4);
-
          /* All done.  */
          return;
        }
index 57b9b0fd03d6a6ffbce1f48c38b26891fc1e54c1..a710532500a765d058d27ea413f770a76ea2fde2 100644 (file)
@@ -1231,10 +1231,6 @@ md_assemble (line)
   /* Points to template once we've found it.  */
   const template *t;
 
-  /* Count the size of the instruction generated.  Does not include
-     variable part of jump insns before relax.  */
-  int insn_size = 0;
-
   int j;
 
   char mnemonic[MAX_MNEM_SIZE];
@@ -2702,6 +2698,11 @@ md_assemble (line)
   {
     register char *p;
 
+    /* Tie dwarf2 debug info to the address at the start of the insn.
+       We can't do this after the insn has been output as the current
+       frag may have been closed off.  eg. by frag_var.  */
+    dwarf2_emit_insn (0);
+
     /* Output jumps.  */
     if (i.tm.opcode_modifier & Jump)
       {
@@ -2734,7 +2735,6 @@ md_assemble (line)
           bytes for the opcode and room for the prefix and largest
           displacement.  */
        frag_grow (prefix + 2 + 4);
-       insn_size += prefix + 1;
        /* Prefix and 1 opcode byte go in fr_fix.  */
        p = frag_more (prefix + 1);
        if (i.prefix[DATA_PREFIX])
@@ -2766,7 +2766,6 @@ md_assemble (line)
            size = 1;
            if (i.prefix[ADDR_PREFIX])
              {
-               insn_size += 1;
                FRAG_APPEND_1_CHAR (ADDR_PREFIX_OPCODE);
                i.prefixes -= 1;
              }
@@ -2781,7 +2780,6 @@ md_assemble (line)
 
            if (i.prefix[DATA_PREFIX])
              {
-               insn_size += 1;
                FRAG_APPEND_1_CHAR (DATA_PREFIX_OPCODE);
                i.prefixes -= 1;
                code16 ^= CODE16;
@@ -2795,7 +2793,6 @@ md_assemble (line)
        if (i.prefix[REX_PREFIX])
          {
            FRAG_APPEND_1_CHAR (i.prefix[REX_PREFIX]);
-           insn_size++;
            i.prefixes -= 1;
          }
 
@@ -2804,13 +2801,11 @@ md_assemble (line)
 
        if (fits_in_unsigned_byte (i.tm.base_opcode))
          {
-           insn_size += 1 + size;
            p = frag_more (1 + size);
          }
        else
          {
            /* Opcode can be at most two bytes.  */
-           insn_size += 2 + size;
            p = frag_more (2 + size);
            *p++ = (i.tm.base_opcode >> 8) & 0xff;
          }
@@ -2850,7 +2845,6 @@ md_assemble (line)
          as_warn (_("skipping prefixes on this instruction"));
 
        /* 1 opcode; 2 segment; offset  */
-       insn_size += prefix + 1 + 2 + size;
        p = frag_more (prefix + 1 + 2 + size);
 
        if (i.prefix[DATA_PREFIX])
@@ -2898,7 +2892,6 @@ md_assemble (line)
          {
            if (*q)
              {
-               insn_size += 1;
                p = frag_more (1);
                md_number_to_chars (p, (valueT) *q, 1);
              }
@@ -2907,12 +2900,10 @@ md_assemble (line)
        /* Now the opcode; be careful about word order here!  */
        if (fits_in_unsigned_byte (i.tm.base_opcode))
          {
-           insn_size += 1;
            FRAG_APPEND_1_CHAR (i.tm.base_opcode);
          }
        else
          {
-           insn_size += 2;
            p = frag_more (2);
            /* Put out high byte first: can't use md_number_to_chars!  */
            *p++ = (i.tm.base_opcode >> 8) & 0xff;
@@ -2922,7 +2913,6 @@ md_assemble (line)
        /* Now the modrm byte and sib byte (if present).  */
        if (i.tm.opcode_modifier & Modrm)
          {
-           insn_size += 1;
            p = frag_more (1);
            md_number_to_chars (p,
                                (valueT) (i.rm.regmem << 0
@@ -2937,7 +2927,6 @@ md_assemble (line)
                && i.rm.mode != 3
                && !(i.base_reg && (i.base_reg->reg_type & Reg16) != 0))
              {
-               insn_size += 1;
                p = frag_more (1);
                md_number_to_chars (p,
                                    (valueT) (i.sib.base << 0
@@ -2971,7 +2960,6 @@ md_assemble (line)
                          }
                        val = offset_in_range (i.op[n].disps->X_add_number,
                                               size);
-                       insn_size += size;
                        p = frag_more (size);
                        md_number_to_chars (p, val, size);
                      }
@@ -3018,7 +3006,6 @@ md_assemble (line)
                              size = 8;
                          }
 
-                       insn_size += size;
                        p = frag_more (size);
                        fix_new_exp (frag_now, p - frag_now->fr_literal, size,
                                     i.op[n].disps, pcrel,
@@ -3053,7 +3040,6 @@ md_assemble (line)
                          }
                        val = offset_in_range (i.op[n].imms->X_add_number,
                                               size);
-                       insn_size += size;
                        p = frag_more (size);
                        md_number_to_chars (p, val, size);
                      }
@@ -3079,7 +3065,6 @@ md_assemble (line)
                              size = 8;
                          }
 
-                       insn_size += size;
                        p = frag_more (size);
                        reloc_type = reloc (size, 0, sign, i.reloc[n]);
 #ifdef BFD_ASSEMBLER
@@ -3107,8 +3092,6 @@ md_assemble (line)
          }
       }
 
-    dwarf2_emit_insn (insn_size);
-
 #ifdef DEBUG386
     if (flag_debug)
       {
index 89f4b987899209b995dd4553a80074789731361e..ef22afe7742b8f142dc936fe3e051657b50f2413 100644 (file)
@@ -1699,7 +1699,6 @@ md_assemble (str)
   int relaxable = 0;
   unsigned long insn;
   unsigned long insn_size;
-  unsigned long total_insn_size = 0;
   char *f;
   int i;
   int match;
@@ -2150,6 +2149,11 @@ md_assemble (str)
 
   input_line_pointer = str;
 
+  /* Tie dwarf2 debug info to the address at the start of the insn.
+     We can't do this after the insn has been output as the current
+     frag may have been closed off.  eg. by frag_var.  */
+  dwarf2_emit_insn (0);
+
   /* Write out the instruction.  */
 
   if (relaxable && fc > 0)
@@ -2175,7 +2179,6 @@ md_assemble (str)
          md_number_to_chars (f, insn, insn_size);
          md_number_to_chars (f + 2, 0, 4);
        }
-      total_insn_size = insn_size;
     }
   else
     {
@@ -2190,15 +2193,11 @@ md_assemble (str)
        insn_size = 2;
 
       f = frag_more (insn_size);
-      total_insn_size = insn_size;
-
       md_number_to_chars (f, insn, insn_size);
 
       if (extra_data_after_insn)
        {
          f = frag_more (extra_data_len);
-         total_insn_size += extra_data_len;
-
          md_number_to_chars (f, extra_data, extra_data_len);
 
          extra_data_after_insn = false;
@@ -2271,8 +2270,6 @@ md_assemble (str)
     }
 
   input_line_pointer = saved_input_line_pointer;
-
-  dwarf2_emit_insn (total_insn_size);
 }
 
 /* If while processing a fixup, a reloc really needs to be created