scc

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

commit d30f4c927a51ab0ffbc9ec5f049c545be5f22999
parent 40988072e3c4e62f84955db9615aa2a1d6c4763d
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Thu,  3 Nov 2022 22:17:44 +0100

cc2/qbe: Add support for struct parameters

Aggregate parameters cannot be represented using sigils
and for that reason is needed to generate qbe type
definitions to be used when they are passed as function
parameters.

Diffstat:
Msrc/cmd/cc/cc2/cc2.h | 2++
Msrc/cmd/cc/cc2/parser.c | 2++
Msrc/cmd/cc/cc2/target/amd64-sysv/code.c | 5+++++
Msrc/cmd/cc/cc2/target/i386-sysv/code.c | 5+++++
Msrc/cmd/cc/cc2/target/qbe/cgen.c | 7++++++-
Msrc/cmd/cc/cc2/target/qbe/code.c | 22++++++++++++++++++++--
Msrc/cmd/cc/cc2/target/z80-scc/code.c | 5+++++
7 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/src/cmd/cc/cc2/cc2.h b/src/cmd/cc/cc2/cc2.h @@ -153,6 +153,7 @@ typedef struct inst Inst; struct type { unsigned long size; unsigned long align; + unsigned short id; short flags; }; @@ -235,6 +236,7 @@ extern Node *constnode(Node *np, TUINT n, Type *tp); extern Node *tmpnode(Type *); extern Symbol *newlabel(void); extern void pprint(char *s); +extern void deftype(Type *); /* node.c */ #define SETCUR 1 diff --git a/src/cmd/cc/cc2/parser.c b/src/cmd/cc/cc2/parser.c @@ -176,6 +176,7 @@ composed(char *token, union tokenop u) Symbol *sym; sym = getsym(atoi(token+1)); + sym->type.id = sym->id; push(&sym->type); } @@ -550,6 +551,7 @@ aggregate(void) */ sym = (Symbol *) tp; sym->name = name; + deftype(tp); delnode(align); delnode(size); diff --git a/src/cmd/cc/cc2/target/amd64-sysv/code.c b/src/cmd/cc/cc2/target/amd64-sysv/code.c @@ -179,6 +179,11 @@ defglobal(Symbol *sym) } void +deftype(Type *tp) +{ +} + +void defvar(Symbol *sym) { } diff --git a/src/cmd/cc/cc2/target/i386-sysv/code.c b/src/cmd/cc/cc2/target/i386-sysv/code.c @@ -178,6 +178,11 @@ defglobal(Symbol *sym) } void +deftype(Type *tp) +{ +} + +void defpar(Symbol *sym) { } diff --git a/src/cmd/cc/cc2/target/qbe/cgen.c b/src/cmd/cc/cc2/target/qbe/cgen.c @@ -468,6 +468,8 @@ function(void) for (p = locals; p; p = p->next) { if ((p->type.flags & PARF) == 0) continue; + if ((p->type.flags & AGGRF) != 0) + continue; code(ASALLOC, label2node(&aux, p), NULL, NULL); } @@ -484,7 +486,10 @@ function(void) for (p = locals; p; p = p->next) { if ((p->type.flags & PARF) == 0) continue; - code(ASFORM, label2node(&aux, p), NULL, NULL); + if ((p->type.flags & AGGRF) != 0) + continue; + if ((p->type.flags & (ARRF|AGGRF)) == 0) + code(ASFORM, label2node(&aux, p), NULL, NULL); } return NULL; } diff --git a/src/cmd/cc/cc2/target/qbe/code.c b/src/cmd/cc/cc2/target/qbe/code.c @@ -266,6 +266,8 @@ emittree(Node *np) static char * size2asm(Type *tp) { + static char spec[ADDR_LEN]; + if (tp->flags & STRF) { return "b"; } else if (tp->flags & INTF) { @@ -285,6 +287,7 @@ size2asm(Type *tp) else if (tp->size == 8) return "d"; } + abort(); } @@ -334,6 +337,8 @@ data(Node *np) static char * size2stack(Type *tp) { + static char spec[ADDR_LEN]; + if (tp->flags & INTF) { switch (tp->size) { case 1: @@ -348,6 +353,9 @@ size2stack(Type *tp) return "s"; else if (tp->size == 8) return "d"; + } else if (tp->flags & (ARRF|AGGRF)) { + sprintf(spec, ":.%u", tp->id); + return spec; } else if (tp->size == 0) { return "w"; } @@ -355,11 +363,18 @@ size2stack(Type *tp) } void +deftype(Type *tp) +{ + printf("type :.%u = align %d { %lu }\n", + tp->id, tp->align, tp->size); +} + +void writeout(void) { Symbol *p; Type *tp; - char *sep, *name; + char *sep; int haslabel = 0; if (!curfun) @@ -373,7 +388,10 @@ writeout(void) for (p = locals; p; p = p->next) { if ((p->type.flags & PARF) == 0) continue; - printf("%s%s %s.val", sep, size2stack(&p->type), symname(p)); + printf("%s%s %s%s", + sep, size2stack(&p->type), + symname(p), + (p->type.flags & AGGRF) ? "" : ".val"); sep = ","; } printf("%s)\n{\n", (curfun->type.flags&ELLIPS) ? ", ..." : ""); diff --git a/src/cmd/cc/cc2/target/z80-scc/code.c b/src/cmd/cc/cc2/target/z80-scc/code.c @@ -194,6 +194,11 @@ defvar(Symbol *sym) } void +deftype(Type *tp) +{ +} + +void defglobal(Symbol *sym) { label(sym);