Prepare for multi-pass relaxation.
authorAlan Modra <amodra@gmail.com>
Fri, 30 Mar 2001 00:06:10 +0000 (00:06 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 30 Mar 2001 00:06:10 +0000 (00:06 +0000)
gas/ChangeLog
gas/config/tc-cris.c
gas/config/tc-h8500.c
gas/config/tc-i386.c
gas/config/tc-mcore.c
gas/config/tc-mn10200.c
gas/config/tc-mn10300.c
gas/config/tc-ns32k.c
gas/config/tc-sh.c
gas/config/tc-w65.c

index 1d10694ddf8c40b08ce9cccba9f8f95e9391c372..71c790f52bb9cf1fb8413a3c61ff348416a7da68 100644 (file)
@@ -1,3 +1,25 @@
+2001-03-30  Alan Modra  <alan@linuxcare.com.au>
+
+       * config/tc-sh.c (md_estimate_size_before_relax): Add extra
+       do-nothing cases to switch to avoid abort on a second relaxation
+       pass, and tidy code a little.
+       * config/tc-cris.c (md_estimate_size_before_relax): Likewise.
+       * config/tc-h8500.c (md_estimate_size_before_relax): Likewise.
+       * config/tc-w65.c (md_estimate_size_before_relax): Likewise.
+       * config/tc-i386.c (UNCOND_JUMP, COND_JUMP, COND_JUMP86): Decrement.
+       (md_relax_table): Remove first four unused entries.  Increment
+       rlx_length by one throughout table, and update comments to suit.
+       (md_estimate_size_before_relax): Return size of current variable
+       part of frag to reflect reality when relaxing more than once.
+       * config/tc-mcore.c (COND12, UNCD12): Rename to DISP12 throughout.
+       (COND32, UNCD32): Rename to DISP32 throughout.
+       (UNDEF_WORD_DISP): Renumber to 3.
+       (md_estimate_size_before_relax): Add extra do-nothing cases.
+       * config/tc-mn10200.c (md_estimate_size_before_relax): Rewrite.
+       * config/tc-mn10300.c (md_estimate_size_before_relax): Rewrite.
+       * config/tc-ns32k.c (md_estimate_size_before_relax): Add cases to
+       handle word and dword branches.
+
 2001-03-29  Hans-Peter Nilsson  <hp@axis.com>
 
        * config/tc-cris.h (tc_fix_adjustable): Allow only
index 24fecfbf6395eb308aa01690f42733dbcafdf467..4fbc96a0a70e49856ae793fd1e4bd5d43b9f9779 100644 (file)
@@ -445,6 +445,11 @@ md_estimate_size_before_relax (fragP, segment_type)
        }
       break;
 
+    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_DWORD):
+      /* When relaxing a section for the second time, we don't need to
+        do anything.  */
+      break;
+
     default:
       BAD_CASE (fragP->fr_subtype);
     }
index 88ec02660a69192cd01d7e598712fef8fd07349e..7fe556e722831f07e5b7bb1f379e88bd4af631f9 100644 (file)
@@ -1,5 +1,6 @@
 /* tc-h8500.c -- Assemble code for the Hitachi H8/500
-   Copyright 1993, 1994, 1995, 1998, 2000 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1998, 2000, 2001
+   Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -1447,6 +1448,7 @@ md_estimate_size_before_relax (fragP, segment_type)
     {
     default:
       abort ();
+
     case C (BRANCH, UNDEF_BYTE_DISP):
     case C (SCB_F, UNDEF_BYTE_DISP):
     case C (SCB_TST, UNDEF_BYTE_DISP):
@@ -1464,8 +1466,18 @@ md_estimate_size_before_relax (fragP, segment_type)
              long.  */
          fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
          fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length;
-         return md_relax_table[C (what, WORD_DISP)].rlx_length;
        }
+      break;
+
+    case C (BRANCH, BYTE_DISP):
+    case C (BRANCH, UNDEF_WORD_DISP):
+    case C (SCB_F, BYTE_DISP):
+    case C (SCB_F, UNDEF_WORD_DISP):
+    case C (SCB_TST, BYTE_DISP):
+    case C (SCB_TST, UNDEF_WORD_DISP):
+      /* When relaxing a section for the second time, we don't need to
+        do anything.  */
+      break;
     }
   return fragP->fr_var;
 }
