From 36877bfb88f99dd0e4336f98233f7caaa1d594a7 Mon Sep 17 00:00:00 2001 From: Jim Wilson Date: Wed, 29 Nov 2017 10:36:46 -0800 Subject: [PATCH] Fix riscv malloc error on small alignment after norvc. gas/ * config/tc-riscv.c (riscv_frag_align_code): New local insn_alignment. Early return if bytes less than or equal to insn_alignment. * testsuite/gas/riscv/align-1.l: New. * testsuite/gas/riscv/align-1.s: New. * testsuite/gas/riscv/riscv.exp: Use run_dump_tests. Use run_list_test for align-1. --- gas/ChangeLog | 7 +++++++ gas/config/tc-riscv.c | 12 ++++++++++-- gas/testsuite/gas/riscv/align-1.l | 1 + gas/testsuite/gas/riscv/align-1.s | 3 +++ gas/testsuite/gas/riscv/riscv.exp | 11 ++--------- 5 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 gas/testsuite/gas/riscv/align-1.l create mode 100644 gas/testsuite/gas/riscv/align-1.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 8124043fac3..5e4edeab7c5 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,12 @@ 2017-11-29 Jim Wilson + * config/tc-riscv.c (riscv_frag_align_code): New local insn_alignment. + Early return if bytes less than or equal to insn_alignment. + * testsuite/gas/riscv/align-1.l: New. + * testsuite/gas/riscv/align-1.s: New. + * testsuite/gas/riscv/riscv.exp: Use run_dump_tests. Use run_list_test + for align-1. + PR gas/22464 * doc/c-i386.texi (-n): Clarify docs. diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 8bb400e1001..c2e5f30e506 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -2319,10 +2319,18 @@ bfd_boolean riscv_frag_align_code (int n) { bfd_vma bytes = (bfd_vma) 1 << n; - bfd_vma worst_case_bytes = bytes - (riscv_opts.rvc ? 2 : 4); - char *nops = frag_more (worst_case_bytes); + bfd_vma insn_alignment = riscv_opts.rvc ? 2 : 4; + bfd_vma worst_case_bytes = bytes - insn_alignment; + char *nops; expressionS ex; + /* If we are moving to a smaller alignment than the instruction size, then no + alignment is required. */ + 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; diff --git a/gas/testsuite/gas/riscv/align-1.l b/gas/testsuite/gas/riscv/align-1.l new file mode 100644 index 00000000000..8ea739b7641 --- /dev/null +++ b/gas/testsuite/gas/riscv/align-1.l @@ -0,0 +1 @@ +# No warning or error expected. diff --git a/gas/testsuite/gas/riscv/align-1.s b/gas/testsuite/gas/riscv/align-1.s new file mode 100644 index 00000000000..ee6a94dea78 --- /dev/null +++ b/gas/testsuite/gas/riscv/align-1.s @@ -0,0 +1,3 @@ + .option norvc + .align 2 + .align 1 diff --git a/gas/testsuite/gas/riscv/riscv.exp b/gas/testsuite/gas/riscv/riscv.exp index 5ef92f50069..162c77d96ad 100644 --- a/gas/testsuite/gas/riscv/riscv.exp +++ b/gas/testsuite/gas/riscv/riscv.exp @@ -19,13 +19,6 @@ # MA 02110-1301, USA. if [istarget riscv*-*-*] { - run_dump_test "t_insns" - run_dump_test "fmv.x" - run_dump_test "c-lui-fail" - run_dump_test "c-addi4spn-fail" - run_dump_test "c-addi16sp-fail" - run_dump_test "satp" - run_dump_test "eh-relocs" - run_dump_test "c-lw" - run_dump_test "c-ld" + run_dump_tests [lsort [glob -nocomplain $srcdir/$subdir/*.d]] + run_list_test "align-1" } -- 2.30.2