scc

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

commit 6c3c992dc8f759f8c4052a4fb0d47d7681282664
parent 23c081533234d616d3cc57e5794ee1b9f2a87b63
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++
MLICENSE | 1+
Msrc/cmd/scc-cc/cc1/Makefile | 1+
Msrc/cmd/scc-cc/cc1/arch.c | 1+
Msrc/cmd/scc-cc/cc1/cc1.h | 1+
Asrc/cmd/scc-cc/cc1/riscv64-sysv.c | 207+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/cmd/scc-cc/cc2/Makefile | 9+++++++++
Dsrc/cmd/scc-cc/cc2/arm64-sysv/peep.c | 8--------
Asrc/cmd/scc-cc/cc2/qbe_riscv64-sysv/Makefile | 14++++++++++++++
Asrc/cmd/scc-cc/cc2/riscv64-sysv/Makefile | 13+++++++++++++
Asrc/cmd/scc-cc/cc2/riscv64-sysv/types.c | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/cmd/scc-cc/posix/cc.c | 14+++++++++++++-
Msrc/cmd/scc-make/main.c | 9+++++++--
Msrc/libc/stdlib/malloc.c | 5++++-
Msrc/libc/stdlib/realloc.c | 4++--
Atests/make/execute/0108-lastopt.sh | 30++++++++++++++++++++++++++++++
Mtests/make/execute/chktest.sh | 1+
17 files changed, 399 insertions(+), 14 deletions(-)

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 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 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\ 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, 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); /* 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; +} 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 $@ 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 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) 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) 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 +}; 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) 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); } 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; 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) { 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 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