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:
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