shithub: scc

Download patch

ref: e1468117aa0dcf5b43dfec797a8dbfb3531d3bff
parent: 09fa67e950f46b3c661d5d1e34623b2c7177f6d1
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Sat Aug 9 14:31:49 EDT 2014

Emit preamble only when it is needed

If there is no local variables in stac don't emit the preamble
because is useless. This causes that backtraces cannot be generated,
so emit preamble always in debug mode.

--- a/cc2/cgen.c
+++ b/cc2/cgen.c
@@ -79,15 +79,24 @@
 void
 cgen(Symbol *sym, Node *list[])
 {
+	extern char odebug;
+	char frame = sym->u.f.stack != 0 || odebug;
+
 	emit(ADDR, sym->u.f.name);
-	emit(PUSH, IX);
-	emit(LD, IX, SP);
-	emit(LDI, HL, -sym->u.f.stack);
-	emit(ADD, HL, SP);
-	emit(LD, SP, HL);
-	emit(LD, SP, IX);
-	emit(POP, IX);
-	emit(RET);
+	if (frame) {
+		emit(PUSH, IX);
+		emit(LD, IX, SP);
+		emit(LDI, HL, -sym->u.f.stack);
+		emit(ADD, HL, SP);
+		emit(LD, SP, HL);
+	}
+
+
+	if (frame) {
+		emit(LD, SP, IX);
+		emit(POP, IX);
+		emit(RET);
+	}
 }
 
 /*
--- a/cc2/main.c
+++ b/cc2/main.c
@@ -11,6 +11,8 @@
 
 extern void parse(void);
 
+char odebug;
+
 void
 error(unsigned nerror, ...)
 {
--