Re: Optimise away eh_frame advance_loc 0

If we happen to get the fixed and variable parts of the advance_loc
in different frags, bad things happen when subtracting one from a
fr_fix of zero.

	PR 25125
	* dw2gencfi.c (output_cfi_insn): Don't allow DW_CFA_advance_loc4
	to be placed in a different frag to the rs_cfa.
This commit is contained in:
Alan Modra
2019-10-29 11:35:05 +10:30
parent d7b510baa8
commit b9d8f5601b
2 changed files with 12 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2019-10-29 Alan Modra <amodra@gmail.com>
PR 25125
* dw2gencfi.c (output_cfi_insn): Don't allow DW_CFA_advance_loc4
to be placed in a different frag to the rs_cfa.
2019-10-26 John David Anglin <danglin@gcc.gnu.org> 2019-10-26 John David Anglin <danglin@gcc.gnu.org>
PR gas/25121 PR gas/25121

View File

@ -1630,7 +1630,12 @@ output_cfi_insn (struct cfi_insn_data *insn)
/* The code in ehopt.c expects that one byte of the encoding /* The code in ehopt.c expects that one byte of the encoding
is already allocated to the frag. This comes from the way is already allocated to the frag. This comes from the way
that it scans the .eh_frame section looking first for the that it scans the .eh_frame section looking first for the
.byte DW_CFA_advance_loc4. */ .byte DW_CFA_advance_loc4. Call frag_grow with the sum of
room needed by frag_more and frag_var to preallocate space
ensuring that the DW_CFA_advance_loc4 is in the fixed part
of the rs_cfa frag, so that the relax machinery can remove
the advance_loc should it advance by zero. */
frag_grow (5);
*frag_more (1) = DW_CFA_advance_loc4; *frag_more (1) = DW_CFA_advance_loc4;
frag_var (rs_cfa, 4, 0, DWARF2_LINE_MIN_INSN_LENGTH << 3, frag_var (rs_cfa, 4, 0, DWARF2_LINE_MIN_INSN_LENGTH << 3,