From 51081c5db05c440fb804dfefd2f72caa4316a2b6 Mon Sep 17 00:00:00 2001 From: Andy McFadden Date: Tue, 29 Oct 2019 18:12:22 -0700 Subject: [PATCH] Tweak "nearby" label finder The code that found a nearby data target for an instruction operand was searching backward but not forward. We now take one step forward, so that "LDA TABLE-1,Y" fills in automatically. This altered 2008-address-changes, which had just this situation. It didn't alter 2010-target-adjustment, but the existing tests were insufficient and have been improved. --- SourceGen/DataAnalysis.cs | 45 +++++++++++++++--- SourceGen/SGTestData/2010-target-adjustment | Bin 145 -> 191 bytes .../SGTestData/2010-target-adjustment.dis65 | 16 ++++--- .../Expected/2008-address-changes_64tass.S | 4 +- .../Expected/2008-address-changes_Merlin32.S | 4 +- .../Expected/2008-address-changes_acme.S | 4 +- .../Expected/2008-address-changes_cc65.S | 4 +- .../Expected/2010-target-adjustment_64tass.S | 27 ++++++++++- .../2010-target-adjustment_Merlin32.S | 27 ++++++++++- .../Expected/2010-target-adjustment_acme.S | 27 ++++++++++- .../Expected/2010-target-adjustment_cc65.S | 27 ++++++++++- .../Expected/2010-target-adjustment_cc65.cfg | 2 +- .../Source/2010-target-adjustment.S | 30 ++++++++++++ 13 files changed, 192 insertions(+), 25 deletions(-) diff --git a/SourceGen/DataAnalysis.cs b/SourceGen/DataAnalysis.cs index 6c014d4..5174822 100644 --- a/SourceGen/DataAnalysis.cs +++ b/SourceGen/DataAnalysis.cs @@ -381,24 +381,57 @@ namespace SourceGen { // We want to use user-defined labels whenever possible. If they're accessing // memory within a few bytes, use that. We don't want to do this for // code references, though, or our branches will get all weird. - // TODO(someday): make MAX user-configurable? Seek forward as well as backward? - const int MAX = 4; - for (int probeOffset = targetOffset - 1; - probeOffset >= 0 && probeOffset != targetOffset - MAX; probeOffset--) { + // + // We look a few back and one forward. Stuff backward (which turns into + // LABEL+N) has priority over forward (which becomes LABEL-N). + // + // TODO(someday): make parameters user-configurable? + const int MAX_FWD = 1; + const int MAX_BACK = 3; + int probeOffset = targetOffset; + bool back = true; + while (true) { + if (back) { + // moving backward + probeOffset--; + if (probeOffset < 0 || probeOffset < targetOffset - MAX_BACK) { + // too far back, reverse direction + probeOffset = targetOffset; + back = false; + } + } + if (!back) { + // moving forward + probeOffset++; + if (probeOffset >= mAnattribs.Length || + probeOffset > targetOffset + MAX_FWD) { + break; // done + } + } + Symbol sym = mAnattribs[probeOffset].Symbol; if (sym != null && sym.SymbolSource == Symbol.Source.User) { // Found a nearby user label. Make sure it's actually nearby. int addrDiff = mAnattribs[targetOffset].Address - - mAnattribs[probeOffset].Address; + mAnattribs[probeOffset].Address; if (addrDiff == targetOffset - probeOffset) { targetOffset = probeOffset; + break; } else { Debug.WriteLine("NOT probing past address boundary change (src=+" + srcOffset.ToString("x6") + " targ=+" + targetOffset.ToString("x6") + " probe=+" + probeOffset.ToString("x6") + ")"); + + // No point in continuing to search this direction, but we might + // need to look the other way. + if (back) { + probeOffset = targetOffset; + back = false; + } else { + break; + } } - break; } } return targetOffset; diff --git a/SourceGen/SGTestData/2010-target-adjustment b/SourceGen/SGTestData/2010-target-adjustment index 31b4203f0e4acb786f8ed1a8719b5fdd8d67efbe..5b3cfa680579537c525423eb7ff4a911d8b49142 100644 GIT binary patch delta 54 zcmV~$HxYn900602c{n{0TQhM delta 8 PcmdnbIFWI}1jYma4a5S} diff --git a/SourceGen/SGTestData/2010-target-adjustment.dis65 b/SourceGen/SGTestData/2010-target-adjustment.dis65 index 089761a..a67c584 100644 --- a/SourceGen/SGTestData/2010-target-adjustment.dis65 +++ b/SourceGen/SGTestData/2010-target-adjustment.dis65 @@ -1,8 +1,8 @@ ### 6502bench SourceGen dis65 v1.0 ### { -"_ContentVersion":1,"FileDataLength":145,"FileDataCrc32":-56227824,"ProjectProps":{ -"CpuName":"65816","IncludeUndocumentedInstr":false,"EntryFlags":33489103,"AnalysisParams":{ -"AnalyzeUncategorizedData":true,"MinCharsForString":4,"SeekNearbyTargets":true}, +"_ContentVersion":2,"FileDataLength":191,"FileDataCrc32":1554487300,"ProjectProps":{ +"CpuName":"65816","IncludeUndocumentedInstr":false,"TwoByteBrk":false,"EntryFlags":33489103,"AutoLabelStyle":"Simple","AnalysisParams":{ +"AnalyzeUncategorizedData":true,"DefaultTextScanMode":"LowHighAscii","MinCharsForString":4,"SeekNearbyTargets":true,"SmartPlpHandling":true}, "PlatformSymbolFileIdentifiers":[],"ExtensionScriptFileIdentifiers":[],"ProjectSyms":{ }}, "AddressMap":[{ @@ -12,7 +12,7 @@ "Low":0,"High":0,"Hint":"Code"}],"StatusFlagOverrides":{ }, "Comments":{ -}, +"125":"self-ref; operand format refs nonexistent symbol"}, "LongComments":{ }, "Notes":{ @@ -29,7 +29,9 @@ "49":{ "Label":"fill0","Value":4145,"Source":"User","Type":"LocalOrGlobalAddr"}, "132":{ -"Label":"dat81","Value":4228,"Source":"User","Type":"LocalOrGlobalAddr"}}, +"Label":"dat81","Value":4228,"Source":"User","Type":"LocalOrGlobalAddr"}, +"150":{ +"Label":"nearby","Value":8209,"Source":"User","Type":"LocalOrGlobalAddr"}}, "OperandFormats":{ "10":{ "Length":2,"Format":"NumericLE","SubFormat":"Hex","SymbolRef":null}, @@ -60,4 +62,6 @@ "Label":"fill0","Part":"Low"}}, "125":{ "Length":3,"Format":"NumericLE","SubFormat":"Symbol","SymbolRef":{ -"Label":"nonexistent","Part":"Low"}}}} +"Label":"nonexistent","Part":"Low"}}}, +"LvTables":{ +}} diff --git a/SourceGen/SGTestData/Expected/2008-address-changes_64tass.S b/SourceGen/SGTestData/Expected/2008-address-changes_64tass.S index 7719e78..d5c9adb 100644 --- a/SourceGen/SGTestData/Expected/2008-address-changes_64tass.S +++ b/SourceGen/SGTestData/Expected/2008-address-changes_64tass.S @@ -90,14 +90,14 @@ ulabel .byte $00 .byte $01 .here .logical $3100 -L3100 .byte $02 + .byte $02 fwd bit fwd lda ulabel lda ulabel+1 lda $300e lda $300f - lda L3100 + lda fwd-1 beq L3182 .byte $ea .byte $ea diff --git a/SourceGen/SGTestData/Expected/2008-address-changes_Merlin32.S b/SourceGen/SGTestData/Expected/2008-address-changes_Merlin32.S index 72fbb73..e50faf7 100644 --- a/SourceGen/SGTestData/Expected/2008-address-changes_Merlin32.S +++ b/SourceGen/SGTestData/Expected/2008-address-changes_Merlin32.S @@ -77,14 +77,14 @@ L3000 bit L3000 ulabel dfb $00 dfb $01 org $3100 -L3100 dfb $02 + dfb $02 fwd bit fwd lda ulabel lda ulabel+1 lda $300e lda $300f - lda L3100 + lda fwd-1 beq L3182 dfb $ea dfb $ea diff --git a/SourceGen/SGTestData/Expected/2008-address-changes_acme.S b/SourceGen/SGTestData/Expected/2008-address-changes_acme.S index dd73c74..bdee8d9 100644 --- a/SourceGen/SGTestData/Expected/2008-address-changes_acme.S +++ b/SourceGen/SGTestData/Expected/2008-address-changes_acme.S @@ -90,14 +90,14 @@ ulabel !byte $00 !byte $01 } ;!pseudopc !pseudopc $3100 { -L3100 !byte $02 + !byte $02 fwd bit fwd lda ulabel lda ulabel+1 lda $300e lda $300f - lda L3100 + lda fwd-1 beq L3182 !byte $ea !byte $ea diff --git a/SourceGen/SGTestData/Expected/2008-address-changes_cc65.S b/SourceGen/SGTestData/Expected/2008-address-changes_cc65.S index 38f0596..81a5b03 100644 --- a/SourceGen/SGTestData/Expected/2008-address-changes_cc65.S +++ b/SourceGen/SGTestData/Expected/2008-address-changes_cc65.S @@ -92,14 +92,14 @@ ulabel: .byte $00 .byte $01 ; .segment "SEG011" .org $3100 -L3100: .byte $02 + .byte $02 fwd: bit fwd lda ulabel lda ulabel+1 lda $300e lda $300f - lda L3100 + lda fwd-1 beq L3182 .byte $ea .byte $ea diff --git a/SourceGen/SGTestData/Expected/2010-target-adjustment_64tass.S b/SourceGen/SGTestData/Expected/2010-target-adjustment_64tass.S index f53323d..21e09c5 100644 --- a/SourceGen/SGTestData/Expected/2010-target-adjustment_64tass.S +++ b/SourceGen/SGTestData/Expected/2010-target-adjustment_64tass.S @@ -45,7 +45,7 @@ L1069 pea L1069-1 lda #$ea L1077 sta L1077 L107A sta L107A+1 - sta $107f + sta $107f ;self-ref; operand format refs nonexistent symbol brl L2002 .byte $80 @@ -57,6 +57,31 @@ L2000 .byte $82 L2002 bit L2002 lda dat81 lda L2000 + bra L2018 + +L200D .byte $7c +L200E .byte $7d +L200F .byte $7e + .byte $7f +nearby .byte $80 + .byte $81 + .byte $82 + .byte $83 +L2015 .byte $84 +L2016 .byte $85 +L2017 .byte $86 + +L2018 lda L200D + lda L200E + lda L200F + lda nearby-1 + lda nearby + lda nearby+1 + lda nearby+2 + lda nearby+3 + lda L2015 + lda L2016 + lda L2017 rts .here diff --git a/SourceGen/SGTestData/Expected/2010-target-adjustment_Merlin32.S b/SourceGen/SGTestData/Expected/2010-target-adjustment_Merlin32.S index 4c9f7ec..5e21253 100644 --- a/SourceGen/SGTestData/Expected/2010-target-adjustment_Merlin32.S +++ b/SourceGen/SGTestData/Expected/2010-target-adjustment_Merlin32.S @@ -40,7 +40,7 @@ L1069 pea L1069-1 lda #$ea L1077 sta L1077 L107A sta L107A+1 - sta $107f + sta $107f ;self-ref; operand format refs nonexistent symbol brl L2002 dfb $80 @@ -52,5 +52,30 @@ L2000 dfb $82 L2002 bit L2002 lda dat81 lda L2000 + bra L2018 + +L200D dfb $7c +L200E dfb $7d +L200F dfb $7e + dfb $7f +nearby dfb $80 + dfb $81 + dfb $82 + dfb $83 +L2015 dfb $84 +L2016 dfb $85 +L2017 dfb $86 + +L2018 lda L200D + lda L200E + lda L200F + lda nearby-1 + lda nearby + lda nearby+1 + lda nearby+2 + lda nearby+3 + lda L2015 + lda L2016 + lda L2017 rts diff --git a/SourceGen/SGTestData/Expected/2010-target-adjustment_acme.S b/SourceGen/SGTestData/Expected/2010-target-adjustment_acme.S index 542536b..96ac59a 100644 --- a/SourceGen/SGTestData/Expected/2010-target-adjustment_acme.S +++ b/SourceGen/SGTestData/Expected/2010-target-adjustment_acme.S @@ -43,7 +43,7 @@ L1069 pea L1069-1 lda #$ea L1077 sta L1077 L107A sta L107A+1 - sta $107f + sta $107f ;self-ref; operand format refs nonexistent symbol brl L2002 !byte $80 @@ -55,6 +55,31 @@ L2000 !byte $82 L2002 bit L2002 lda dat81 lda L2000 + bra L2018 + +L200D !byte $7c +L200E !byte $7d +L200F !byte $7e + !byte $7f +nearby !byte $80 + !byte $81 + !byte $82 + !byte $83 +L2015 !byte $84 +L2016 !byte $85 +L2017 !byte $86 + +L2018 lda L200D + lda L200E + lda L200F + lda nearby-1 + lda nearby + lda nearby+1 + lda nearby+2 + lda nearby+3 + lda L2015 + lda L2016 + lda L2017 rts } ;!pseudopc diff --git a/SourceGen/SGTestData/Expected/2010-target-adjustment_cc65.S b/SourceGen/SGTestData/Expected/2010-target-adjustment_cc65.S index 75c5451..ae425c4 100644 --- a/SourceGen/SGTestData/Expected/2010-target-adjustment_cc65.S +++ b/SourceGen/SGTestData/Expected/2010-target-adjustment_cc65.S @@ -44,7 +44,7 @@ L1069: pea L1069-1 lda #$ea L1077: sta L1077 L107A: sta L107A+1 - sta $107f + sta $107f ;self-ref; operand format refs nonexistent symbol brl L2002 .byte $80 @@ -57,5 +57,30 @@ L2000: .byte $82 L2002: bit L2002 lda dat81 lda L2000 + bra L2018 + +L200D: .byte $7c +L200E: .byte $7d +L200F: .byte $7e + .byte $7f +nearby: .byte $80 + .byte $81 + .byte $82 + .byte $83 +L2015: .byte $84 +L2016: .byte $85 +L2017: .byte $86 + +L2018: lda L200D + lda L200E + lda L200F + lda nearby-1 + lda nearby + lda nearby+1 + lda nearby+2 + lda nearby+3 + lda L2015 + lda L2016 + lda L2017 rts diff --git a/SourceGen/SGTestData/Expected/2010-target-adjustment_cc65.cfg b/SourceGen/SGTestData/Expected/2010-target-adjustment_cc65.cfg index 7ddf8c4..1ffbb06 100644 --- a/SourceGen/SGTestData/Expected/2010-target-adjustment_cc65.cfg +++ b/SourceGen/SGTestData/Expected/2010-target-adjustment_cc65.cfg @@ -2,7 +2,7 @@ MEMORY { MAIN: file=%O, start=%S, size=65536; # MEM000: file=%O, start=$1000, size=133; -# MEM001: file=%O, start=$2000, size=12; +# MEM001: file=%O, start=$2000, size=58; } SEGMENTS { CODE: load=MAIN, type=rw; diff --git a/SourceGen/SGTestData/Source/2010-target-adjustment.S b/SourceGen/SGTestData/Source/2010-target-adjustment.S index 8e31d78..0fd0fef 100644 --- a/SourceGen/SGTestData/Source/2010-target-adjustment.S +++ b/SourceGen/SGTestData/Source/2010-target-adjustment.S @@ -72,4 +72,34 @@ skipdat1 bit skipdat1 lda dat81 lda dat82 ;this should NOT use dat81 + +; +; Test the precise extent to which we associate a label with nearby elements. +; + bra skipmore + + dfb $7c + dfb $7d + dfb $7e + dfb $7f +nearby dfb $80 ;EDIT: label this + dfb $81 + dfb $82 + dfb $83 + dfb $84 + dfb $85 + dfb $86 + +skipmore + lda nearby-4 + lda nearby-3 + lda nearby-2 + lda nearby-1 + lda nearby + lda nearby+1 + lda nearby+2 + lda nearby+3 + lda nearby+4 + lda nearby+5 + lda nearby+6 rts