[binutils-gdb] RISC-V: Fix .align handling when .option norelax.

Jim Wilson wilson@sourceware.org
Thu May 24 17:36:00 GMT 2018


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

commit e80ae1906b63e092f3900addbc869f0836f8d71d
Author: Jim Wilson <jimw@sifive.com>
Date:   Thu May 24 10:35:59 2018 -0700

    RISC-V: Fix .align handling when .option norelax.
    
    	gas/
    	PR gas/23219
    	* config/tc-riscv.c (riscv_frag_align_code): Move frag_more call after
    	!riscv_opts.relax check.
    	(riscv_handle_align): Rewrite !riscv_opts.relax support.
    	* config/tc-riscv (MAX_MEM_FOR_RS_ALIGN_CODE): Update.
    	* testsuite/gas/riscv/no-relax-align.d: New
    	* testsuite/gas/riscv/no-relax-align.s: New
    	* testsuite/gas/riscv/no-relax-align-2.d: New
    	* testsuite/gas/riscv/no-relax-align-2.s: New

Diff:
---
 gas/ChangeLog                              | 12 ++++++++++++
 gas/config/tc-riscv.c                      | 30 +++++++++++++++++++++---------
 gas/config/tc-riscv.h                      |  2 +-
 gas/testsuite/gas/riscv/no-relax-align-2.d | 19 +++++++++++++++++++
 gas/testsuite/gas/riscv/no-relax-align-2.s |  5 +++++
 gas/testsuite/gas/riscv/no-relax-align.d   | 13 +++++++++++++
 gas/testsuite/gas/riscv/no-relax-align.s   |  4 ++++
 7 files changed, 75 insertions(+), 10 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 65eb22e..34f26a9 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,15 @@
+2018-05-24  Jim Wilson  <jimw@sifive.com>
+
+	PR gas/23219
+	* config/tc-riscv.c (riscv_frag_align_code): Move frag_more call after
+	!riscv_opts.relax check.
+	(riscv_handle_align): Rewrite !riscv_opts.relax support.
+	* config/tc-riscv (MAX_MEM_FOR_RS_ALIGN_CODE): Update.
+	* testsuite/gas/riscv/no-relax-align.d: New
+	* testsuite/gas/riscv/no-relax-align.s: New
+	* testsuite/gas/riscv/no-relax-align-2.d: New
+	* testsuite/gas/riscv/no-relax-align-2.s: New
+
 2018-05-21  Peter Bergner  <bergner@vnet.ibm.com.com>
 
 	* config/tc-ppc.c (md_assemble): Delete handling of fake operands.
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 43ae21f..a0ea87a 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -2756,12 +2756,12 @@ riscv_frag_align_code (int n)
   if (bytes <= insn_alignment)
     return TRUE;
 
-  nops = frag_more (worst_case_bytes);
-
   /* When not relaxing, riscv_handle_align handles code alignment.  */
   if (!riscv_opts.relax)
     return FALSE;
 
+  nops = frag_more (worst_case_bytes);
+
   ex.X_op = O_constant;
   ex.X_add_number = worst_case_bytes;
 
@@ -2784,15 +2784,27 @@ riscv_handle_align (fragS *fragP)
       /* When relaxing, riscv_frag_align_code handles code alignment.  */
       if (!riscv_opts.relax)
 	{
-	  bfd_signed_vma count = fragP->fr_next->fr_address
-				 - fragP->fr_address - fragP->fr_fix;
-
-	  if (count <= 0)
+	  bfd_signed_vma bytes = (fragP->fr_next->fr_address
+				  - fragP->fr_address - fragP->fr_fix);
+	  /* We have 4 byte uncompressed nops.  */
+	  bfd_signed_vma size = 4;
+	  bfd_signed_vma excess = bytes % size;
+	  char *p = fragP->fr_literal + fragP->fr_fix;
+
+	  if (bytes <= 0)
 	    break;
 
-	  count &= MAX_MEM_FOR_RS_ALIGN_CODE;
-	  riscv_make_nops (fragP->fr_literal + fragP->fr_fix, count);
-	  fragP->fr_var = count;
+	  /* Insert zeros or compressed nops to get 4 byte alignment.  */
+	  if (excess)
+	    {
+	      riscv_make_nops (p, excess);
+	      fragP->fr_fix += excess;
+	      p += excess;
+	    }
+
+	  /* Insert variable number of 4 byte uncompressed nops.  */
+	  riscv_make_nops (p, size);
+	  fragP->fr_var = size;
 	}
       break;
 
