Merge remote-tracking branch 'origin/master' - 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 6c3c992dc8f759f8c4052a4fb0d47d7681282664
 (DIR) parent 23c081533234d616d3cc57e5794ee1b9f2a87b63
 (HTM) Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
       Date:   Tue,  5 Aug 2025 14:00:25 +0200
       
       Merge remote-tracking branch 'origin/master'
       
       Diffstat:
         M .gitignore                          |       2 ++
         M LICENSE                             |       1 +
         M src/cmd/scc-cc/cc1/Makefile         |       1 +
         M src/cmd/scc-cc/cc1/arch.c           |       1 +
         M src/cmd/scc-cc/cc1/cc1.h            |       1 +
         A src/cmd/scc-cc/cc1/riscv64-sysv.c   |     207 ++++++++++++++++++++++++++++++
         M src/cmd/scc-cc/cc2/Makefile         |       9 +++++++++
         D src/cmd/scc-cc/cc2/arm64-sysv/peep… |       8 --------
         A src/cmd/scc-cc/cc2/qbe_riscv64-sys… |      14 ++++++++++++++
         A src/cmd/scc-cc/cc2/riscv64-sysv/Ma… |      13 +++++++++++++
         A src/cmd/scc-cc/cc2/riscv64-sysv/ty… |      93 +++++++++++++++++++++++++++++++
         M src/cmd/scc-cc/posix/cc.c           |      14 +++++++++++++-
         M src/cmd/scc-make/main.c             |       9 +++++++--
         M src/libc/stdlib/malloc.c            |       5 ++++-
         M src/libc/stdlib/realloc.c           |       4 ++--
         A tests/make/execute/0108-lastopt.sh  |      30 ++++++++++++++++++++++++++++++
         M tests/make/execute/chktest.sh       |       1 +
       
       17 files changed, 399 insertions(+), 14 deletions(-)
       ---
 (DIR) diff --git a/.gitignore b/.gitignore
       @@ -12,6 +12,7 @@ deps.mk
        /src/cmd/scc-addr2line
        /src/cmd/scc-objcopy
        /src/cmd/scc-objdump/scc-objdump
       +/src/cmd/scc-dump
        /src/cmd/scc-size
        /src/cmd/scc-strip
        /src/cmd/scc-ar
       @@ -29,6 +30,7 @@ deps.mk
        /src/cmd/scc-cc/cc2/cc2-i386-sysv
        /src/cmd/scc-cc/cc2/cc2-qbe_amd64-sysv
        /src/cmd/scc-cc/cc2/cc2-qbe_arm64-sysv
       +/src/cmd/scc-cc/cc2/cc2-qbe_riscv64-sysv
        /src/cmd/scc-cc/cc2/cc2-z80-scc
        /src/cmd/scc-cc/posix/scc
        /src/cmd/scc-cc/posix/scc-cc
 (DIR) diff --git a/LICENSE b/LICENSE
       @@ -27,6 +27,7 @@ ISC License
        (c) 2015 Sören Tempel <soeren+git@soeren-tempel.net>
        (c) 2022 Xavier Del Campo Romero <xavi.dcr@tutanota.com>
        (c) 2018-2021 zerous Naveen Narayanan <zerous@nocebo.space>
       +(c) 2025 Z. Gilboa <writeonce@midipix.org>
        
        Permission to use, copy, modify, and/or distribute this software for any
        purpose with or without fee is hereby granted, provided that the above
 (DIR) diff --git a/src/cmd/scc-cc/cc1/Makefile b/src/cmd/scc-cc/cc1/Makefile
       @@ -20,6 +20,7 @@ OBJS =\
                arch.o\
                amd64-sysv.o\
                arm64-sysv.o \
       +        riscv64-sysv.o \
                i386-sysv.o \
                z80-scc.o\
        
 (DIR) diff --git a/src/cmd/scc-cc/cc1/arch.c b/src/cmd/scc-cc/cc1/arch.c
       @@ -32,6 +32,7 @@ getarch(void)
                } *bp, defs[] = {
                        "amd64-sysv", amd64_sysv,
                        "arm64-sysv", arm64_sysv,
       +                "riscv64-sysv", riscv64_sysv,
                        "i386-sysv", i386_sysv,
                        "z80-scc", z80_scc,
                        NULL, NULL,
 (DIR) diff --git a/src/cmd/scc-cc/cc1/cc1.h b/src/cmd/scc-cc/cc1/cc1.h
       @@ -531,6 +531,7 @@ extern int valid_va_list(Type *tp);
        extern Arch *amd64_sysv(void);
        extern Arch *z80_scc(void);
        extern Arch *arm64_sysv(void);
       +extern Arch *riscv64_sysv(void);
        extern Arch *i386_sysv(void);
        
        /*
 (DIR) diff --git a/src/cmd/scc-cc/cc1/riscv64-sysv.c b/src/cmd/scc-cc/cc1/riscv64-sysv.c
       @@ -0,0 +1,207 @@
       +#include <scc/scc.h>
       +#include "cc1.h"
       +
       +#define RANK_BOOL    0
       +#define RANK_SCHAR   1
       +#define RANK_UCHAR   1
       +#define RANK_CHAR    1
       +#define RANK_SHORT   2
       +#define RANK_USHORT  2
       +#define RANK_INT     3
       +#define RANK_UINT    3
       +#define RANK_LONG    4
       +#define RANK_ULONG   4
       +#define RANK_LLONG   5
       +#define RANK_ULLONG  5
       +#define RANK_FLOAT   6
       +#define RANK_DOUBLE  7
       +#define RANK_LDOUBLE 8
       +
       +static int
       +local_valid_va_list(Type *tp)
       +{
       +        return tp->op == PTR && eqtype(tp->type, va_type, EQUIV);
       +}
       +
       +Arch *
       +riscv64_sysv(void)
       +{
       +        static Arch arch = {
       +                .voidtype = {
       +                        .op = VOID,
       +                        .letter = L_VOID,
       +                },
       +                .pvoidtype = {
       +                        .op = PTR,
       +                        .letter = L_POINTER,
       +                        .prop = TDEFINED,
       +                        .size = 8,
       +                        .align = 8,
       +                },
       +                .booltype = {
       +                        .op = INT,
       +                        .letter = L_BOOL,
       +                        .prop = TDEFINED | TINTEGER | TARITH,
       +                        .size = 1,
       +                        .align = 1,
       +                        .n.rank = RANK_BOOL,
       +                },
       +                .schartype = {
       +                        .op = INT,
       +                        .letter = L_INT8,
       +                        .prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
       +                        .size = 1,
       +                        .align = 1,
       +                        .n.rank = RANK_SCHAR,
       +
       +                },
       +                .uchartype = {
       +                        .op = INT,
       +                        .letter = L_UINT8,
       +                        .prop = TDEFINED | TINTEGER | TARITH,
       +                        .size = 1,
       +                        .align = 1,
       +                        .n.rank = RANK_UCHAR,
       +                },
       +                .chartype = {
       +                        .op = INT,
       +                        .letter = L_INT8,
       +                        .prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
       +                        .size = 1,
       +                        .align = 1,
       +                        .n.rank = RANK_CHAR,
       +                },
       +                .ushorttype = {
       +                        .op = INT,
       +                        .letter = L_UINT16,
       +                        .prop = TDEFINED | TINTEGER | TARITH,
       +                        .size = 2,
       +                        .align = 2,
       +                        .n.rank = RANK_USHORT,
       +
       +                },
       +                .shorttype = {
       +                        .op = INT,
       +                        .letter = L_INT16,
       +                        .prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
       +                        .size = 2,
       +                        .align = 2,
       +                        .n.rank = RANK_SHORT,
       +                },
       +                .uinttype = {
       +                        .op = INT,
       +                        .letter = L_UINT32,
       +                        .prop = TDEFINED | TINTEGER | TARITH,
       +                        .size = 4,
       +                        .align = 4,
       +                        .n.rank = RANK_UINT,
       +                },
       +                .inttype = {
       +                        .op = INT,
       +                        .letter = L_INT32,
       +                        .prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
       +                        .size = 4,
       +                        .align = 4,
       +                        .n.rank = RANK_INT,
       +                },
       +                .longtype = {
       +                        .op = INT,
       +                        .letter = L_INT64,
       +                        .prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
       +                        .size = 8,
       +                        .align = 8,
       +                        .n.rank = RANK_LONG,
       +                },
       +                .ulongtype = {
       +                        .op = INT,
       +                        .letter = L_UINT64,
       +                        .prop = TDEFINED | TINTEGER | TARITH,
       +                        .size = 8,
       +                        .align = 8,
       +                        .n.rank = RANK_ULONG,
       +                },
       +                .ullongtype = {
       +                        .op = INT,
       +                        .letter = L_UINT64,
       +                        .prop = TDEFINED | TINTEGER | TARITH,
       +                        .size = 8,
       +                        .align = 8,
       +                        .n.rank = RANK_ULLONG,
       +                },
       +                .llongtype = {
       +                        .op = INT,
       +                        .letter = L_INT64,
       +                        .prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
       +                        .size = 8,
       +                        .align = 8,
       +                        .n.rank = RANK_LLONG,
       +                },
       +                .floattype = {
       +                        .op = FLOAT,
       +                        .letter = L_FLOAT,
       +                        .prop = TDEFINED | TARITH,
       +                        .size = 4,
       +                        .align = 4,
       +                        .n.rank = RANK_FLOAT,
       +                },
       +                .doubletype = {
       +                        .op = FLOAT,
       +                        .letter = L_DOUBLE,
       +                        .prop = TDEFINED | TARITH,
       +                        .size = 8,
       +                        .align = 8,
       +                        .n.rank = RANK_DOUBLE,
       +                },
       +                .ldoubletype = {
       +                        .op = FLOAT,
       +                        .letter = L_LDOUBLE,
       +                        .prop = TDEFINED | TARITH,
       +                        .size = 16,
       +                        .align = 16,
       +                        .n.rank = RANK_LDOUBLE,
       +                },
       +                .sizettype = {
       +                        .op = INT,
       +                        .letter = L_UINT64,
       +                        .prop = TDEFINED | TINTEGER | TARITH,
       +                        .size = 8,
       +                        .align = 8,
       +                        .n.rank = RANK_UINT,
       +                },
       +                .pdifftype = {
       +                        .op = INT,
       +                        .letter = L_INT64,
       +                        .prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
       +                        .size = 8,
       +                        .align = 8,
       +                        .n.rank = RANK_LONG,
       +                },
       +                .ellipsistype = {
       +                        .op = ELLIPSIS,
       +                        .letter = L_ELLIPSIS,
       +                        .prop = TDEFINED,
       +                },
       +                .va_type = {
       +                        .op = STRUCT,
       +                        .letter = L_VA_ARG,
       +                        .prop = TDEFINED,
       +                        .size = 24,
       +                        .align = 8,
       +                },
       +                .wchartype = {
       +                        .op = INT,
       +                        .letter = L_UINT32,
       +                        .prop = TDEFINED | TINTEGER | TARITH | TSIGNED,
       +                        .size = 4,
       +                        .align = 4,
       +                        .n.rank = RANK_INT,
       +                },
       +        };
       +
       +        sizettype = &arch.sizettype;
       +        arch.va_list_type = *mktype(&arch.va_type, ARY, 1, NULL);
       +        arch.pvoidtype.type = &arch.voidtype;
       +        arch.valid_va_list = local_valid_va_list;
       +
       +        return &arch;
       +}
 (DIR) diff --git a/src/cmd/scc-cc/cc2/Makefile b/src/cmd/scc-cc/cc2/Makefile
       @@ -7,6 +7,7 @@ DIRS =\
                qbe\
                qbe_amd64-sysv\
                qbe_arm64-sysv\
       +        qbe_riscv64-sysv\
                z80-scc\
        
        PROJECTDIR = ../../../..
       @@ -35,6 +36,10 @@ QBE_ARM64_SYSV_OBJS=\
                qbe_arm64-sysv/builtin.o\
                $(QBE_OBJS)\
        
       +QBE_RISCV64_SYSV_OBJS=\
       +        qbe_riscv64-sysv/builtin.o\
       +        $(QBE_OBJS)\
       +
        Z80_SCC_OBJS =\
                z80-scc/builtin.o\
                $(OBJS) \
       @@ -42,6 +47,7 @@ Z80_SCC_OBJS =\
        TARGET  =\
                cc2-qbe_amd64-sysv\
                cc2-qbe_arm64-sysv\
       +        cc2-qbe_riscv64-sysv\
                cc2-z80-scc\
        
        all:
       @@ -65,6 +71,9 @@ cc2-qbe_amd64-sysv: $(LIBSCC) $(QBE_AMD64_SYSV_OBJS)
        cc2-qbe_arm64-sysv: $(LIBSCC) $(QBE_ARM64_SYSV_OBJS)
                $(CC) $(PROJ_LDFLAGS) $(QBE_ARM64_SYSV_OBJS) $(PROJ_LDLIBS) -o $@
        
       +cc2-qbe_riscv64-sysv: $(LIBSCC) $(QBE_RISCV64_SYSV_OBJS)
       +        $(CC) $(PROJ_LDFLAGS) $(QBE_RISCV64_SYSV_OBJS) $(PROJ_LDLIBS) -o $@
       +
        cc2-z80-scc: $(LIBSCC) $(Z80_SCC_OBJS)
                $(CC) $(PROJ_LDFLAGS) $(Z80_SCC_OBJS) $(PROJ_LDLIBS) -o $@
        
 (DIR) diff --git a/src/cmd/scc-cc/cc2/arm64-sysv/peep.c b/src/cmd/scc-cc/cc2/arm64-sysv/peep.c
       @@ -1,7 +0,0 @@
       -#include <scc/scc.h>
       -#include "../cc2.h"
       -
       -void
       -peephole(void)
       -{
       -}
       -\ No newline at end of file
 (DIR) diff --git a/src/cmd/scc-cc/cc2/qbe_riscv64-sysv/Makefile b/src/cmd/scc-cc/cc2/qbe_riscv64-sysv/Makefile
       @@ -0,0 +1,14 @@
       +.POSIX:
       +
       +PROJECTDIR = ../../../../..
       +include $(PROJECTDIR)/scripts/rules.mk
       +
       +
       +OBJS =\
       +        ../riscv64-sysv/types.o\
       +        ../qbe/builtin.o\
       +
       +all: builtin.o
       +
       +builtin.o: $(OBJS)
       +        $(LD) -r -o $@ $(OBJS)
 (DIR) diff --git a/src/cmd/scc-cc/cc2/riscv64-sysv/Makefile b/src/cmd/scc-cc/cc2/riscv64-sysv/Makefile
       @@ -0,0 +1,13 @@
       +.POSIX:
       +
       +PROJECTDIR = ../../../../..
       +include $(PROJECTDIR)/scripts/rules.mk
       +
       +
       +OBJS =\
       +        types.o \
       +
       +all: builtin.o
       +
       +builtin.o: $(OBJS)
       +        $(LD) -r -o $@ $(OBJS)
 (DIR) diff --git a/src/cmd/scc-cc/cc2/riscv64-sysv/types.c b/src/cmd/scc-cc/cc2/riscv64-sysv/types.c
       @@ -0,0 +1,93 @@
       +#include <scc/scc.h>
       +
       +#include "../cc2.h"
       +
       +
       +Type int8type = {
       +        .flags  = SIGNF | INTF,
       +        .size   = 1,
       +        .align  = 1
       +};
       +
       +Type int16type = {
       +        .flags  = SIGNF | INTF,
       +        .size   = 2,
       +        .align  = 2
       +};
       +
       +Type int32type = {
       +        .flags  = SIGNF | INTF,
       +        .size   = 4,
       +        .align  = 4
       +};
       +
       +Type int64type = {
       +        .flags  = SIGNF | INTF,
       +        .size   = 8,
       +        .align  = 8
       +};
       +
       +Type uint8type = {
       +        .flags  = INTF,
       +        .size   = 1,
       +        .align  = 1
       +};
       +
       +Type uint16type = {
       +        .flags  = INTF,
       +        .size   = 2,
       +        .align  = 2
       +};
       +
       +Type uint32type = {
       +        .flags  = INTF,
       +        .size   = 4,
       +        .align  = 4
       +};
       +
       +Type uint64type = {
       +        .flags  = INTF,
       +        .size   = 8,
       +        .align  = 8
       +};
       +
       +Type ptrtype = {
       +        .flags  = INTF,
       +        .size   = 8,
       +        .align  = 8
       +};
       +
       +Type booltype = {
       +        .flags  = INTF,
       +        .size   = 1,
       +        .align  = 1
       +};
       +
       +Type float32type = {
       +        .flags  = FLOATF,
       +        .size   = 4,
       +        .align  = 4
       +};
       +
       +Type float64type = {
       +        .flags  = FLOATF,
       +        .size   = 8,
       +        .align  = 8
       +};
       +
       +Type float80type = {
       +        .flags  = FLOATF,
       +        .size   = 16,
       +        .align  = 16
       +};
       +
       +Type voidtype = {
       +        .size = 0,
       +        .align = 0
       +};
       +
       +Type arg_type = {
       +        .flags = ARRF,
       +        .size = 24,
       +        .align = 8
       +};
 (DIR) diff --git a/src/cmd/scc-cc/posix/cc.c b/src/cmd/scc-cc/posix/cc.c
       @@ -163,7 +163,7 @@ addarg(int tool, char *arg)
        static char *
        cc2fmt(int tool)
        {
       -        if (Qflag && !strcmp(arch, "amd64") && !strcmp(abi, "sysv"))
       +        if (Qflag)
                        return "%s/libexec/scc/%s-qbe_%s-%s";
                return "%s/libexec/scc/%s-%s-%s";
        }
       @@ -242,6 +242,18 @@ settool(int tool, char *infile, int nexttool)
                        break;
                case QBE:
                        strcpy(t->cmd, "qbe");
       +
       +                if (!strcmp(arch, "amd64") && !strcmp(abi, "sysv"))
       +                        fmt = "amd64_sysv";
       +                else if (!strcmp(arch, "arm64") && !strcmp(abi, "sysv"))
       +                        fmt = "arm64";
       +                else if (!strcmp(arch, "riscv64") && !strcmp(abi, "sysv"))
       +                        fmt = "rv64";
       +                else
       +                        die("not supported arch-abi (%s-%s) for qbe", arch, abi);
       +
       +                addarg(tool, "-t");
       +                addarg(tool, fmt);
                        break;
                case LD:
                        if (!outfile)
 (DIR) diff --git a/src/cmd/scc-make/main.c b/src/cmd/scc-make/main.c
       @@ -228,15 +228,20 @@ static void
        parseargv(char **argv, char ***targets, int where, int export)
        {
                char *s;
       +        char *hm = NULL;
        
                for ( ; *argv; ++argv) {
                        s = *argv;
       -                if (s[0] != '-') {
       +                if (hm == NULL && strcmp(s, "--") == 0) {
       +                        hm = *argv;
       +                } else if (hm && s[0] == '-') {
       +                        break;
       +                } else if (s[0] != '-') {
                                if (!assign(s, where, export))
                                        break;
                                continue;
                        }
       -                while (*++s)
       +                while (hm == NULL && *++s)
                                parseflag(*s, &s, &argv);
                }
        
 (DIR) diff --git a/src/libc/stdlib/malloc.c b/src/libc/stdlib/malloc.c
       @@ -1,3 +1,4 @@
       +#include <errno.h>
        #include <stdint.h>
        #include <stdlib.h>
        #include <string.h>
       @@ -136,8 +137,10 @@ malloc(size_t nbytes)
                Header *cur, *prev;
                size_t nunits;
        
       -        if (nbytes == 0 || nbytes > SIZE_MAX - sizeof(Header)-1)
       +        if (nbytes > SIZE_MAX - sizeof(Header)-1) {
       +                errno = ENOMEM;
                        return NULL;
       +        }
        
                /* 1 unit for header plus enough units to fit nbytes */
                nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;
 (DIR) diff --git a/src/libc/stdlib/realloc.c b/src/libc/stdlib/realloc.c
       @@ -13,8 +13,8 @@ realloc(void *ptr, size_t nbytes)
                size_t nunits, avail, onbytes, n;
        
                if (nbytes == 0) {
       -                errno = EINVAL;
       -                return NULL;
       +                free(ptr);
       +                ptr = NULL;
                }
        
                if (nbytes > SIZE_MAX - sizeof(Header)-1) {
 (DIR) diff --git a/tests/make/execute/0108-lastopt.sh b/tests/make/execute/0108-lastopt.sh
       @@ -0,0 +1,30 @@
       +#!/bin/sh
       +
       +trap 'rm -f $tmp1 $tmp2' EXIT INT QUIT TERM HUP
       +
       +tmp1=tmp1.$$
       +tmp2=tmp2.$$
       +
       +cat > $tmp1 <<EOF
       +hyphen-target
       +MYVAR is -42
       +MYVAR is myval
       +EOF
       +
       +(scc make -f- -- -42 <<'EOF'
       +-42:
       +        @echo 'hyphen-target'
       +EOF
       +
       +scc make -f- -- MYVAR=-42 <<'EOF'
       +all:
       +        @@echo MYVAR is $(MYVAR)
       +EOF
       +
       +scc make -f- -- MYVAR=myval -42 <<'EOF'
       +-42:
       +        @echo MYVAR is $(MYVAR)
       +EOF
       +) > $tmp2
       +
       +diff $tmp1 $tmp2
 (DIR) diff --git a/tests/make/execute/chktest.sh b/tests/make/execute/chktest.sh
       @@ -5,6 +5,7 @@ rm -f test.log
        
        unset CFLAGS
        unset CC
       +unset MAKEFLAGS
        
        for i in *-*.sh
        do