index 843db1fdb5f2c738574f2a703d7570d31acb3bdd..69dd6c0c95afd3a6ab136a4cd78e7569dd90ce77 100644 (file)
@@ -284,9 +284,9 @@ static unsigned int no_cond_jump_promotion = 0;
    figuring out what sort of jump to choose to reach a given label.  */
 
 /* Types.  */
-#define UNCOND_JUMP 1
-#define COND_JUMP 2
-#define COND_JUMP86 3
+#define UNCOND_JUMP 0
+#define COND_JUMP 1
+#define COND_JUMP86 2
 
 /* Sizes.  */
 #define CODE16 1
@@ -323,42 +323,38 @@ const relax_typeS md_relax_table[] =
   /* The fields are:
      1) most positive reach of this state,
      2) most negative reach of this state,
-     3) how many bytes this mode will add to the size of the current frag
+     3) how many bytes this mode will have in the variable part of the frag
      4) which index into the table to try if we can't fit into this one.  */
-  {1, 1, 0, 0},
-  {1, 1, 0, 0},
-  {1, 1, 0, 0},
-  {1, 1, 0, 0},
 
   /* UNCOND_JUMP states.  */
-  {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
-  {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
-  /* dword jmp adds 3 bytes to frag:
-     0 extra opcode bytes, 3 extra displacement bytes.  */
-  {0, 0, 3, 0},
-  /* word jmp adds 1 byte to frag:
-     0 extra opcode bytes, 1 extra displacement byte.  */
-  {0, 0, 1, 0},
-
-  /* COND_JUMP states.  */
-  {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
-  {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
-  /* dword conditionals adds 4 bytes to frag:
-     1 extra opcode byte, 3 extra displacement bytes.  */
+  {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG)},
+  {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (UNCOND_JUMP, BIG16)},
+  /* dword jmp adds 4 bytes to frag:
+     0 extra opcode bytes, 4 displacement bytes.  */
   {0, 0, 4, 0},
-  /* word conditionals add 2 bytes to frag:
-     1 extra opcode byte, 1 extra displacement byte.  */
+  /* word jmp adds 2 byte2 to frag:
+     0 extra opcode bytes, 2 displacement bytes.  */
   {0, 0, 2, 0},
 
-  /* COND_JUMP86 states.  */
-  {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
-  {127 + 1, -128 + 1, 0, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
-  /* dword conditionals adds 4 bytes to frag:
-     1 extra opcode byte, 3 extra displacement bytes.  */
-  {0, 0, 4, 0},
+  /* COND_JUMP states.  */
+  {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG)},
+  {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP, BIG16)},
+  /* dword conditionals adds 5 bytes to frag:
+     1 extra opcode byte, 4 displacement bytes.  */
+  {0, 0, 5, 0},
   /* word conditionals add 3 bytes to frag:
-     1 extra opcode byte, 2 extra displacement bytes.  */
-  {0, 0, 3, 0}
+     1 extra opcode byte, 2 displacement bytes.  */
+  {0, 0, 3, 0},
+
+  /* COND_JUMP86 states.  */
+  {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG)},
+  {127 + 1, -128 + 1, 1, ENCODE_RELAX_STATE (COND_JUMP86, BIG16)},
+  /* dword conditionals adds 5 bytes to frag:
+     1 extra opcode byte, 4 displacement bytes.  */
+  {0, 0, 5, 0},
+  /* word conditionals add 4 bytes to frag:
+     1 displacement byte and a 3 byte long branch insn.  */
+  {0, 0, 4, 0}
 };
 
 static const arch_entry cpu_arch[] = {
@@ -3971,7 +3967,8 @@ md_estimate_size_before_relax (fragP, segment)
 
        case COND_JUMP86:
          if (no_cond_jump_promotion)
-           return 1;
+           goto relax_guess;
+
          if (size == 2)
            {
              /* Negate the condition, and branch past an
@@ -3993,7 +3990,8 @@ md_estimate_size_before_relax (fragP, segment)
 
        case COND_JUMP:
          if (no_cond_jump_promotion)
-           return 1;
+           goto relax_guess;
+
          /* This changes the byte-displacement jump 0x7N
             to the (d)word-displacement jump 0x0f,0x8N.  */
          opcode[1] = opcode[0] + 0x10;
@@ -4013,8 +4011,15 @@ md_estimate_size_before_relax (fragP, segment)
       frag_wane (fragP);
       return fragP->fr_fix - old_fr_fix;
     }
-  /* Guess a short jump.  */
-  return 1;
+
+ relax_guess:
+  /* Guess size depending on current relax state.  Initially the relax
+     state will correspond to a short jump and we return 1, because
+     the variable part of the frag (the branch offset) is one byte
+     long.  However, we can relax a section more than once and in that
+     case we must either set fr_subtype back to the unrelaxed state,
+     or return the value for the appropriate branch.  */
+  return md_relax_table[fragP->fr_subtype].rlx_length;
 }
 
 /* Called after relax() is finished.
index a7839f6b38809517f29d961ff28cd7e6cacc4f80..3238e66ec065b99f47495ec40c3fb9e6c9781ca9 100644 (file)
@@ -1,5 +1,5 @@
 /* tc-mcore.c -- Assemble code for M*Core
-   Copyright 1999, 2000 Free Software Foundation, Inc.
+   Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -92,12 +92,9 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
 #define UNCD_JUMP  2
 
 #define UNDEF_DISP      0
-#define COND12          1
-#define COND32          2
-#define UNCD12          1
-#define UNCD32          2
-#define UNDEF_WORD_DISP 4
-#define END             5
+#define DISP12          1
+#define DISP32          2
+#define UNDEF_WORD_DISP 3
 
 #define C12_LEN                2
 #define C32_LEN               10       /* allow for align */
@@ -121,14 +118,13 @@ const relax_typeS md_relax_table[] =
 {    1,     1,      0, 0 },                    /* 2: unused */
 {    1,     1,      0, 0 },                    /* 3: unused */
 {    1,     1,      0, 0 },                    /* 4: unused */
-{ 2048, -2046, C12_LEN, C(COND_JUMP, COND32) },        /* 5: C(COND_JUMP, COND12) */
-{    0,     0, C32_LEN, 0 },                   /* 6: C(COND_JUMP, COND32) */
+{ 2048, -2046, C12_LEN, C(COND_JUMP, DISP32) },        /* 5: C(COND_JUMP, DISP12) */
+{    0,     0, C32_LEN, 0 },                   /* 6: C(COND_JUMP, DISP32) */
 {    1,     1,      0, 0 },                    /* 7: unused */
 {    1,     1,      0, 0 },                    /* 8: unused */
-{ 2048, -2046, U12_LEN, C(UNCD_JUMP, UNCD32) },        /* 9: C(UNCD_JUMP, UNCD12) */
-{    0,     0, U32_LEN, 0 },                   /*10: C(UNCD_JUMP, UNCD32) */
+{ 2048, -2046, U12_LEN, C(UNCD_JUMP, DISP32) },        /* 9: C(UNCD_JUMP, DISP12) */
+{    0,     0, U32_LEN, 0 },                   /*10: C(UNCD_JUMP, DISP32) */
 {    1,     1,      0, 0 },                    /*11: unused */
-{    0,     0,      0, 0 }                     /*12: unused */
 };
 
 /* Literal pool data structures.  */
