scc

Simple C99 Compiler
Log | Files | Refs | README | LICENSE

commit 70a260148ff33185ce8e70b3dbd46a15c0ff5aaf
parent 4a4f4ec1004bd0ccc457377724a596976dcc0df8
Author: Roberto E. Vargas Caballero <roberto.vargas@igrid-td.com>
Date:   Mon,  4 Apr 2016 09:27:01 +0200

[cc2] Add basic implementation of defsym()

This is a first implementation which a limited implementation of
sigil() and of size2asm() that, for instance, does not support
strings.

Diffstat:
cc2/arch/qbe/code.c | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 61 insertions(+), 0 deletions(-)

diff --git a/cc2/arch/qbe/code.c b/cc2/arch/qbe/code.c @@ -6,10 +6,71 @@ #include "../../cc2.h" #include "../../../inc/sizes.h" +/* + * : is for user-defined Aggregate Types + * $ is for globals (represented by a pointer) + * % is for function-scope temporaries + * @ is for block labels + */ +static char +sigil(Symbol *sym) +{ + switch (sym->kind) { + case EXTRN: + case GLOB: + case PRIVAT: + case LOCAL: + return '$'; + case AUTO: + case REG: + return '%'; + default: + abort(); + } +} + +static void +size2asm(Type *tp) +{ + char *s; + + if (tp->flags & STRF) { + abort(); + } else { + switch (tp->size) { + case 1: + s = "b\t"; + break; + case 2: + s = "h\t"; + break; + case 4: + s = "w\t"; + break; + case 8: + s = "q\t"; + break; + default: + s = "z\t%llu\t"; + break; + } + } + printf(s, (unsigned long long) tp->size); +} void defsym(Symbol *sym, int alloc) { + if (!alloc) + return; + if (sym->kind == GLOB) + fputs("export ", stdout); + printf("data %c%s = {\n", sigil(sym), sym->name); + if (sym->type.flags & INITF) + return; + putchar('\t'); + size2asm(&sym->type); + puts("0\n}"); } void