summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/write.c7
2 files changed, 13 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index b3fb6253d6..020f927956 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2010-10-25 Alan Modra <amodra@gmail.com>
+
+ PR gas/12049
+ * write.c (relax_frag): Don't allow forward branches to temporarily
+ becomde backward branches.
+
2010-10-23 Mark Mitchell <mark@codesourcery.com>
* config/obj-elf.c (elf_adjust_symtab): New. Move group section
diff --git a/gas/write.c b/gas/write.c
index 080216a240..4b6592f7aa 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -2163,6 +2163,13 @@ relax_frag (segT segment, fragS *fragP, long stretch)
if (stretch < 0
|| sym_frag->region == fragP->region)
target += stretch;
+ /* If we get here we know we have a forward branch. This
+ relax pass may have stretched previous instructions so
+ far that omitting STRETCH would make the branch
+ negative. Don't allow this in case the negative reach is
+ large enough to require a larger branch instruction. */
+ else if (target < address)
+ target = fragP->fr_next->fr_address + stretch;
}
}