@@ -705,8 +701,8 @@ dump_literals (isforce)
       symbol_table_insert (brarsym);
 
       output = frag_var (rs_machine_dependent,
-                        md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length,
-                        md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length,
+                        md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length,
+                        md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length,
                         C (UNCD_JUMP, 0), brarsym, 0, 0);
       output[0] = INST_BYTE0 (MCORE_INST_BR);  /* br .+xxx */
       output[1] = INST_BYTE1 (MCORE_INST_BR);
@@ -1558,8 +1554,8 @@ md_assemble (str)
       op_end = input_line_pointer;
 
       output = frag_var (rs_machine_dependent,
-                        md_relax_table[C (COND_JUMP, COND32)].rlx_length,
-                        md_relax_table[C (COND_JUMP, COND12)].rlx_length,
+                        md_relax_table[C (COND_JUMP, DISP32)].rlx_length,
+                        md_relax_table[C (COND_JUMP, DISP12)].rlx_length,
                         C (COND_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
       isize = C32_LEN;
       break;
@@ -1569,8 +1565,8 @@ md_assemble (str)
       op_end = input_line_pointer;
 
       output = frag_var (rs_machine_dependent,
-                        md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length,
-                        md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length,
+                        md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length,
+                        md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length,
                         C (UNCD_JUMP, 0), e.X_add_symbol, e.X_add_number, 0);
       isize = U32_LEN;
       break;
@@ -1904,8 +1900,8 @@ md_convert_frag (abfd, sec, fragP)
 
   switch (fragP->fr_subtype)
     {
-    case C (COND_JUMP, COND12):
-    case C (UNCD_JUMP, UNCD12):
+    case C (COND_JUMP, DISP12):
+    case C (UNCD_JUMP, DISP12):
       {
        /* Get the address of the end of the instruction.  */
        int next_inst = fragP->fr_fix + fragP->fr_address + 2;
@@ -1939,7 +1935,7 @@ md_convert_frag (abfd, sec, fragP)
       }
       break;
 
-    case C (COND_JUMP, COND32):
+    case C (COND_JUMP, DISP32):
     case C (COND_JUMP, UNDEF_WORD_DISP):
       {
        /* A conditional branch wont fit into 12 bits so:
@@ -2031,7 +2027,7 @@ md_convert_frag (abfd, sec, fragP)
       }
       break;
 
-    case C (UNCD_JUMP, UNCD32):
+    case C (UNCD_JUMP, DISP32):
     case C (UNCD_JUMP, UNDEF_WORD_DISP):
       {
        /* An unconditional branch will not fit in 12 bits, make code which
@@ -2247,29 +2243,28 @@ md_estimate_size_before_relax (fragP, segment_type)
 {
   switch (fragP->fr_subtype)
     {
+    default:
+      abort ();
+
     case C (UNCD_JUMP, UNDEF_DISP):
       /* Used to be a branch to somewhere which was unknown.  */
       if (!fragP->fr_symbol)
        {
-         fragP->fr_subtype = C (UNCD_JUMP, UNCD12);
-         fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length;
+         fragP->fr_subtype = C (UNCD_JUMP, DISP12);
+         fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length;
        }
       else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
        {
-         fragP->fr_subtype = C (UNCD_JUMP, UNCD12);
-         fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD12)].rlx_length;
+         fragP->fr_subtype = C (UNCD_JUMP, DISP12);
+         fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP12)].rlx_length;
        }
       else
        {
          fragP->fr_subtype = C (UNCD_JUMP, UNDEF_WORD_DISP);
-         fragP->fr_var = md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length;
-         return md_relax_table[C (UNCD_JUMP, UNCD32)].rlx_length;
+         fragP->fr_var = md_relax_table[C (UNCD_JUMP, DISP32)].rlx_length;
        }
       break;
 
