]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
RISC-V: odd data padding vs mapping symbols
authorJan Beulich <jbeulich@suse.com>
Fri, 27 Sep 2024 09:41:00 +0000 (11:41 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 27 Sep 2024 09:41:00 +0000 (11:41 +0200)
Odd data padding has a $d label inserted at its beginning. When a $x...
label is removed instead, a replacement is inserted after the padding.
The same, however, needs to also happen when there's no $x to replace.

gas/config/tc-riscv.c
gas/testsuite/gas/riscv/odd-padding.d [new file with mode: 0644]
gas/testsuite/gas/riscv/odd-padding.s [new file with mode: 0644]

index 4a5768327903c9db89c76c37bf799c5dd8f24684..ef455e449b9388f2f976069a26610f6843b1e5b4 100644 (file)
@@ -579,19 +579,19 @@ make_mapping_symbol (enum riscv_seg_mstate state,
     }
   frag->tc_frag_data.last_map_symbol = symbol;
 
-  if (removed == NULL)
-    return;
-
   if (odd_data_padding)
     {
       /* If the removed mapping symbol is $x+arch, then add it back to
         the next $x.  */
-      const char *str = strncmp (S_GET_NAME (removed), "$xrv", 4) == 0
+      const char *str = removed != NULL
+                       && strncmp (S_GET_NAME (removed), "$xrv", 4) == 0
                        ? S_GET_NAME (removed) + 2 : NULL;
       make_mapping_symbol (MAP_INSN, frag->fr_fix + 1, frag, str,
                           false/* odd_data_padding */);
     }
-  symbol_remove (removed, &symbol_rootP, &symbol_lastP);
+
+  if (removed != NULL)
+    symbol_remove (removed, &symbol_rootP, &symbol_lastP);
 }
 
 /* Set the mapping state for frag_now.  */
diff --git a/gas/testsuite/gas/riscv/odd-padding.d b/gas/testsuite/gas/riscv/odd-padding.d
new file mode 100644 (file)
index 0000000..b445a74
--- /dev/null
@@ -0,0 +1,17 @@
+#as: -mrelax
+#as: -mno-relax
+#objdump: -d
+
+.*:[   ]+file format .*
+
+
+Disassembly of section \.text:
+
+0+000 <byte>:
+[      ]+0:[   ]+00000013[     ]+nop
+[      ]+4:[   ]+00[   ]+\.byte[       ]+0x00
+#...
+[      ]+9:[   ]+00[   ]+\.byte[       ]+0x00
+[      ]+a:[   ]+0001[         ]+\.insn[       ]+2, 0x0*1
+[      ]+c:[   ]+00000013[     ]+nop
+[      ]+10:[  ]+00008067[     ]+ret
diff --git a/gas/testsuite/gas/riscv/odd-padding.s b/gas/testsuite/gas/riscv/odd-padding.s
new file mode 100644 (file)
index 0000000..9e434ea
--- /dev/null
@@ -0,0 +1,8 @@
+       .text\r
+byte:\r
+       nop\r
+       .byte 0\r
+       nop\r
+       .p2align 2\r
+       nop\r
+       ret\r