shithub: scc

Download patch

ref: 03364b67869bdfc077933d481624896c87986bb9
parent: 4534415354538af9795b3387baac108ead851aab
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Thu Nov 23 03:20:39 EST 2017

[as] Add a list for symbols

This list is needed to run over all the symbols
defined in the object file.

--- a/as/as.h
+++ b/as/as.h
@@ -95,11 +95,11 @@
 struct symbol {
 	String name;
 	unsigned char flags;
-	char pass;
-	char argtype;
-	short desc;
+	unsigned char pass;
+	unsigned char argtype;
 	TUINT value;
 	struct symbol *next;
+	struct symbol *hash;
 };
 
 struct node {
@@ -154,5 +154,5 @@
 extern int pass;
 extern TUINT maxaddr;
 extern int endian;
-extern Symbol *linesym;
+extern Symbol *linesym, *symlist;
 extern char *filename;
--- a/as/symbol.c
+++ b/as/symbol.c
@@ -41,7 +41,7 @@
 static Symbol *hashtbl[HASHSIZ];
 static Alloc *tmpalloc;
 
-Symbol *linesym;
+Symbol *linesym, *symlist;
 
 #ifndef NDEBUG
 void
@@ -55,7 +55,7 @@
 			continue;
 
 		fprintf(stderr, "[%d]", (int) (bp - hashtbl));
-		for (sym = *bp; sym; sym = sym->next) {
+		for (sym = *bp; sym; sym = sym->hash) {
 			fprintf(stderr, " -> %s:%0X:%0X",
 			       sym->name.buf, sym->flags, sym->argtype);
 		}
@@ -79,7 +79,7 @@
 
 	c = toupper(*name);
 	list = &hashtbl[h];
-	for (sym = *list; sym; sym = sym->next) {
+	for (sym = *list; sym; sym = sym->hash) {
 		t = sym->name.buf;
 		if (c != toupper(*t) || casecmp(t, name))
 			continue;
@@ -92,12 +92,11 @@
 	sym = xmalloc(sizeof(*sym));
 	sym->name = newstring(name);
 	sym->flags = FLOCAL | FUNDEF | type;
-	sym->desc = 0;
 	sym->value = 0;
-	sym->next = *list;
-	*list = sym;
+	sym->hash = *list;
+	sym->next = symlist;
 
-	return sym;
+	return symlist = *list = sym;
 }
 
 Symbol *