Support scoped local labels
ISSOtm opened this issue · 0 comments
The following currently isn't disassembled correctly:
; @00:0000
nop
jr $0004
nop
00:0000 Glob1
00:0001 .local
00:0003 Glob2
00:0004 .local
This will produce the following:
Glob1::
nop
.local:
jr .local
Glob2::
nop
.local:
where the jr .local
line should instead be Glob2.local
. This is because mgbdis
does not treat local labels specially: in RGBDS, they are always scoped. meaning the SYM file above is actually invalid. See below for what is actually produced.
00:0000 Glob1
00:0001 Glob1.local
00:0003 Glob2
00:0004 Glob2.local
mgbdis
actually treats labels as local only if they begin with a dot, whereas the RGBDS rule is if they contain one at all.
This is actually linked to gbdev/rgbds#483 (and #12, by extension), though the currently drafted spec agrees on what has been outlined above.
Correct behavior
mgbdis
should instead apply special meaning to local labels, trimming off their leading part if it's currently in scope. (Implementing that properly is a different problem.) Note that while Glob1.local:
is actually valid syntax, it's a lot noisier, and nobody writes code like that.