shithub: rgbds

Download patch

ref: 8c4b473d6f178a583bba81e1155febc7626b29c3
parent: a4fe274c250bd5a9375636c8aa840abdf8cea8f0
author: ISSOtm <eldredhabert0@gmail.com>
date: Mon Feb 3 21:05:33 EST 2020

Add more checks to section creation in RGBASM

Fixes rednex#471, but also backports a couple more checks from RGBLINK

--- a/src/asm/section.c
+++ b/src/asm/section.c
@@ -159,6 +159,8 @@
 void out_NewSection(char const *pzName, uint32_t secttype, int32_t org,
 		    struct SectionSpec const *attributes)
 {
+	uint32_t align = 1 << attributes->alignment;
+
 	if (attributes->bank != -1) {
 		if (secttype != SECTTYPE_ROMX && secttype != SECTTYPE_VRAM
 		 && secttype != SECTTYPE_SRAM && secttype != SECTTYPE_WRAMX)
@@ -169,6 +171,26 @@
 				typeNames[secttype], attributes->bank,
 				bankranges[secttype][0],
 				bankranges[secttype][1]);
+	}
+
+	if (align != 1) {
+		/* It doesn't make sense to have both set */
+		uint32_t mask = align - 1;
+
+		if (org != -1) {
+			if (org & mask)
+				yyerror("Section \"%s\"'s fixed address doesn't match its alignment",
+					pzName);
+			else
+				align = 1; /* Ignore it if it's satisfied */
+		}
+	}
+
+	if (org != -1) {
+		if (org < startaddr[secttype] || org > endaddr(secttype))
+			yyerror("Section \"%s\"'s fixed address %#x is outside of range [%#x; %#x]",
+				pzName, org, startaddr[secttype],
+				endaddr(secttype));
 	}
 
 	setCurrentSection(findSection(pzName, secttype, org, attributes->bank,
--- /dev/null
+++ b/test/asm/fixed-oob.asm
@@ -1,0 +1,15 @@
+SECTION "ROM0", ROM0[$BABE]
+
+SECTION "ROMX", ROMX[$BEEF]
+
+SECTION "VRAM", VRAM[$C0DE]
+
+SECTION "SRAM", SRAM[$CAFE]
+
+SECTION "WRAM0", WRAM0[$DEAD]
+
+SECTION "WRAMX", WRAMX[$DAD]
+
+SECTION "OAM", OAM[$CAB]
+
+SECTION "HRAM", HRAM[$BAD]
--- /dev/null
+++ b/test/asm/fixed-oob.err
@@ -1,0 +1,15 @@
+ERROR: fixed-oob.asm(1):
+    Section "ROM0"'s fixed address 0xbabe is outside of range [0; 0x7fff]
+ERROR: fixed-oob.asm(3):
+    Section "ROMX"'s fixed address 0xbeef is outside of range [0x4000; 0x7fff]
+ERROR: fixed-oob.asm(5):
+    Section "VRAM"'s fixed address 0xc0de is outside of range [0x8000; 0x9fff]
+ERROR: fixed-oob.asm(7):
+    Section "SRAM"'s fixed address 0xcafe is outside of range [0xa000; 0xbfff]
+ERROR: fixed-oob.asm(11):
+    Section "WRAMX"'s fixed address 0xdad is outside of range [0xd000; 0xdfff]
+ERROR: fixed-oob.asm(13):
+    Section "OAM"'s fixed address 0xcab is outside of range [0xfe00; 0xfe9f]
+ERROR: fixed-oob.asm(15):
+    Section "HRAM"'s fixed address 0xbad is outside of range [0xff80; 0xfffe]
+error: Assembly aborted (7 errors)!
--- a/test/link/fixed-oob.asm
+++ /dev/null
@@ -1,15 +1,0 @@
-SECTION "ROM0", ROM0[$BABE]
-
-SECTION "ROMX", ROMX[$BEEF]
-
-SECTION "VRAM", VRAM[$C0DE]
-
-SECTION "SRAM", SRAM[$CAFE]
-
-SECTION "WRAM0", WRAM0[$DEAD]
-
-SECTION "WRAMX", WRAMX[$DAD]
-
-SECTION "OAM", OAM[$CAB]
-
-SECTION "HRAM", HRAM[$BAD]
--- a/test/link/fixed-oob.out
+++ /dev/null
@@ -1,14 +1,0 @@
-warning: Section "VRAM"'s fixed address 0xc0de is outside of range [0x8000; 0x9fff]
-warning: Section "VRAM"'s end address 0xc0de is greater than last address 0xa000
-warning: Section "OAM"'s fixed address 0xcab is outside of range [0xfe00; 0xfe9f]
-warning: Section "WRAM0"'s fixed address 0xdead is outside of range [0xc000; 0xcfff]
-warning: Section "WRAM0"'s end address 0xdead is greater than last address 0xd000
-warning: Section "HRAM"'s fixed address 0xbad is outside of range [0xff80; 0xfffe]
-warning: Section "SRAM"'s fixed address 0xcafe is outside of range [0xa000; 0xbfff]
-warning: Section "SRAM"'s end address 0xcafe is greater than last address 0xc000
-warning: Section "WRAMX"'s fixed address 0xdad is outside of range [0xd000; 0xdfff]
-warning: Section "ROMX"'s fixed address 0xbeef is outside of range [0x4000; 0x7fff]
-warning: Section "ROMX"'s end address 0xbeef is greater than last address 0x8000
-warning: Section "ROM0"'s fixed address 0xbabe is outside of range [0; 0x3fff]
-warning: Section "ROM0"'s end address 0xbabe is greater than last address 0x4000
-error: Sanity checks failed