From e5940dffc561e32e0fa15b964a33aa3a7477237f Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 25 Oct 2010 03:03:18 +0000 Subject: [PATCH] PR gas/12049 * write.c (relax_frag): Don't allow forward branches to temporarily becomde backward branches. --- gas/ChangeLog | 6 ++++++ gas/write.c | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index b3fb6253d61..020f927956f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2010-10-25 Alan Modra + + PR gas/12049 + * write.c (relax_frag): Don't allow forward branches to temporarily + becomde backward branches. + 2010-10-23 Mark Mitchell * config/obj-elf.c (elf_adjust_symtab): New. Move group section diff --git a/gas/write.c b/gas/write.c index 080216a2409..4b6592f7aa8 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; } } -- 2.30.2