From 44a808b1a4654298565c602cb7847ec34e0f722a Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Fri, 2 Jul 2010 20:24:23 +0000 Subject: [PATCH] * config/tc-rx.c (rx_bytesT): Add grown/shrank counters for relaxation. (rx_relax_frag): Prevent infinite loops of grow/shrink/grow/etc. --- gas/ChangeLog | 6 ++++++ gas/config/tc-rx.c | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index ef3ac8b832..47708c7c4a 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2010-07-02 DJ Delorie + + * 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 AVX Programming Reference (June, 2010) diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c index 3bb9a5afe7..00101e0318 100644 --- a/gas/config/tc-rx.c +++ b/gas/config/tc-rx.c @@ -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;