/* ehopt.c--optimize gcc exception frame information.
- Copyright (C) 1998-2018 Free Software Foundation, Inc.
+ Copyright (C) 1998-2022 Free Software Foundation, Inc.
Written by Ian Lance Taylor <ian@cygnus.com>.
This file is part of GAS, the GNU Assembler.
{
fragS *f;
fixS *fix;
- int offset;
+ unsigned int offset;
char CIE_id;
char augmentation[10];
int iaug;
/* First make sure that the CIE Identifier Tag is 0/-1. */
- if (strncmp (segment_name (now_seg), ".debug_frame", 12) == 0)
+ if (startswith (segment_name (now_seg), ".debug_frame"))
CIE_id = (char)0xff;
else
CIE_id = 0;
#endif
/* Select the proper section data. */
- if (strncmp (segment_name (now_seg), ".eh_frame", 9) == 0
+ if (startswith (segment_name (now_seg), ".eh_frame")
&& segment_name (now_seg)[9] != '_')
d = &eh_frame_data;
- else if (strncmp (segment_name (now_seg), ".debug_frame", 12) == 0)
+ else if (startswith (segment_name (now_seg), ".debug_frame"))
d = &debug_frame_data;
else
return 0;
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;
else
ret = 4;
- frag->fr_subtype = (frag->fr_subtype & ~7) | ret;
+ frag->fr_subtype = (frag->fr_subtype & ~7) | (ret & 7);
return ret;
}
int oldsize, newsize;
oldsize = frag->fr_subtype & 7;
+ if (oldsize == 7)
+ oldsize = -1;
newsize = eh_frame_estimate_size_before_relax (frag);
return newsize - oldsize;
}
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;