This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Assertion failure in m68k assembler


This should fix it.

	* config/tc-m68k.c (md_estimate_size_before_relax): Set fr_var
	from md_relax_table, and combine some switch cases.

I notice also a peculiarity in the ABSTOPCREL handling in that
flag_short_refs isn't tested.  bug?

-- 
Alan Modra

Index: gas/config/tc-m68k.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-m68k.c,v
retrieving revision 1.19
diff -u -p -r1.19 tc-m68k.c
--- tc-m68k.c	2001/03/08 23:24:24	1.19
+++ tc-m68k.c	2001/05/08 12:58:37
@@ -4587,27 +4587,6 @@ md_estimate_size_before_relax (fragP, se
     {
     case TAB (BRANCHBWL, SZ_UNDEF):
     case TAB (BRABSJUNC, SZ_UNDEF):
-      {
-	if (S_GET_SEGMENT (fragP->fr_symbol) == segment
-	    && relaxable_symbol (fragP->fr_symbol))
-	  {
-	    fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
-	  }
-	else if (flag_short_refs)
-	  {
-	    /* Symbol is undefined and we want short ref.  */
-	    fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
-	    fragP->fr_var += 2;
-	  }
-	else
-	  {
-	    /* Symbol is still undefined.  Make it LONG.  */
-	    fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
-	    fragP->fr_var += 4;
-	  }
-	break;
-      }
-
     case TAB (BRABSJCOND, SZ_UNDEF):
       {
 	if (S_GET_SEGMENT (fragP->fr_symbol) == segment
@@ -4619,13 +4598,11 @@ md_estimate_size_before_relax (fragP, se
 	  {
 	    /* Symbol is undefined and we want short ref.  */
 	    fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
-	    fragP->fr_var += 2;
 	  }
 	else
 	  {
 	    /* Symbol is still undefined.  Make it LONG.  */
 	    fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
-	    fragP->fr_var += 6;
 	  }
 	break;
       }
@@ -4641,59 +4618,24 @@ md_estimate_size_before_relax (fragP, se
 	  {
 	    /* Symbol is undefined and we don't have long branches.  */
 	    fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
-	    fragP->fr_var += 2;
 	  }
 	break;
       }

     case TAB (FBRANCH, SZ_UNDEF):
-      {
-	if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
-	     && relaxable_symbol (fragP->fr_symbol))
-	    || flag_short_refs)
-	  {
-	    fragP->fr_subtype = TAB (FBRANCH, SHORT);
-	    fragP->fr_var += 2;
-	  }
-	else
-	  {
-	    fragP->fr_subtype = TAB (FBRANCH, LONG);
-	    fragP->fr_var += 4;
-	  }
-	break;
-      }
-
     case TAB (DBCCLBR, SZ_UNDEF):
     case TAB (DBCCABSJ, SZ_UNDEF):
+    case TAB (PCREL1632, SZ_UNDEF):
       {
 	if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
 	     && relaxable_symbol (fragP->fr_symbol))
 	    || flag_short_refs)
 	  {
 	    fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
-	    fragP->fr_var += 2;
 	  }
 	else
 	  {
 	    fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
-	    fragP->fr_var += 10;
-	  }
-	break;
-      }
-
-    case TAB (PCREL1632, SZ_UNDEF):
-      {
-	if (((S_GET_SEGMENT (fragP->fr_symbol)) == segment
-	     && relaxable_symbol (fragP->fr_symbol))
-	    || flag_short_refs)
-	  {
-	    fragP->fr_subtype = TAB (PCREL1632, SHORT);
-	    fragP->fr_var += 2;
-	  }
-	else
-	  {
-	    fragP->fr_subtype = TAB (PCREL1632, LONG);
-	    fragP->fr_var += 6;
 	  }
 	break;
       }
@@ -4707,7 +4649,6 @@ md_estimate_size_before_relax (fragP, se
       else
 	{
 	  fragP->fr_subtype = TAB (PCINDEX, LONG);
-	  fragP->fr_var += 4;
 	}
       break;

@@ -4717,12 +4658,10 @@ md_estimate_size_before_relax (fragP, se
 	     && relaxable_symbol (fragP->fr_symbol)))
 	  {
 	    fragP->fr_subtype = TAB (ABSTOPCREL, SHORT);
-	    fragP->fr_var += 2;
 	  }
 	else
 	  {
 	    fragP->fr_subtype = TAB (ABSTOPCREL, LONG);
-	    fragP->fr_var += 4;
 	  }
 	break;
       }
@@ -4757,13 +4696,13 @@ md_estimate_size_before_relax (fragP, se
 	  if (l == stop)
 	    {
 	      fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
-	      fragP->fr_var += 2;
 	    }
 	}
       break;
     default:
       break;
     }
+  fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
   return fragP->fr_var + fragP->fr_fix - old_fix;
 }



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]