-    default:
-      abort ();
-
     case C (COND_JUMP, UNDEF_DISP):
       /* Used to be a branch to somewhere which was unknown.  */
       if (fragP->fr_symbol
@@ -2277,23 +2272,29 @@ md_estimate_size_before_relax (fragP, segment_type)
        {
          /* Got a symbol and it's defined in this segment, become byte
             sized - maybe it will fix up */
-         fragP->fr_subtype = C (COND_JUMP, COND12);
-         fragP->fr_var = md_relax_table[C (COND_JUMP, COND12)].rlx_length;
+         fragP->fr_subtype = C (COND_JUMP, DISP12);
+         fragP->fr_var = md_relax_table[C (COND_JUMP, DISP12)].rlx_length;
        }
       else if (fragP->fr_symbol)
        {
          /* Its got a segment, but its not ours, so it will always be long.  */
          fragP->fr_subtype = C (COND_JUMP, UNDEF_WORD_DISP);
-         fragP->fr_var = md_relax_table[C (COND_JUMP, COND32)].rlx_length;
-         return md_relax_table[C (COND_JUMP, COND32)].rlx_length;
+         fragP->fr_var = md_relax_table[C (COND_JUMP, DISP32)].rlx_length;
        }
       else
        {
          /* We know the abs value.  */
-         fragP->fr_subtype = C (COND_JUMP, COND12);
-         fragP->fr_var = md_relax_table[C (COND_JUMP, COND12)].rlx_length;
+         fragP->fr_subtype = C (COND_JUMP, DISP12);
+         fragP->fr_var = md_relax_table[C (COND_JUMP, DISP12)].rlx_length;
        }
+      break;
 
+    case C (UNCD_JUMP, DISP12):
+    case C (UNCD_JUMP, UNDEF_WORD_DISP):
+    case C (COND_JUMP, DISP12):
+    case C (COND_JUMP, UNDEF_WORD_DISP):
+      /* When relaxing a section for the second time, we don't need to
+        do anything.  */
       break;
     }
 
