shithub: rgbds

Download patch

ref: e3b7339dd626efd40224e58f22b660dc0367f0aa
parent: 69d7f845025dfcc3017e58453273be46a0107993
author: ISSOtm <[email protected]>
date: Fri May 21 05:47:27 EDT 2021

Save UNION stack when using PUSHS as well

This allows using the latter within the former

--- a/src/asm/section.c
+++ b/src/asm/section.c
@@ -20,6 +20,12 @@
 
 uint8_t fillByte;
 
+struct UnionStackEntry {
+	uint32_t start;
+	uint32_t size;
+	struct UnionStackEntry *next;
+} *unionStack = NULL;
+
 struct SectionStackEntry {
 	struct Section *section;
 	struct Section *loadSection;
@@ -26,6 +32,7 @@
 	char const *scope; /* Section's symbol scope */
 	uint32_t offset;
 	int32_t loadOffset;
+	struct UnionStackEntry *unionStack;
 	struct SectionStackEntry *next;
 };
 
@@ -35,12 +42,6 @@
 static struct Section *currentLoadSection = NULL;
 int32_t loadOffset; /* Offset into the LOAD section's parent (see sect_GetOutputOffset) */
 
-struct UnionStackEntry {
-	uint32_t start;
-	uint32_t size;
-	struct UnionStackEntry *next;
-} *unionStack = NULL;
-
 /*
  * A quick check to see if we have an initialized section
  */
@@ -428,6 +429,11 @@
 void sect_SetLoadSection(char const *name, uint32_t type, uint32_t org,
 			 struct SectionSpec const *attribs, enum SectionModifier mod)
 {
+	// Important info: currently, UNION and LOAD cannot interact, since UNION is prohibited in
+	// "code" sections, whereas LOAD is restricted to them.
+	// Therefore, any interactions are NOT TESTED, so lift either of those restrictions at
+	// your own peril! ^^
+
 	if (!checkcodesection())
 		return;
 
@@ -548,6 +554,11 @@
 
 void sect_StartUnion(void)
 {
+	// Important info: currently, UNION and LOAD cannot interact, since UNION is prohibited in
+	// "code" sections, whereas LOAD is restricted to them.
+	// Therefore, any interactions are NOT TESTED, so lift either of those restrictions at
+	// your own peril! ^^
+
 	if (!currentSection) {
 		error("UNIONs must be inside a SECTION\n");
 		return;
@@ -964,22 +975,24 @@
  */
 void sect_PushSection(void)
 {
-	struct SectionStackEntry *sect = malloc(sizeof(*sect));
+	struct SectionStackEntry *entry = malloc(sizeof(*entry));
 
-	if (sect == NULL)
+	if (entry == NULL)
 		fatalerror("No memory for section stack: %s\n",  strerror(errno));
-	sect->section = currentSection;
-	sect->loadSection = currentLoadSection;
-	sect->scope = sym_GetCurrentSymbolScope();
-	sect->offset = curOffset;
-	sect->loadOffset = loadOffset;
-	sect->next = sectionStack;
-	sectionStack = sect;
+	entry->section = currentSection;
+	entry->loadSection = currentLoadSection;
+	entry->scope = sym_GetCurrentSymbolScope();
+	entry->offset = curOffset;
+	entry->loadOffset = loadOffset;
+	entry->unionStack = unionStack;
+	entry->next = sectionStack;
+	sectionStack = entry;
 
 	// Reset the section scope
 	currentSection = NULL;
 	currentLoadSection = NULL;
 	sym_SetCurrentSymbolScope(NULL);
+	unionStack = NULL;
 }
 
 void sect_PopSection(void)
@@ -998,6 +1011,7 @@
 	sym_SetCurrentSymbolScope(entry->scope);
 	curOffset = entry->offset;
 	loadOffset = entry->loadOffset;
+	unionStack = entry->unionStack;
 
 	sectionStack = entry->next;
 	free(entry);
--- /dev/null
+++ b/test/asm/union-pushs.asm
@@ -1,0 +1,25 @@
+
+SECTION "Test", ROM0[0]
+    dw SIZEOF("RAM")
+    dw SIZEOF("HRAM")
+
+SECTION "RAM",WRAM0
+    ds 654
+UNION
+    ds 14
+NEXTU
+    ds 897
+
+PUSHS
+
+SECTION "HRAM",HRAM
+    ds $7F
+
+POPS
+    ds 75
+NEXTU
+    ds 863
+ENDU
+
+    ds 28
+
--- /dev/null
+++ b/test/asm/union-pushs.out.bin
@@ -1,0 +1,1 @@
+v
\ No newline at end of file