as: Fold labels with known values - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 774054fa8b77986acb2fa39f0bfe2a8c642b32c5
 (DIR) parent 676d846b1588b139ee9192f9e5d5a90f74fa5ec5
 (HTM) 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:
         M src/cmd/as/expr.c                   |      21 +++++++++++++++++----
       
       1 file changed, 17 insertions(+), 4 deletions(-)
       ---
 (DIR) 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;