scc

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

commit 774054fa8b77986acb2fa39f0bfe2a8c642b32c5
parent 676d846b1588b139ee9192f9e5d5a90f74fa5ec5
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Sat, 10 Feb 2024 22:54:28 +0100

as: Fold labels with known values

When a label has a constant value then it can be fold like
any other number.

Diffstat:
Msrc/cmd/as/expr.c | 21+++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/src/cmd/as/expr.c b/src/cmd/as/expr.c @@ -36,12 +36,25 @@ deltree(Node *np) delete(arena, np); } +static int +constant(Node *np) +{ + if (np->op == NUMBER) + return 1; + if (np->op == IDEN && np->sym->flags & FDEF) + return 1; + return 0; +} + static Node * fold(int op, Node *l, Node *r) { Node *np; TUINT val, lv, rv; + if (!constant(l) || !constant(r)) + return NULL; + lv = l->sym->value; rv = r->sym->value; @@ -115,10 +128,10 @@ binary(int op, Node *l, Node *r) int addr; Node *np; - if (l->op == NUMBER && r->op == NUMBER) - return fold(op, l, r); - else - abort(); + if ((np = fold(op, l, r)) != NULL) + return np; + abort(); + np = node(op, l, r); np->addr = addr;