RISC-V: Fix .align handling when .option norelax.
authorJim Wilson <jimw@sifive.com>
Thu, 24 May 2018 17:35:59 +0000 (10:35 -0700)
committerJim Wilson <jimw@sifive.com>
Thu, 24 May 2018 17:35:59 +0000 (10:35 -0700)
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

gas/ChangeLog
gas/config/tc-riscv.c
gas/config/tc-riscv.h
gas/testsuite/gas/riscv/no-relax-align-2.d [new file with mode: 0644]
gas/testsuite/gas/riscv/no-relax-align-2.s [new file with mode: 0644]
gas/testsuite/gas/riscv/no-relax-align.d [new file with mode: 0644]
gas/testsuite/gas/riscv/no-relax-align.s [new file with mode: 0644]

index 65eb22e..34f26a9 100644 (file)
@@ -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.
index 43ae21f..a0ea87a 100644 (file)
@@ -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;
 
index a4f40e6..5e59740 100644 (file)
@@ -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 (file)
index 0000000..7407b49
--- /dev/null
@@ -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 (file)
index 0000000..ccd353d
--- /dev/null
@@ -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 (file)
index 0000000..ced07d3
--- /dev/null
@@ -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 (file)
index 0000000..23b43e0
--- /dev/null
@@ -0,0 +1,4 @@
+       .option norelax
+       .align 4
+       nop
+       nop