diff options
author | DJ Delorie <dj@redhat.com> | 2010-07-02 20:24:23 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2010-07-02 20:24:23 +0000 |
commit | 44a808b1a4654298565c602cb7847ec34e0f722a (patch) | |
tree | 80163339e91297234f5bdff83d434eede1d37a28 /gas/config | |
parent | 38b6c3b38d9189bc02b88cb3abe6c3e6216b33ff (diff) | |
download | gdb-44a808b1a4654298565c602cb7847ec34e0f722a.zip gdb-44a808b1a4654298565c602cb7847ec34e0f722a.tar.gz gdb-44a808b1a4654298565c602cb7847ec34e0f722a.tar.bz2 |
* config/tc-rx.c (rx_bytesT): Add grown/shrank counters for
relaxation.
(rx_relax_frag): Prevent infinite loops of grow/shrink/grow/etc.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-rx.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/gas/config/tc-rx.c b/gas/config/tc-rx.c index 3bb9a5a..00101e0 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; |