From b9d8f5601bcfbe96ab0476286ae8e249ada10db5 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 29 Oct 2019 11:35:05 +1030 Subject: [PATCH] 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. --- gas/ChangeLog | 6 ++++++ gas/dw2gencfi.c | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 53c90eae888..17f45e3ec6e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +2019-10-29 Alan Modra + + 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 PR gas/25121 diff --git a/gas/dw2gencfi.c b/gas/dw2gencfi.c index b01e4c4a9ed..6c0478a7206 100644 --- a/gas/dw2gencfi.c +++ b/gas/dw2gencfi.c @@ -1630,7 +1630,12 @@ output_cfi_insn (struct cfi_insn_data *insn) /* The code in ehopt.c expects that one byte of the encoding is already allocated to the frag. This comes from the way 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_var (rs_cfa, 4, 0, DWARF2_LINE_MIN_INSN_LENGTH << 3, -- 2.30.2