This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: Assertion failure in m68k assembler
- To: Andreas Schwab <schwab at suse dot de>
- Subject: Re: Assertion failure in m68k assembler
- From: Alan Modra <alan at SPRI dot Levels dot UniSA dot Edu dot Au>
- Date: Tue, 8 May 2001 22:39:57 +0930 (CST)
- cc: <binutils at sourceware dot cygnus dot com>
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;
}