scc

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

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:
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+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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; +}