index 78545080b203a074f6a7850e0398bdd236e5b99f..dd3f9e544427ce8d60aa0950f408150624c58811 100644 (file)
@@ -1,5 +1,6 @@
 /* tc-mn10200.c -- Assembler code for the Matsushita 10200
-   Copyright 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -1284,29 +1285,19 @@ md_estimate_size_before_relax (fragp, seg)
      fragS *fragp;
      asection *seg;
 {
-  if (fragp->fr_subtype == 0)
-    return 2;
-  if (fragp->fr_subtype == 3)
-    return 3;
-  if (fragp->fr_subtype == 6)
-    {
-      if (!S_IS_DEFINED (fragp->fr_symbol)
-         || seg != S_GET_SEGMENT (fragp->fr_symbol))
-       {
-         fragp->fr_subtype = 7;
-         return 5;
-       }
-      return 3;
-    }
-  if (fragp->fr_subtype == 8)
-    {
-      if (!S_IS_DEFINED (fragp->fr_symbol))
-       {
-         fragp->fr_subtype = 10;
-         return 5;
-       }
-      return 2;
-    }
+  if (fragp->fr_subtype == 6
+      && (!S_IS_DEFINED (fragp->fr_symbol)
+         || seg != S_GET_SEGMENT (fragp->fr_symbol)))
+    fragp->fr_subtype = 7;
+  else if (fragp->fr_subtype == 8
+          && (!S_IS_DEFINED (fragp->fr_symbol)
+              || seg != S_GET_SEGMENT (fragp->fr_symbol)))
+    fragp->fr_subtype = 10;
+
+  if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
+    abort ();
+
+  return md_relax_table[fragp->fr_subtype].rlx_length;
 }
 
 long
index 8504e84c14bea5ba6cf414a3c6119f05c4a75dfa..ba93b41f22d4af8320bf8eca0675ae77b6b3564c 100644 (file)
@@ -1843,44 +1843,23 @@ md_estimate_size_before_relax (fragp, seg)
      fragS *fragp;
      asection *seg;
 {
-  if (fragp->fr_subtype == 0)
-    return 2;
-  if (fragp->fr_subtype == 3)
-    return 3;
-  if (fragp->fr_subtype == 6)
-    {
-      if (!S_IS_DEFINED (fragp->fr_symbol)
-         || seg != S_GET_SEGMENT (fragp->fr_symbol))
-       {
-         fragp->fr_subtype = 7;
-         return 7;
-       }
-      else
-       return 5;
-    }
-  if (fragp->fr_subtype == 8)
-    {
-      if (!S_IS_DEFINED (fragp->fr_symbol)
-         || seg != S_GET_SEGMENT (fragp->fr_symbol))
-       {
-         fragp->fr_subtype = 9;
-         return 6;
-       }
-      else
-       return 4;
-    }
-  if (fragp->fr_subtype == 10)
-    {
-      if (!S_IS_DEFINED (fragp->fr_symbol)
-         || seg != S_GET_SEGMENT (fragp->fr_symbol))
-       {
-         fragp->fr_subtype = 12;
-         return 5;
-       }
-      else
-       return 2;
-    }
-  abort ();
+  if (fragp->fr_subtype == 6
+      && (!S_IS_DEFINED (fragp->fr_symbol)
+         || seg != S_GET_SEGMENT (fragp->fr_symbol)))
+    fragp->fr_subtype = 7;
+  else if (fragp->fr_subtype == 8
+          && (!S_IS_DEFINED (fragp->fr_symbol)
+              || seg != S_GET_SEGMENT (fragp->fr_symbol)))
+    fragp->fr_subtype = 9;
+  else if (fragp->fr_subtype == 10
+          &&  (!S_IS_DEFINED (fragp->fr_symbol)
+               || seg != S_GET_SEGMENT (fragp->fr_symbol)))
+    fragp->fr_subtype = 12;
+
+  if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
+    abort ();
+
+  return md_relax_table[fragp->fr_subtype].rlx_length;
 }
 
 long
index f5381296163793d707d22162579c0b7880ff07ba..f66795c88c98ec341ef26d72736bde5cf3be453f 100644 (file)
@@ -1,5 +1,6 @@
 /* ns32k.c  -- Assemble on the National Semiconductor 32k series
-   Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+   2001
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -2102,9 +2103,14 @@ md_estimate_size_before_relax (fragP, segment)
          frag_wane (fragP);
          break;
        }
+      /* Fall thru */
+
     case IND (BRANCH, BYTE):
