Re: Optimise away eh_frame advance_loc 0
authorAlan Modra <amodra@gmail.com>
Tue, 29 Oct 2019 01:05:05 +0000 (11:35 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 29 Oct 2019 01:50:54 +0000 (12:20 +1030)
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
gas/dw2gencfi.c

index 53c90eae888c2a471bd678390c006a29d6b42595..17f45e3ec6eed5b545aacb5ec6c03b03d48a1372 100644 (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>
 
        PR gas/25121
index b01e4c4a9eda2e09008bd1683c851408258c21df..6c0478a72063801f1f91441a11350daa94605843 100644 (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
               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,