[binutils-gdb/binutils-2_45-branch] gas: accept leading zeros on dollar local labels in z80 sdcc compat mode
Jan Beulich
jbeulich@sourceware.org
Mon Jul 14 08:41:18 GMT 2025
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=72300c917ff7f0ec77b141066a2700988834087d
commit 72300c917ff7f0ec77b141066a2700988834087d
Author: Aaron Griffith <aargri@gmail.com>
Date: Mon Jul 14 10:38:52 2025 +0200
gas: accept leading zeros on dollar local labels in z80 sdcc compat mode
SDCC assembly output uses 5-digit numeric dollar sign labels, padded
with zeros. Commit 226749d made these invalid, and broke the Z80 SDCC
compatibility mode in GAS.
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=226749d5a6ff0d5c607d6428d6c81e1e7e7a994b
This restores SDCC compatibility by replacing the leading zeros with
spaces when inside dollar local labels and when SDCC compatibility is
enabled. It also restores the SDCC test case to represent actual
syntax emitted by SDCC, and adds a note explaining the purpose of
the test.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33030
Diff:
---
gas/config/tc-z80.c | 27 +++++++++++++++++++++++++++
gas/testsuite/gas/z80/sdcc.s | 40 ++++++++++++++++++++++------------------
2 files changed, 49 insertions(+), 18 deletions(-)
diff --git a/gas/config/tc-z80.c b/gas/config/tc-z80.c
index e7f014cb84d..add28a39119 100644
--- a/gas/config/tc-z80.c
+++ b/gas/config/tc-z80.c
@@ -633,6 +633,33 @@ z80_start_line_hook (void)
break;
}
}
+ /* Remove leading zeros from dollar local labels if SDCC compat enabled. */
+ if (sdcc_compat && *input_line_pointer == '0')
+ {
+ char *dollar;
+
+ /* SDCC emits at most one label definition per line, so it is
+ enough to look at only the first label. Hand-written asm
+ might use more, but then it is unlikely to use leading zeros
+ on dollar local labels. */
+
+ /* Place p at the first character after [0-9]+. */
+ for (p = input_line_pointer; *p >= '0' && *p <= '9'; ++p)
+ ;
+
+ /* Is this a dollar sign label?
+ GAS allows spaces between $ and :, but SDCC does not. */
+ if (p[0] == '$' && p[1] == ':')
+ {
+ dollar = p;
+ /* Replace zeros with spaces until the first non-zero,
+ but leave the last character before $ intact (for e.g. 0$:). */
+ for (p = input_line_pointer; *p == '0' && p < dollar - 1; ++p)
+ {
+ *p = ' ';
+ }
+ }
+ }
/* Check for <label>[:] =|([.](EQU|DEFL)) <value>. */
if (is_name_beginner (*input_line_pointer))
{
diff --git a/gas/testsuite/gas/z80/sdcc.s b/gas/testsuite/gas/z80/sdcc.s
index 98994276ced..de2e0aa1498 100644
--- a/gas/testsuite/gas/z80/sdcc.s
+++ b/gas/testsuite/gas/z80/sdcc.s
@@ -1,3 +1,7 @@
+;; This file uses syntax emitted by the Small Device C Compiler. It
+;; is used to test the -sdcc flag to the z80 assembler. Modifications
+;; to this file should take care to keep SDCC syntax.
+
.module longpolls
.optsdcc -mz80
@@ -13,7 +17,7 @@ valueadr = 0x1234
_start::
;comment
ld hl, #4+0
-0$:
+00000$:
adc a, a
adc a, b
adc a, c
@@ -29,7 +33,7 @@ _start::
adc a, (hl)
adc a, 5 (ix)
adc a, -2 (iy)
-100$:
+00100$:
add a, a
add a, b
add a, c
@@ -45,7 +49,7 @@ _start::
add a, (hl)
add a, 5 (ix)
add a, -2 (iy)
-200$:
+00200$:
and a, a
and a, b
and a, c
@@ -61,7 +65,7 @@ _start::
and a, (hl)
and a, 5 (ix)
and a, -2 (iy)
-300$:
+00300$:
cp a, a
cp a, b
cp a, c
@@ -77,7 +81,7 @@ _start::
cp a, (hl)
cp a, 5 (ix)
cp a, -2 (iy)
-400$:
+00400$:
or a, a
or a, b
or a, c
@@ -93,7 +97,7 @@ _start::
or a, (hl)
or a, 5 (ix)
or a, -2 (iy)
-500$:
+00500$:
sbc a, a
sbc a, b
sbc a, c
@@ -109,7 +113,7 @@ _start::
sbc a, (hl)
sbc a, 5 (ix)
sbc a, -2 (iy)
-600$:
+00600$:
sub a, a
sub a, b
sub a, c
@@ -125,7 +129,7 @@ _start::
sub a, (hl)
sub a, 5 (ix)
sub a, -2 (iy)
-700$:
+00700$:
xor a, a
xor a, b
xor a, c
@@ -142,21 +146,21 @@ _start::
xor a, 5 (ix)
xor a, -2 (iy)
- jp 0$
- jp 100$
- jp 200$
- jp 300$
- jp 500$
- jp 600$
- jp 700$
+ jp 00000$
+ jp 00100$
+ jp 00200$
+ jp 00300$
+ jp 00500$
+ jp 00600$
+ jp 00700$
_func:
ld hl,0
ld (hl),#<function
-100$:
+00100$:
inc hl
ld (hl),#>function
-600$:
- jr 100$
+00600$:
+ jr 00100$
_finish::
ld a, 2 (iy)
ld -1 (ix), a
More information about the Binutils-cvs
mailing list