[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