scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit fbbb55d7a577fa91580b836acccfb44e23ca3084
parent 34ac4d9aeeace5c62f6e08195da7bf9fa7e0b17a
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sat, 10 Feb 2024 23:31:55 +0100

as: Fix matching against symbols

All the targets where checking incorrectly
against symbol, and they forced to use immediates
for symbols forcing to do things like:

	.EQU	$main,$1

instead of the normal

	.EQU	main,$1

Diffstat:
Msrc/cmd/as/parser.c | 12+++++++++++-
Msrc/cmd/as/target/powerpc/ins.c | 2+-
Msrc/cmd/as/target/x80/ins.c | 2+-
Msrc/cmd/as/target/x86/ins.c | 2+-
4 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/cmd/as/parser.c b/src/cmd/as/parser.c @@ -273,7 +273,7 @@ regctx(int mode) Node * operand(char **strp) { - int imm = 0; + int c, imm = 0; Node *np; textp = *strp; @@ -291,10 +291,20 @@ operand(char **strp) np->addr = ASTR; next(); break; + case IDEN: + c = ahead(); + if (c != EOS && c != ',') + goto expression; + np = node(IDEN, NULL, NULL); + np->sym = yylval.sym; + np->addr = ANUMBER; + next(); + break; case '$': next(); imm = 1; default: + expression: if (!imm) { np = moperand(); } else { diff --git a/src/cmd/as/target/powerpc/ins.c b/src/cmd/as/target/powerpc/ins.c @@ -97,7 +97,7 @@ match(Op *op, Node **args) error("overflow in immediate operand"); break; case ASYM: - if (np->addr != AIMM || np->op != IDEN) + if (np->op != IDEN) return 0; break; case ADIRECT: diff --git a/src/cmd/as/target/x80/ins.c b/src/cmd/as/target/x80/ins.c @@ -191,7 +191,7 @@ match(Op *op, Node **args) error("overflow in immediate operand"); break; case ASYM: - if (np->addr != AIMM || np->op != IDEN) + if (np->op != IDEN) return 0; break; case ADIRECT: diff --git a/src/cmd/as/target/x86/ins.c b/src/cmd/as/target/x86/ins.c @@ -228,7 +228,7 @@ match(Op *op, Node **args) error("overflow in immediate operand"); break; case ASYM: - if (np->addr != AIMM || np->op != IDEN) + if (np->op != IDEN) return 0; break; case ADIRECT: