X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fehopt.c;h=1e2e5f880d87b039e8b19e3c385e91222fe041a6;hb=c2e5c986b3825c16a578e5bf84aa412eec276dc7;hp=6e346406a65bb65e92facf96fb81de4dde38c47c;hpb=8d1015a887c18c363d9bd707b13348daf4e5f556;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/ehopt.c b/gas/ehopt.c index 6e346406a6..1e2e5f880d 100644 --- a/gas/ehopt.c +++ b/gas/ehopt.c @@ -1,5 +1,5 @@ /* ehopt.c--optimize gcc exception frame information. - Copyright (C) 1998-2018 Free Software Foundation, Inc. + Copyright (C) 1998-2020 Free Software Foundation, Inc. Written by Ian Lance Taylor . This file is part of GAS, the GNU Assembler. @@ -103,7 +103,7 @@ get_cie_info (struct cie_info *info) { fragS *f; fixS *fix; - int offset; + unsigned int offset; char CIE_id; char augmentation[10]; int iaug; @@ -482,7 +482,9 @@ eh_frame_estimate_size_before_relax (fragS *frag) gas_assert (ca > 0); diff /= ca; - if (diff < 0x40) + if (diff == 0) + ret = -1; + else if (diff < 0x40) ret = 0; else if (diff < 0x100) ret = 1; @@ -491,7 +493,7 @@ eh_frame_estimate_size_before_relax (fragS *frag) else ret = 4; - frag->fr_subtype = (frag->fr_subtype & ~7) | ret; + frag->fr_subtype = (frag->fr_subtype & ~7) | (ret & 7); return ret; } @@ -506,6 +508,8 @@ eh_frame_relax_frag (fragS *frag) int oldsize, newsize; oldsize = frag->fr_subtype & 7; + if (oldsize == 7) + oldsize = -1; newsize = eh_frame_estimate_size_before_relax (frag); return newsize - oldsize; } @@ -548,9 +552,17 @@ eh_frame_convert_frag (fragS *frag) md_number_to_chars (frag->fr_literal + frag->fr_fix, diff, 2); break; - default: + case 4: md_number_to_chars (frag->fr_literal + frag->fr_fix, diff, 4); break; + + case 7: + gas_assert (diff == 0); + frag->fr_fix -= 8; + break; + + default: + abort (); } frag->fr_fix += frag->fr_subtype & 7;