aboutsummaryrefslogtreecommitdiff
path: root/gas/write.c
diff options
context:
space:
mode:
Diffstat (limited to 'gas/write.c')
-rw-r--r--gas/write.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/gas/write.c b/gas/write.c
index 080216a..4b6592f 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;
}
}