This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Re: Optimise away eh_frame advance_loc 0


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=b9d8f5601bcfbe96ab0476286ae8e249ada10db5

commit b9d8f5601bcfbe96ab0476286ae8e249ada10db5
Author: Alan Modra <amodra@gmail.com>
Date:   Tue Oct 29 11:35:05 2019 +1030

    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.

Diff:
---
 gas/ChangeLog   | 6 ++++++
 gas/dw2gencfi.c | 7 ++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 53c90ea..17f45e3 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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
diff --git a/gas/dw2gencfi.c b/gas/dw2gencfi.c
index b01e4c4..6c0478a 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,


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]