shithub: scc

Download patch

ref: ce613941ca74c13ee46efba525a9c1c721715a2c
parent: 537a655de72c1d487584e9c65c8ba53c00ae1f6b
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon Apr 4 05:27:01 EDT 2016

[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.

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