diff --git a/gas/config/tc-riscv.h b/gas/config/tc-riscv.h
index a4f40e6..5e59740 100644
--- a/gas/config/tc-riscv.h
+++ b/gas/config/tc-riscv.h
@@ -62,7 +62,7 @@ extern bfd_boolean riscv_frag_align_code (int);
 extern void riscv_handle_align (fragS *);
 #define HANDLE_ALIGN riscv_handle_align
 
-#define MAX_MEM_FOR_RS_ALIGN_CODE 7
+#define MAX_MEM_FOR_RS_ALIGN_CODE (3 + 4)
 
 /* The ISA of the target may change based on command-line arguments.  */
 #define TARGET_FORMAT riscv_target_format()
diff --git a/gas/testsuite/gas/riscv/no-relax-align-2.d b/gas/testsuite/gas/riscv/no-relax-align-2.d
new file mode 100644
index 0000000..7407b49
--- /dev/null
+++ b/gas/testsuite/gas/riscv/no-relax-align-2.d
@@ -0,0 +1,19 @@
+#as:
+#objdump: -dr
+
+.*:[ 	]+file format .*
+
+
+Disassembly of section .text:
+
+0+000 <.text>:
+[ 	]+0:[ 	]+0000[ 	]+unimp
+[ 	]+2:[ 	]+0001[ 	]+nop
+[ 	]+4:[ 	]+00000013[ 	]+nop
+[ 	]+8:[ 	]+00000013[ 	]+nop
+[ 	]+c:[ 	]+00000013[ 	]+nop
+[ 	]+10:[ 	]+0001[ 	]+nop
+[ 	]+12:[ 	]+0001[ 	]+nop
+[ 	]+14:[ 	]+00000013[ 	]+nop
+[ 	]+18:[ 	]+00000013[ 	]+nop
+[ 	]+1c:[ 	]+00000013[ 	]+nop
diff --git a/gas/testsuite/gas/riscv/no-relax-align-2.s b/gas/testsuite/gas/riscv/no-relax-align-2.s
new file mode 100644
index 0000000..ccd353d
--- /dev/null
+++ b/gas/testsuite/gas/riscv/no-relax-align-2.s
@@ -0,0 +1,5 @@
+	.option norelax
+	.option rvc
+	.byte 0
+	.align 4
+	nop
diff --git a/gas/testsuite/gas/riscv/no-relax-align.d b/gas/testsuite/gas/riscv/no-relax-align.d
new file mode 100644
index 0000000..ced07d3
--- /dev/null
+++ b/gas/testsuite/gas/riscv/no-relax-align.d
@@ -0,0 +1,13 @@
+#as:
+#objdump: -dr
+
+.*:[ 	]+file format .*
+
+
+Disassembly of section .text:
+
+0+000 <.text>:
+[ 	]+0:[ 	]+00000013[ 	]+nop
+[ 	]+4:[ 	]+00000013[ 	]+nop
+[ 	]+8:[ 	]+00000013[ 	]+nop
+[ 	]+c:[ 	]+00000013[ 	]+nop
diff --git a/gas/testsuite/gas/riscv/no-relax-align.s b/gas/testsuite/gas/riscv/no-relax-align.s
new file mode 100644
index 0000000..23b43e0
--- /dev/null
+++ b/gas/testsuite/gas/riscv/no-relax-align.s
@@ -0,0 +1,4 @@
+	.option norelax
+	.align 4
+	nop
+	nop



More information about the Binutils-cvs mailing list