* config/tc-rx.c (rx_bytesT): Add grown/shrank counters for

relaxation.
(rx_relax_frag): Prevent infinite loops of grow/shrink/grow/etc.
This commit is contained in:
DJ Delorie 2010-07-02 20:24:23 +00:00
parent 38b6c3b38d
commit 44a808b1a4
2 changed files with 23 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2010-07-02 DJ Delorie <dj@redhat.com>
* config/tc-rx.c (rx_bytesT): Add grown/shrank counters for
relaxation.
(rx_relax_frag): Prevent infinite loops of grow/shrink/grow/etc.
2010-07-01 H.J. Lu <hongjiu.lu@intel.com>
AVX Programming Reference (June, 2010)

View File

@ -624,6 +624,8 @@ typedef struct rx_bytesT
int n_relax;
int link_relax;
fixS *link_relax_fixP;
char times_grown;
char times_shrank;
} rx_bytesT;
static rx_bytesT rx_bytes;
@ -1485,6 +1487,21 @@ rx_relax_frag (segT segment ATTRIBUTE_UNUSED, fragS * fragP, long stretch)
break;
}
/* This prevents infinite loops in align-heavy sources. */
if (newsize < oldsize)
{
if (fragP->tc_frag_data->times_shrank > 10
&& fragP->tc_frag_data->times_grown > 10)
newsize = oldsize;
if (fragP->tc_frag_data->times_shrank < 20)
fragP->tc_frag_data->times_shrank ++;
}
else if (newsize > oldsize)
{
if (fragP->tc_frag_data->times_grown < 20)
fragP->tc_frag_data->times_grown ++;
}
fragP->fr_subtype = newsize;
tprintf (" -> new %d old %d delta %d\n", newsize, oldsize, newsize-oldsize);
return newsize - oldsize;