shithub: rgbds

Download patch

ref: 4877bb783cfd7ef9ec8190c71663c68530024026
parent: 275b8e15ff2eb13eeeef9e8d60783ffa839007e6
author: ISSOtm <[email protected]>
date: Sat Mar 21 21:46:10 EDT 2020

Add more tests for unionized sections + fix bugs

Implementing those tests found a few bugs... oops

--- a/src/asm/section.c
+++ b/src/asm/section.c
@@ -155,6 +155,10 @@
 				if (pSect->nOrg != -1 && pSect->nOrg != org)
 					fail("Section \"%s\" already declared as fixed at different address $%x",
 					     pSect->pzName, pSect->nOrg);
+				else if (pSect->nAlign != 0
+				      && ((pSect->nAlign - 1) & org))
+					fail("Section \"%s\" already declared as aligned to %u bytes",
+					     pSect->pzName, pSect->nAlign);
 				else
 					/* Otherwise, just override */
 					pSect->nOrg = org;
@@ -207,7 +211,7 @@
 					fail("Section \"%s\" already declared as unaligned",
 					     pSect->pzName);
 				else
-					fail("Section \"%s\" already declared as aligned to %u bits",
+					fail("Section \"%s\" already declared as aligned to %u bytes",
 					     pSect->pzName, pSect->nAlign);
 			}
 		}
