mirror of
https://github.com/fadden/6502bench.git
synced 2024-11-25 14:34:27 +00:00
Fix label-trampling bug in reloc data handler
If code accesses the high/low parts of a 32-bit address value with no label, it auto-generates labels for addr+2 and addr. The reloc handler was replacing the unformatted bytes with a single multi-byte format, hiding the label at addr+2. The easy fix is to have the reloc data handler skip the entry. This is less useful than other approaches, but much simpler. Added a test to 20212-reloc-data.
This commit is contained in:
parent
2a2aadffec
commit
6ce2cc0b58
@ -254,11 +254,15 @@ namespace SourceGen {
|
|||||||
mProject.RelocList.TryGetValue(offset,
|
mProject.RelocList.TryGetValue(offset,
|
||||||
out DisasmProject.RelocData reloc)) {
|
out DisasmProject.RelocData reloc)) {
|
||||||
// Byte is unformatted, but there's relocation data here. If the full
|
// Byte is unformatted, but there's relocation data here. If the full
|
||||||
// range of bytes is unformatted, create a symbolic reference.
|
// range of bytes is unformatted and unlabeled, create a symbolic reference.
|
||||||
|
// TODO: we can do better here when a multi-byte reloc has an auto-generated
|
||||||
|
// label mid-way through: create multiple, smaller formats for the same sym.
|
||||||
|
// Or don't generate auto labels until all reloc-based formats are placed.
|
||||||
bool allClear = true;
|
bool allClear = true;
|
||||||
for (int i = 1; i < reloc.Width; i++) {
|
for (int i = 1; i < reloc.Width; i++) {
|
||||||
if (!mAnattribs[offset + i].IsUntyped ||
|
if (!mAnattribs[offset + i].IsUntyped ||
|
||||||
mAnattribs[offset + i].DataDescriptor != null) {
|
mAnattribs[offset + i].DataDescriptor != null ||
|
||||||
|
mAnattribs[offset + i].Symbol != null) {
|
||||||
allClear = false;
|
allClear = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
@ -1,8 +1,8 @@
|
|||||||
### 6502bench SourceGen dis65 v1.0 ###
|
### 6502bench SourceGen dis65 v1.0 ###
|
||||||
{
|
{
|
||||||
"_ContentVersion":4,
|
"_ContentVersion":4,
|
||||||
"FileDataLength":255,
|
"FileDataLength":282,
|
||||||
"FileDataCrc32":-527039020,
|
"FileDataCrc32":-560719478,
|
||||||
"ProjectProps":{
|
"ProjectProps":{
|
||||||
"CpuName":"65816",
|
"CpuName":"65816",
|
||||||
"IncludeUndocumentedInstr":false,
|
"IncludeUndocumentedInstr":false,
|
||||||
@ -15,7 +15,8 @@
|
|||||||
"MinCharsForString":4,
|
"MinCharsForString":4,
|
||||||
"SeekNearbyTargets":true,
|
"SeekNearbyTargets":true,
|
||||||
"UseRelocData":true,
|
"UseRelocData":true,
|
||||||
"SmartPlpHandling":true},
|
"SmartPlpHandling":true,
|
||||||
|
"SmartPlbHandling":true},
|
||||||
|
|
||||||
"PlatformSymbolFileIdentifiers":["RT:Apple/Cxxx-IO.sym65",
|
"PlatformSymbolFileIdentifiers":["RT:Apple/Cxxx-IO.sym65",
|
||||||
"RT:Apple/IIgs-ROM.sym65",
|
"RT:Apple/IIgs-ROM.sym65",
|
||||||
@ -30,23 +31,23 @@
|
|||||||
"Addr":196608},
|
"Addr":196608},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Offset":110,
|
"Offset":137,
|
||||||
"Addr":327648},
|
"Addr":327648},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Offset":142,
|
"Offset":169,
|
||||||
"Addr":327680},
|
"Addr":327680},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Offset":162,
|
"Offset":189,
|
||||||
"Addr":144470},
|
"Addr":144470},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Offset":188,
|
"Offset":215,
|
||||||
"Addr":524288},
|
"Addr":524288},
|
||||||
|
|
||||||
{
|
{
|
||||||
"Offset":242,
|
"Offset":269,
|
||||||
"Addr":393216}],
|
"Addr":393216}],
|
||||||
"TypeHints":[{
|
"TypeHints":[{
|
||||||
"Low":0,
|
"Low":0,
|
||||||
@ -65,25 +66,25 @@
|
|||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
"BackgroundColor":0},
|
"BackgroundColor":0},
|
||||||
|
|
||||||
"110":{
|
"137":{
|
||||||
"Text":"Segment 03: Kind=Data; Attrs=BankRel, Dynamic; Name=\u0027PosFFE0 \u0027",
|
"Text":"Segment 03: Kind=Data; Attrs=BankRel, Dynamic; Name=\u0027PosFFE0 \u0027",
|
||||||
"BoxMode":false,
|
"BoxMode":false,
|
||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
"BackgroundColor":0},
|
"BackgroundColor":0},
|
||||||
|
|
||||||
"162":{
|
"189":{
|
||||||
"Text":"Segment 04: Kind=Code; Attrs=NoSpecial; Name=\u0027Bank2 \u0027",
|
"Text":"Segment 04: Kind=Code; Attrs=NoSpecial; Name=\u0027Bank2 \u0027",
|
||||||
"BoxMode":false,
|
"BoxMode":false,
|
||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
"BackgroundColor":0},
|
"BackgroundColor":0},
|
||||||
|
|
||||||
"188":{
|
"215":{
|
||||||
"Text":"Segment 05: Kind=Code; Attrs=AbsBank, Dynamic; Name=\u0027Bank8 \u0027",
|
"Text":"Segment 05: Kind=Code; Attrs=AbsBank, Dynamic; Name=\u0027Bank8 \u0027",
|
||||||
"BoxMode":false,
|
"BoxMode":false,
|
||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
"BackgroundColor":0},
|
"BackgroundColor":0},
|
||||||
|
|
||||||
"242":{
|
"269":{
|
||||||
"Text":"Segment 06: Kind=Data; Attrs=0; Name=\u0027Filler \u0027",
|
"Text":"Segment 06: Kind=Data; Attrs=0; Name=\u0027Filler \u0027",
|
||||||
"BoxMode":false,
|
"BoxMode":false,
|
||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
@ -96,25 +97,25 @@
|
|||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
"BackgroundColor":0},
|
"BackgroundColor":0},
|
||||||
|
|
||||||
"110":{
|
"137":{
|
||||||
"Text":"Seg03: 04/ffe0 \u0027PosFFE0 \u0027",
|
"Text":"Seg03: 04/ffe0 \u0027PosFFE0 \u0027",
|
||||||
"BoxMode":false,
|
"BoxMode":false,
|
||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
"BackgroundColor":0},
|
"BackgroundColor":0},
|
||||||
|
|
||||||
"162":{
|
"189":{
|
||||||
"Text":"Seg04: 02/3456 \u0027Bank2 \u0027",
|
"Text":"Seg04: 02/3456 \u0027Bank2 \u0027",
|
||||||
"BoxMode":false,
|
"BoxMode":false,
|
||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
"BackgroundColor":0},
|
"BackgroundColor":0},
|
||||||
|
|
||||||
"188":{
|
"215":{
|
||||||
"Text":"Seg05: 08/0000 \u0027Bank8 \u0027",
|
"Text":"Seg05: 08/0000 \u0027Bank8 \u0027",
|
||||||
"BoxMode":false,
|
"BoxMode":false,
|
||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
"BackgroundColor":0},
|
"BackgroundColor":0},
|
||||||
|
|
||||||
"242":{
|
"269":{
|
||||||
"Text":"Seg06: 06/0000 \u0027Filler \u0027",
|
"Text":"Seg06: 06/0000 \u0027Filler \u0027",
|
||||||
"BoxMode":false,
|
"BoxMode":false,
|
||||||
"MaxWidth":80,
|
"MaxWidth":80,
|
||||||
@ -155,11 +156,31 @@
|
|||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":196717},
|
"Value":196717},
|
||||||
|
|
||||||
|
"118":{
|
||||||
|
"Width":2,
|
||||||
|
"Shift":0,
|
||||||
|
"Value":196738},
|
||||||
|
|
||||||
|
"122":{
|
||||||
|
"Width":2,
|
||||||
|
"Shift":0,
|
||||||
|
"Value":196736},
|
||||||
|
|
||||||
"5":{
|
"5":{
|
||||||
"Width":3,
|
"Width":3,
|
||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":196608},
|
"Value":196608},
|
||||||
|
|
||||||
|
"128":{
|
||||||
|
"Width":3,
|
||||||
|
"Shift":0,
|
||||||
|
"Value":196677},
|
||||||
|
|
||||||
|
"132":{
|
||||||
|
"Width":3,
|
||||||
|
"Shift":0,
|
||||||
|
"Value":196717},
|
||||||
|
|
||||||
"85":{
|
"85":{
|
||||||
"Width":2,
|
"Width":2,
|
||||||
"Shift":-8,
|
"Shift":-8,
|
||||||
@ -290,37 +311,40 @@
|
|||||||
"Shift":-16,
|
"Shift":-16,
|
||||||
"Value":524313},
|
"Value":524313},
|
||||||
|
|
||||||
"110":{
|
"137":{
|
||||||
"Width":3,
|
"Width":3,
|
||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":327648},
|
"Value":327648},
|
||||||
|
|
||||||
"167":{
|
"194":{
|
||||||
"Width":2,
|
"Width":2,
|
||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":144494},
|
"Value":144494},
|
||||||
|
|
||||||
"163":{
|
"190":{
|
||||||
"Width":3,
|
"Width":3,
|
||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":144470},
|
"Value":144470},
|
||||||
|
|
||||||
"193":{
|
"220":{
|
||||||
"Width":2,
|
"Width":2,
|
||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":524313},
|
"Value":524313},
|
||||||
|
|
||||||
"189":{
|
"216":{
|
||||||
"Width":3,
|
"Width":3,
|
||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":524288},
|
"Value":524288},
|
||||||
|
|
||||||
"213":{
|
"240":{
|
||||||
"Width":3,
|
"Width":3,
|
||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":524313},
|
"Value":524313},
|
||||||
|
|
||||||
"217":{
|
"244":{
|
||||||
"Width":3,
|
"Width":3,
|
||||||
"Shift":0,
|
"Shift":0,
|
||||||
"Value":144470}}}
|
"Value":144470}},
|
||||||
|
|
||||||
|
"DbrValues":{
|
||||||
|
}}
|
||||||
|
@ -54,7 +54,27 @@ _L30057 pea _L30045 >> 16
|
|||||||
.long _L4FFE0
|
.long _L4FFE0
|
||||||
.byte $00
|
.byte $00
|
||||||
|
|
||||||
_L3006D rts
|
_L3006D phk
|
||||||
|
plb
|
||||||
|
lda #$0000
|
||||||
|
asl a
|
||||||
|
asl a
|
||||||
|
tax
|
||||||
|
lda @w_L30082 & $ffff,x
|
||||||
|
pha
|
||||||
|
lda @w_L30080 & $ffff,x
|
||||||
|
pha
|
||||||
|
beq _L30088
|
||||||
|
rts
|
||||||
|
|
||||||
|
_L30080 .byte $45
|
||||||
|
.byte $00
|
||||||
|
_L30082 .byte $03
|
||||||
|
.byte $00
|
||||||
|
.long _L3006D
|
||||||
|
.byte $00
|
||||||
|
|
||||||
|
_L30088 rts
|
||||||
|
|
||||||
;Segment 03: Kind=Data; Attrs=BankRel, Dynamic; Name='PosFFE0 '
|
;Segment 03: Kind=Data; Attrs=BankRel, Dynamic; Name='PosFFE0 '
|
||||||
.logical $04ffe0
|
.logical $04ffe0
|
||||||
|
@ -48,7 +48,27 @@ L30000 clc
|
|||||||
adr :L4FFE0
|
adr :L4FFE0
|
||||||
dfb $00
|
dfb $00
|
||||||
|
|
||||||
:L3006D rts
|
:L3006D phk
|
||||||
|
plb
|
||||||
|
lda #$0000
|
||||||
|
asl A
|
||||||
|
asl A
|
||||||
|
tax
|
||||||
|
lda: :L30082,x
|
||||||
|
pha
|
||||||
|
lda: :L30080,x
|
||||||
|
pha
|
||||||
|
beq :L30088
|
||||||
|
rts
|
||||||
|
|
||||||
|
:L30080 dfb $45
|
||||||
|
dfb $00
|
||||||
|
:L30082 dfb $03
|
||||||
|
dfb $00
|
||||||
|
adr :L3006D
|
||||||
|
dfb $00
|
||||||
|
|
||||||
|
:L30088 rts
|
||||||
|
|
||||||
;Segment 03: Kind=Data; Attrs=BankRel, Dynamic; Name='PosFFE0 '
|
;Segment 03: Kind=Data; Attrs=BankRel, Dynamic; Name='PosFFE0 '
|
||||||
org $04ffe0
|
org $04ffe0
|
||||||
|
@ -4,9 +4,10 @@
|
|||||||
!hex 18fbe230af000003ea2256340222000008af563402ad5634a956a934a902af19
|
!hex 18fbe230af000003ea2256340222000008af563402ad5634a956a934a902af19
|
||||||
!hex 0008ad1900a919a900a908eac230a91900a90008a90800eaa90f00a22600a05e
|
!hex 0008ad1900a919a900a908eac230a91900a90008a90800eaa90f00a22600a05e
|
||||||
!hex 34540208eaf40000f400f0f41900f40800f44500f40003f40300f45700f44510
|
!hex 34540208eaf40000f400f0f41900f40800f44500f40003f40300f45700f44510
|
||||||
!hex ea4c6d00e0ffe0ff04e0ff040060e0ff0400000102030405060708090a0b0c0d
|
!hex ea4c6d00e0ffe0ff04e0ff04004baba900000a0aaabd820048bd800048f00960
|
||||||
!hex 0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d
|
!hex 450003006d00030060e0ff0400000102030405060708090a0b0c0d0e0f101112
|
||||||
!hex 2e2faf563402206e346b00000000000000000000000000000000ea60af000008
|
!hex 131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2faf5634
|
||||||
!hex ad1900eaaf000001af000002af000003af0000086b1900080056340200800010
|
!hex 02206e346b00000000000000000000000000000000ea60af000008ad1900eaaf
|
||||||
!hex 080054686973206973206120746573742e0068656c6c6f2c20776f726c6421
|
!hex 000001af000002af000003af0000086b19000800563402008000100800546869
|
||||||
|
!hex 73206973206120746573742e0068656c6c6f2c20776f726c6421
|
||||||
} ;!pseudopc
|
} ;!pseudopc
|
||||||
|
@ -53,7 +53,27 @@ L30000: clc
|
|||||||
.faraddr @L4FFE0
|
.faraddr @L4FFE0
|
||||||
.byte $00
|
.byte $00
|
||||||
|
|
||||||
@L3006D: rts
|
@L3006D: phk
|
||||||
|
plb
|
||||||
|
lda #$0000
|
||||||
|
asl A
|
||||||
|
asl A
|
||||||
|
tax
|
||||||
|
lda a:@L30082 & $ffff,x
|
||||||
|
pha
|
||||||
|
lda a:@L30080 & $ffff,x
|
||||||
|
pha
|
||||||
|
beq @L30088
|
||||||
|
rts
|
||||||
|
|
||||||
|
@L30080: .byte $45
|
||||||
|
.byte $00
|
||||||
|
@L30082: .byte $03
|
||||||
|
.byte $00
|
||||||
|
.faraddr @L3006D
|
||||||
|
.byte $00
|
||||||
|
|
||||||
|
@L30088: rts
|
||||||
|
|
||||||
;Segment 03: Kind=Data; Attrs=BankRel, Dynamic; Name='PosFFE0 '
|
;Segment 03: Kind=Data; Attrs=BankRel, Dynamic; Name='PosFFE0 '
|
||||||
; .segment "SEG001"
|
; .segment "SEG001"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# 6502bench SourceGen generated linker script for 20212-reloc-data
|
# 6502bench SourceGen generated linker script for 20212-reloc-data
|
||||||
MEMORY {
|
MEMORY {
|
||||||
MAIN: file=%O, start=%S, size=65536;
|
MAIN: file=%O, start=%S, size=65536;
|
||||||
# MEM000: file=%O, start=$30000, size=110;
|
# MEM000: file=%O, start=$30000, size=137;
|
||||||
# MEM001: file=%O, start=$4ffe0, size=32;
|
# MEM001: file=%O, start=$4ffe0, size=32;
|
||||||
# MEM002: file=%O, start=$50000, size=20;
|
# MEM002: file=%O, start=$50000, size=20;
|
||||||
# MEM003: file=%O, start=$23456, size=26;
|
# MEM003: file=%O, start=$23456, size=26;
|
||||||
|
@ -77,4 +77,28 @@ check_pea
|
|||||||
adrl ADDR_FFE0
|
adrl ADDR_FFE0
|
||||||
|
|
||||||
:skipdata
|
:skipdata
|
||||||
|
|
||||||
|
; Check a situation where we block a relocation from being fully formed.
|
||||||
|
; The access to addr_dat+2 and addr_dat cause labels to be auto-generated.
|
||||||
|
; Because we access the high part first, there's no opportunity to find
|
||||||
|
; a pre-existing label nearby. If the reloc code generates a 3-byte or
|
||||||
|
; 4-byte data item at addr_dat, the label at addr_dat+2 will be hidden.
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
lda #$0000
|
||||||
|
asl A
|
||||||
|
asl A
|
||||||
|
tax
|
||||||
|
lda addr_dat+2,X
|
||||||
|
pha
|
||||||
|
lda addr_dat,X
|
||||||
|
pha
|
||||||
|
beq :skip_ad
|
||||||
|
rts
|
||||||
|
|
||||||
|
addr_dat
|
||||||
|
adrl check_pea
|
||||||
|
adrl :skipdata
|
||||||
|
|
||||||
|
:skip_ad
|
||||||
rts
|
rts
|
||||||
|
Loading…
Reference in New Issue
Block a user