shithub: scc

Download patch

ref: 0cea8681bf7c49f8d6bc0f5d4d499afc1b0dfcfd
parent: cb3da529f4c6597fe1ae18704a55b5fa201cac61
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon Apr 4 13:37:06 EDT 2016

[cc2] Add data initilization to QBE

--- a/cc2/arch/qbe/code.c
+++ b/cc2/arch/qbe/code.c
@@ -6,8 +6,79 @@
 #include "../../cc2.h"
 #include "../../../inc/sizes.h"
 
+static char *
+symname(Symbol *sym)
+{
+	static char name[IDENTSIZ+1];
+	static unsigned short id;
 
+	if (sym->name) {
+		switch (sym->kind) {
+		case EXTRN:
+		case GLOB:
+		case PRIVAT:
+			return sym->name;
+		}
+	}
+
+	if (sym->numid == 0 && (sym->numid = ++id) == 0)
+		error(EIDOVER);
+	sprintf(name, ".L%d", sym->numid);
+
+	return name;
+}
+
 static void
+emitconst(Node *np)
+{
+	switch (np->type.size) {
+	case 1:
+		printf("%d", (int) np->u.i & 0xFF);
+		break;
+	case 2:
+		printf("%d", (int) np->u.i & 0xFFFF);
+		break;
+	case 4:
+		printf("%ld", (long) np->u.i & 0xFFFFFFFF);
+		break;
+        case 8:
+                printf("%lld", (long long) np->u.i & 0xFFFFFFFF);
+                break;
+	default:
+		abort();
+	}
+}
+
+static void
+emittree(Node *np)
+{
+	if (!np)
+		return;
+
+	switch (np->op) {
+	case OSTRING:
+		printf("\"%s\"", np->u.s);
+		free(np->u.s);
+		np->u.s = NULL;
+		break;
+	case OCONST:
+		emitconst(np);
+		break;
+	case OADDR:
+		emittree(np->left);
+		break;
+	case MEM:
+		fputs(symname(np->u.sym), stdout);
+		break;
+	default:
+		emittree(np->left);
+		printf(" %c ", np->op);
+		emittree(np->right);
+		break;
+	}
+}
+
+static void
 size2asm(Type *tp)
 {
 	char *s;
@@ -15,7 +86,7 @@
 	/* In qbe we can ignore the aligment because it handles it */
 
 	if (tp->flags & STRF) {
-		abort();
+		s = "b\t";
 	} else {
 		switch (tp->size) {
 		case 1:
@@ -44,7 +115,7 @@
 		return;
 	if (sym->kind == GLOB)
 		fputs("export ", stdout);
-	printf("data $%s = {\n", sym->name);
+	printf("data $%s = {\n", symname(sym));
 	if (sym->type.flags & INITF)
 		return;
 	printf("\tz\t%llu\n}\n", (unsigned long long) sym->type.size);
@@ -53,6 +124,11 @@
 void
 data(Node *np)
 {
+	putchar('\t');
+	size2asm(&np->type);
+	emittree(np);
+	putchar(',');
+	putchar('\n');
 }
 
 void
@@ -63,4 +139,5 @@
 void
 endinit(void)
 {
+	puts("}");
 }
--