-      fragP->fr_var += 1;
+    case IND (BRANCH, WORD):
+    case IND (BRANCH, DOUBLE):
+      fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
       break;
+
     default:
       break;
     }
index b1a51e66ef413f357741a7809287aa18cddb1c04..4ae801f69b534b18da6f7f8aeacad2f26095673c 100644 (file)
@@ -3030,6 +3030,9 @@ md_estimate_size_before_relax (fragP, segment_type)
 {
   switch (fragP->fr_subtype)
     {
+    default:
+      abort ();
+
     case C (UNCOND_JUMP, UNDEF_DISP):
       /* Used to be a branch to somewhere which was unknown.  */
       if (!fragP->fr_symbol)
@@ -3046,12 +3049,9 @@ md_estimate_size_before_relax (fragP, segment_type)
        {
          fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP);
          fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
-         return md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
        }
       break;
 
-    default:
-      abort ();
     case C (COND_JUMP, UNDEF_DISP):
     case C (COND_JUMP_DELAY, UNDEF_DISP):
       /* Used to be a branch to somewhere which was unknown.  */
@@ -3070,7 +3070,6 @@ md_estimate_size_before_relax (fragP, segment_type)
          /* Its got a segment, but its not ours, so it will always be long.  */
          fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
          fragP->fr_var = md_relax_table[C (what, COND32)].rlx_length;
-         return md_relax_table[C (what, COND32)].rlx_length;
        }
       else
        {
@@ -3079,7 +3078,16 @@ md_estimate_size_before_relax (fragP, segment_type)
          fragP->fr_subtype = C (what, COND8);
          fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length;
        }
+      break;
 
+    case C (UNCOND_JUMP, UNCOND12):
+    case C (UNCOND_JUMP, UNDEF_WORD_DISP):
+    case C (COND_JUMP, COND8):
+    case C (COND_JUMP, UNDEF_WORD_DISP):
+    case C (COND_JUMP_DELAY, COND8):
+    case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
+      /* When relaxing a section for the second time, we don't need to
+        do anything.  */
       break;
     }
   return fragP->fr_var;
index dfb3c197463c9ff714b4e2b566346143b4d5aada..eaa65041150b847713c35ab4870e0a07cd687274 100644 (file)
@@ -1,5 +1,5 @@
 /* tc-w65.c -- Assemble code for the W65816
-   Copyright 1995, 1998, 2000 Free Software Foundation, Inc.
+   Copyright 1995, 1998, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -1154,6 +1154,7 @@ md_estimate_size_before_relax (fragP, segment_type)
     {
     default:
       abort ();
+
     case C (COND_BRANCH, UNDEF_BYTE_DISP):
     case C (UNCOND_BRANCH, UNDEF_BYTE_DISP):
       /* Used to be a branch to somewhere which was unknown.  */
@@ -1170,8 +1171,16 @@ md_estimate_size_before_relax (fragP, segment_type)
              long.  */
          fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
          fragP->fr_var = md_relax_table[C (what, WORD_DISP)].rlx_length;
-         return md_relax_table[C (what, WORD_DISP)].rlx_length;
        }
+      break;
+
+    case C (COND_BRANCH, BYTE_DISP):
+    case C (COND_BRANCH, WORD_DISP):
+    case C (UNCOND_BRANCH, BYTE_DISP):
+    case C (UNCOND_BRANCH, WORD_DISP):
+      /* When relaxing a section for the second time, we don't need to
+        do anything.  */
+      break;
     }
   return fragP->fr_var;
 }