diff options
author | Jim Wilson <jimw@sifive.com> | 2018-05-24 10:35:59 -0700 |
---|---|---|
committer | Jim Wilson <jimw@sifive.com> | 2018-05-24 10:35:59 -0700 |
commit | e80ae1906b63e092f3900addbc869f0836f8d71d (patch) | |
tree | 436090cf29122f5e3070f2e659032214bd023058 /gas | |
parent | 45f25d6c83c31a48a01ef8293bb3978f5e58e653 (diff) | |
download | fsf-binutils-gdb-e80ae1906b63e092f3900addbc869f0836f8d71d.zip fsf-binutils-gdb-e80ae1906b63e092f3900addbc869f0836f8d71d.tar.gz fsf-binutils-gdb-e80ae1906b63e092f3900addbc869f0836f8d71d.tar.bz2 |
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
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 12 | ||||
-rw-r--r-- | gas/config/tc-riscv.c | 30 | ||||
-rw-r--r-- | gas/config/tc-riscv.h | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/riscv/no-relax-align-2.d | 19 | ||||
-rw-r--r-- | gas/testsuite/gas/riscv/no-relax-align-2.s | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/riscv/no-relax-align.d | 13 | ||||
-rw-r--r-- | 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 |