commit 06266207ce41e9fa1b7c2232b0a0243481287fd6
parent 7d92f9f22004c00fca2fe52a183b8d8e1a1bca6f
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date: Wed, 4 Jun 2025 16:06:01 +0200
cc1: Add support for riscv64
Diffstat:
4 files changed, 210 insertions(+), 0 deletions(-)
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;
+}