shithub: rgbds

Download patch

ref: dec4133e84e61fedc29c95cc3984f734422dff16
parent: c35cb6ac32b703662456226b0c40b6669b54cdc0
author: Rangi <[email protected]>
date: Thu Sep 29 15:59:33 EDT 2022

`SECTION(symbol)` returns the name of a symbol's section (#1066)

Fixes #963

Co-authored-by: Eldred Habert <[email protected]>

--- a/man/rgbasm.5
+++ b/man/rgbasm.5
@@ -472,6 +472,11 @@
 The result may be constant if
 .Nm
 is able to compute it.
+.It Fn SECTION symbol Ta Returns the name of the section that
+.Ar symbol
+is in.
+.Ar symbol
+must have been defined already.
 .It Fn SIZEOF arg Ta Returns the size of the section named
 .Ar arg .
 The result is not constant, since only RGBLINK can compute its value.
--- a/src/asm/parser.y
+++ b/src/asm/parser.y
@@ -1589,6 +1589,19 @@
 			strfmt($$, sizeof($$), $3.format, $3.nbArgs, $3.args);
 			freeStrFmtArgList(&$3);
 		}
+		| T_POP_SECTION T_LPAREN scoped_anon_id T_RPAREN {
+			struct Symbol *sym = sym_FindScopedSymbol($3);
+
+			if (!sym)
+				fatalerror("Unknown symbol \"%s\"\n", $3);
+			struct Section const *section = sym_GetSection(sym);
+
+			if (!section)
+				fatalerror("\"%s\" does not belong to any section\n", sym->name);
+			// Section names are capped by rgbasm's maximum string length,
+			// so this currently can't overflow.
+			strcpy($$, section->name);
+		}
 ;
 
 strcat_args	: string
--- /dev/null
+++ b/test/asm/long-section-name.asm
@@ -1,0 +1,2 @@
+SECTION "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit", ROM0[0]
+println "This is section ", SECTION(@)
--- /dev/null
+++ b/test/asm/long-section-name.err
@@ -1,0 +1,2 @@
+warning: long-section-name.asm(1): [-Wlong-string]
+    String constant too long
--- /dev/null
+++ b/test/asm/long-section-name.out
@@ -1,0 +1,1 @@
+This is section Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor i
--- /dev/null
+++ b/test/asm/section-name-invalid.asm
@@ -1,0 +1,7 @@
+SECTION "test", ROM0
+
+Label:
+println SECTION(Label) ; OK
+
+DEF Value EQU 42
+println SECTION(Value) ; not OK
--- /dev/null
+++ b/test/asm/section-name-invalid.err
@@ -1,0 +1,2 @@
+FATAL: section-name-invalid.asm(7):
+    "Value" does not belong to any section
--- /dev/null
+++ b/test/asm/section-name-invalid.out
@@ -1,0 +1,1 @@
+test
--- /dev/null
+++ b/test/asm/section-name.asm
@@ -1,0 +1,19 @@
+SECTION "aaa", ROM0[5]
+	println SECTION(@)
+	Label1: println SECTION(Label1)
+	dw STARTOF(SECTION(@))
+
+SECTION UNION "bbb", WRAM0
+	println SECTION(@)
+	Label2:
+	.local1: println SECTION(Label2.local1)
+	.local2: println SECTION(.local2)
+
+SECTION FRAGMENT "ccc", HRAM
+	println SECTION(@)
+	: println SECTION(:-)
+
+	PUSHS
+	SECTION "ddd", ROMX
+		println SECTION(@)
+	POPS
--- /dev/null
+++ b/test/asm/section-name.out
@@ -1,0 +1,8 @@
+aaa
+aaa
+bbb
+bbb
+bbb
+ccc
+ccc
+ddd
binary files /dev/null b/test/asm/section-name.out.bin differ