--- a/src/link/section.c
+++ b/src/link/section.c
@@ -38,6 +38,10 @@
 
 static void mergeSections(struct Section *target, struct Section *other)
 {
+	if (target->type != other->type)
+		errx(1, "Section \"%s\" is defined with conflicting types %s and %s",
+		     other->name,
+		     typeNames[target->type], typeNames[other->type]);
 	if (other->isAddressFixed) {
 		if (target->isAddressFixed) {
 			if (target->org != other->org)
--- a/test/asm/section-union.err
+++ b/test/asm/section-union.err
@@ -3,6 +3,6 @@
 ERROR: section-union.asm(37):
     Section "test" already declared as fixed at $c000
 ERROR: section-union.asm(37):
-    Section "test" already declared as aligned to 256 bits
+    Section "test" already declared as aligned to 256 bytes
 ERROR: section-union.asm(37):
     Cannot create section "test" (3 errors)
--- a/test/link/section-union/a.asm
+++ /dev/null
@@ -1,21 +1,0 @@
-SECTION UNION "a", WRAM0
-	ds 10
-a1:
-
-SECTION UNION "b", WRAMX,ALIGN[4]
-banked::
-	ds 10
-b1:
-
-SECTION UNION "c", HRAM[$FFC0]
-	ds 5
-c1::
-
-
-SECTION "output 1", ROM0
-	dw a1,a2 ; $C00A, $C02A
-	dw b1,b2 ; $DABA, $DAB2
-	dw c1,c2 ; $FFC5, $FFC5
-
-SECTION "output 3", ROM0
-	db BANK(banked)
--- /dev/null
+++ b/test/link/section-union/align-conflict.asm
@@ -1,0 +1,10 @@
+IF !DEF(SECOND)
+ATTRS equs ",ALIGN[2]"
+ELSE
+ATTRS equs "[$CAFE]"
+ENDC
+
+SECTION UNION "conflicting alignment", WRAM0 ATTRS
+	db
+
+	PURGE ATTRS
--- /dev/null
+++ b/test/link/section-union/align-conflict.out
@@ -1,0 +1,6 @@
+error: Section "conflicting alignment" is defined with conflicting 4-byte alignment and address $cafe
+---
+ERROR: -(18):
+    Section "conflicting alignment" already declared as aligned to 4 bytes
+ERROR: -(18):
+    Cannot create section "conflicting alignment" (1 errors)
--- a/test/link/section-union/b.asm
+++ /dev/null
@@ -1,18 +1,0 @@
-SECTION UNION "a", WRAM0
-a1: ; This is here to check that the two `a1` don't conflict
-	ds 42
-a2::
-
-SECTION UNION "b", WRAMX[$DAB0]
-	ds 2
-b2::
-
-SECTION UNION "c", HRAM[$FFC0]
-b1: ; Same but in different sections now
-	ds 5
-c2::
-
-SECTION "output 2", ROM0
-	dw a1,a2
-	dw b1,b2
-	dw c1,c2
--- /dev/null
+++ b/test/link/section-union/bad-types.asm
@@ -1,0 +1,10 @@
+IF !DEF(SECOND)
+TYPE equs "HRAM"
+ELSE
+TYPE equs "WRAM0"
+ENDC
+
+SECTION UNION "conflicting types", TYPE
+	db
+
+	PURGE TYPE
--- /dev/null
+++ b/test/link/section-union/bad-types.out
@@ -1,0 +1,6 @@
+error: Section "conflicting types" is defined with conflicting types HRAM and WRAM0
+---
+ERROR: -(18):
+    Section "conflicting types" already exists but with type HRAM
+ERROR: -(18):
+    Cannot create section "conflicting types" (1 errors)
--- /dev/null
+++ b/test/link/section-union/bank-conflict.asm
@@ -1,0 +1,8 @@
+IF !DEF(SECOND)
+SECOND equs "4"
+ENDC
+
+SECTION UNION "conflicting banks", WRAMX, BANK[SECOND]
+	db
+
+	PURGE SECOND
--- /dev/null
+++ b/test/link/section-union/bank-conflict.out
@@ -1,0 +1,6 @@
+error: Section "conflicting banks" is defined with conflicting banks 4 and 1
+---
+ERROR: -(14):
+    Section "conflicting banks" already declared with different bank 4
+ERROR: -(14):
+    Cannot create section "conflicting banks" (1 errors)
--- /dev/null
+++ b/test/link/section-union/data-overlay.asm
@@ -1,0 +1,10 @@
+IF !DEF(SECOND)
+DATA equs "ds 4"
+ELSE
+DATA equs "db $aa, $bb, $cc, $dd"
+ENDC
+
+SECTION UNION "overlaid data", ROM0
+	DATA
+
+	PURGE DATA
--- /dev/null
+++ b/test/link/section-union/data-overlay.out
@@ -1,0 +1,6 @@
+error: Section "overlaid data" is of type ROM0, which cannot be unionized
+---
+ERROR: -(18):
+    Cannot declare ROM sections as UNION
+ERROR: -(18):
+    Cannot create section "overlaid data" (1 errors)
--- /dev/null
+++ b/test/link/section-union/different-data.asm
@@ -1,0 +1,8 @@
+IF !DEF(SECOND)
+DATA = 1
+ELSE
+DATA = 2
+ENDC
+
+SECTION UNION "different data", ROM0
+	db DATA
--- /dev/null
+++ b/test/link/section-union/different-data.out
@@ -1,0 +1,6 @@
+error: Section "different data" is of type ROM0, which cannot be unionized
+---
+ERROR: -(16):
+    Cannot declare ROM sections as UNION
+ERROR: -(16):
+    Cannot create section "different data" (1 errors)
--- /dev/null
+++ b/test/link/section-union/different-size.asm
@@ -1,0 +1,8 @@
+IF !DEF(SECOND)
+SIZE = 69
+ELSE
+SIZE = 420
+ENDC
+
+SECTION UNION "different section sizes", ROM0
+	ds SIZE
--- /dev/null
+++ b/test/link/section-union/different-size.out
@@ -1,0 +1,6 @@
+error: Section "different section sizes" is of type ROM0, which cannot be unionized
+---
+ERROR: -(16):
+    Cannot declare ROM sections as UNION
+ERROR: -(16):
+    Cannot create section "different section sizes" (1 errors)
--- /dev/null
+++ b/test/link/section-union/different-syntaxes.asm
@@ -1,0 +1,10 @@
+IF !DEF(SECOND)
+INSTR equs "sbc a"
+ELSE
+INSTR equs "db $9f"
+ENDC
+
+SECTION UNION "different syntaxes", ROM0
+	INSTR
+
+	PURGE INSTR
--- /dev/null
+++ b/test/link/section-union/different-syntaxes.out
@@ -1,0 +1,6 @@
+error: Section "different syntaxes" is of type ROM0, which cannot be unionized
+---
+ERROR: -(18):
+    Cannot declare ROM sections as UNION
+ERROR: -(18):
+    Cannot create section "different syntaxes" (1 errors)
--- /dev/null
+++ b/test/link/section-union/good/a.asm
@@ -1,0 +1,21 @@
+SECTION UNION "a", WRAM0
+	ds 10
+a1:
+
+SECTION UNION "b", WRAMX,ALIGN[4]
+banked::
+	ds 10
+b1:
+
+SECTION UNION "c", HRAM[$FFC0]
+	ds 5
+c1::
+
+
+SECTION "output 1", ROM0
+	dw a1,a2 ; $C00A, $C02A
+	dw b1,b2 ; $DABA, $DAB2
+	dw c1,c2 ; $FFC5, $FFC5
+
+SECTION "output 3", ROM0
+	db BANK(banked)
--- /dev/null
+++ b/test/link/section-union/good/b.asm
@@ -1,0 +1,18 @@
+SECTION UNION "a", WRAM0
+a1: ; This is here to check that the two `a1` don't conflict
+	ds 42
+a2::
+
+SECTION UNION "b", WRAMX[$DAB0]
+	ds 2
+b2::
+
+SECTION UNION "c", HRAM[$FFC0]
+b1: ; Same but in different sections now
+	ds 5
+c2::
+
+SECTION "output 2", ROM0
+	dw a1,a2
+	dw b1,b2
+	dw c1,c2
binary files /dev/null b/test/link/section-union/good/ref.out.bin differ
--- /dev/null
+++ b/test/link/section-union/good/script.link
@@ -1,0 +1,9 @@
+ROM0
+	"output 1"
+	"output 2"
+	"output 3"
+WRAM0
+	"a" ; $C000
+WRAMX 1
+	ORG $DAB0
+	"b"
--- /dev/null
+++ b/test/link/section-union/no-room.asm
@@ -1,0 +1,12 @@
+; NB: the error is that there is no room to place the unionized section in,
+;     so RGBASM can't possibly error out.
+IF !DEF(SECOND)
+	SECTION "bloat", WRAMX[$d000], BANK[2]
+		ds $fe0
+
+	SECTION UNION "test", WRAMX, BANK[2]
+		db
+ELSE
+	SECTION UNION "test", WRAMX, ALIGN[6]
+		db
+ENDC
--- /dev/null
+++ b/test/link/section-union/no-room.out
@@ -1,0 +1,2 @@
+error: Unable to place "test" (WRAMX section) in bank $02 with align mask ffffffc0
+---
--- /dev/null
+++ b/test/link/section-union/org-conflict.asm
@@ -1,0 +1,8 @@
+IF !DEF(SECOND)
+ADDR = $BEEF
+ELSE
+ADDR = $BABE
+ENDC
+
+SECTION UNION "conflicting address", SRAM[ADDR]
+	db
--- /dev/null
+++ b/test/link/section-union/org-conflict.out
@@ -1,0 +1,6 @@
+error: Section "conflicting address" is defined with conflicting addresses $beef and $babe
+---
+ERROR: -(16):
+    Section "conflicting address" already declared as fixed at different address $beef
+ERROR: -(16):
+    Cannot create section "conflicting address" (1 errors)
binary files a/test/link/section-union/ref.out.bin /dev/null differ
--- a/test/link/section-union/script.link
+++ /dev/null
@@ -1,9 +1,0 @@
-ROM0
-	"output 1"
-	"output 2"
-	"output 3"
-WRAM0
-	"a" ; $C000
-WRAMX 1
-	ORG $DAB0
-	"b"
--- /dev/null
+++ b/test/link/section-union/split-data.asm
@@ -1,0 +1,10 @@
+IF !DEF(SECOND)
+DATA equs "ds 1\ndb $aa"
+ELSE
+DATA equs "db $bb\nds 1"
+ENDC
+
+SECTION UNION "mutually-overlaid data", ROM0
+	DATA
+
+	PURGE DATA
--- /dev/null
+++ b/test/link/section-union/split-data.out
@@ -1,0 +1,6 @@
+error: Section "mutually-overlaid data" is of type ROM0, which cannot be unionized
+---
+ERROR: -(18):
+    Cannot declare ROM sections as UNION
+ERROR: -(18):
+    Cannot create section "mutually-overlaid data" (1 errors)
--- a/test/link/test.sh
+++ b/test/link/test.sh
@@ -80,12 +80,25 @@
 i="high-low.asm" tryCmp $gbtemp $gbtemp2
 rc=$(($? || $rc))
 
-$RGBASM -o $otemp section-union/a.asm
-$RGBASM -o $gbtemp2 section-union/b.asm
-$RGBLINK -o $gbtemp -l section-union/script.link $otemp $gbtemp2
-dd if=$gbtemp count=1 bs=$(printf %s $(wc -c < section-union/ref.out.bin)) > $otemp 2>/dev/null
-i="section-union.asm" tryCmp section-union/ref.out.bin $otemp
+$RGBASM -o $otemp section-union/good/a.asm
+$RGBASM -o $gbtemp2 section-union/good/b.asm
+$RGBLINK -o $gbtemp -l section-union/good/script.link $otemp $gbtemp2
+dd if=$gbtemp count=1 bs=$(printf %s $(wc -c < section-union/good/ref.out.bin)) > $otemp 2>/dev/null
+i="section-union.asm" tryCmp section-union/good/ref.out.bin $otemp
 rc=$(($? || $rc))
+for i in section-union/*.asm; do
+	$RGBASM -o $otemp   $i
+	$RGBASM -o $gbtemp2 $i -DSECOND
+	if $RGBLINK $otemp $gbtemp2 > $outtemp 2>&1; then
+		echo -e "${bold}${red}$i didn't fail to link!${rescolors}${resbold}"
+		rc=1
+	fi
+	echo --- >> $outtemp
+	# Ensure RGBASM also errors out
+	echo 'SECOND equs "1"' | cat $i - $i | $RGBASM - 2>> $outtemp
+	tryDiff ${i%.asm}.out $outtemp
+	rc=$(($? || $rc))
+done
 
 rm -f $otemp $gbtemp $gbtemp2 $outtemp
 exit $rc