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