+2016-12-21 Andrew Waterman <andrew@sifive.com>
+
+ * config/tc-riscv.c (riscv_make_nops): Emit 2-byte NOPs.
+ (riscv_frag_align_code): Correct frag_align_code arg.
+
2016-12-21 Tim Newsome <tim@sifive.com>
* config/tc-riscv.c (riscv_pre_output_hook): Remove const from
{
bfd_vma i = 0;
- if (bytes % 4 == 2)
+ /* RISC-V instructions cannot begin or end on odd addresses, so this case
+ means we are not within a valid instruction sequence. It is thus safe
+ to use a zero byte, even though that is not a valid instruction. */
+ if (bytes % 2 == 1)
+ buf[i++] = 0;
+
+ /* Use at most one 2-byte NOP. */
+ if ((bytes - i) % 4 == 2)
{
- md_number_to_chars (buf, RVC_NOP, 2);
+ md_number_to_chars (buf + i, RVC_NOP, 2);
i += 2;
}
- gas_assert ((bytes - i) % 4 == 0);
-
+ /* Fill the remainder with 4-byte NOPs. */
for ( ; i < bytes; i += 4)
md_number_to_chars (buf + i, RISCV_NOP, 4);
}
bfd_boolean
riscv_frag_align_code (int n)
{
- bfd_vma bytes = (bfd_vma)1 << n;
- bfd_vma min_text_alignment = riscv_opts.rvc ? 2 : 4;
+ bfd_vma bytes = (bfd_vma) 1 << n;
+ bfd_vma min_text_alignment_order = riscv_opts.rvc ? 1 : 2;
+ bfd_vma min_text_alignment = (bfd_vma) 1 << min_text_alignment_order;
+
+ /* First, get back to minimal alignment. */
+ frag_align_code (min_text_alignment_order, 0);
/* When not relaxing, riscv_handle_align handles code alignment. */
if (!riscv_opts.relax)