1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-11-30 01:50:10 +00:00
6502bench/SourceGen/SGTestData
Andy McFadden d3670c48e8 Label rework, part 6
Correct handling of local variables.  We now correctly uniquify them
with regard to non-unique labels.  Because local vars can effectively
have global scope we mostly want to treat them as global, but they're
uniquified relative to other globals very late in the process, so we
can't just throw them in the symbol table and be done.  Fortunately
local variables exist in a separate namespace, so we just need to
uniquify the variables relative to the post-localization symbol table.
In other words, we take the symbol table, apply the label map, and
rename any variable that clashes.

This also fixes an older problem where we weren't masking the
leading '_' on variable labels when generating 64tass output.

The code list now makes non-unique labels obvious, but you can't tell
the difference between unique global and unique local.  What's more,
the default type value in Edit Label is now adjusted to Global for
unique locals that were auto-generated.  To make it a bit easier to
figure out what's what, the Info panel now has a "label type" line
that reports the type.

The 2023-non-unique-labels test had some additional tests added to
exercise conflicts with local variables.  The 2019-local-variables
test output changed slightly because the de-duplicated variable
naming convention was simplified.
2019-11-18 13:36:53 -08:00
..
Expected Label rework, part 6 2019-11-18 13:36:53 -08:00
FunkyProjects
Source Label rework, part 6 2019-11-18 13:36:53 -08:00
1000-allops-value-65816
1001-allops-zero-65816
1002-embedded-instructions
1003-flags-and-branches
1004-data-recognition
2000-allops-value-6502
2000-allops-value-6502.dis65
2001-allops-zero-6502
2001-allops-zero-6502.dis65
2002-allops-value-65C02
2002-allops-value-65C02.dis65
2003-allops-zero-65C02
2003-allops-zero-65C02.dis65
2004-numeric-types Add junk/align directives 2019-10-18 21:00:28 -07:00
2004-numeric-types.dis65 Add junk/align directives 2019-10-18 21:00:28 -07:00
2005-string-types
2005-string-types.dis65
2006-operand-formats
2006-operand-formats.dis65
2007-labels-and-symbols
2007-labels-and-symbols.dis65
2007-labels-and-symbols.sym65
2008-address-changes
2008-address-changes.dis65
2009-branches-and-banks Add a blank line between constants and addresses 2019-10-22 22:45:13 -07:00
2009-branches-and-banks.dis65 Add a blank line between constants and addresses 2019-10-22 22:45:13 -07:00
2009-branches-and-banks.sym65
2010-target-adjustment Tweak "nearby" label finder 2019-10-29 18:12:22 -07:00
2010-target-adjustment.dis65 Tweak "nearby" label finder 2019-10-29 18:12:22 -07:00
2011-hinting
2011-hinting.cs Pass operand to extension script JSR/JSL handlers 2019-10-17 13:15:25 -07:00
2011-hinting.dis65
2012-label-localizer
2012-label-localizer.dis65
2013-notes-and-comments
2013-notes-and-comments.dis65 Tweak line folding code 2019-11-01 19:47:56 -07:00
2014-label-dp
2014-label-dp.dis65
2015-64k-nops
2015-64k-nops.dis65
2016-char-encoding-a
2016-char-encoding-a.dis65
2017-char-encoding-p
2017-char-encoding-p.dis65
2018-char-encoding-s
2018-char-encoding-s.dis65
2019-local-variables
2019-local-variables.dis65
2020-cycle-counts-65816
2020-cycle-counts-65816.dis65
2021-external-symbols
2021-external-symbols-1.sym65 Fix constants declared with MULTI_MASK 2019-10-18 16:19:42 -07:00
2021-external-symbols-2.sym65
2021-external-symbols-3.sym65
2021-external-symbols.dis65
2022-extension-scripts Correctly handle embedded instruction edge case 2019-10-19 17:28:45 -07:00
2022-extension-scripts-a.cs Pass operand to extension script JSR/JSL handlers 2019-10-17 13:15:25 -07:00
2022-extension-scripts-b.cs Correctly handle embedded instruction edge case 2019-10-19 17:28:45 -07:00
2022-extension-scripts.dis65 Correctly handle embedded instruction edge case 2019-10-19 17:28:45 -07:00
2022-extension-scripts.sym65
2023-non-unique-labels Label rework, part 6 2019-11-18 13:36:53 -08:00
2023-non-unique-labels.dis65 Label rework, part 6 2019-11-18 13:36:53 -08:00
README.md

SourceGen Test Data

This directory contains various regression tests.

NOTE: some tests may fail if you use a version of the assembler that is different from the one used to generate the expected output. The current set was generated for:

  • 64tass v1.53.1515
  • ACME v0.96.4
  • cc65 v2.18
  • Merlin 32 v1.0

Generator/Assembler Tests

Files with names like "1000-nifty-test" are regression test data files for the code generator. The test harness identifies them by filename pattern: four digits, a hyphen, then one or more alphanumeric and hyphens. Files with a '.' or '_' are ignored.

If the leading number is between 1000 and 1999, inclusive, the test file will be loaded as a new project. A 65816 CPU and load address of $1000 are assumed. As with all new projects, the first byte will be hinted as a code entry point. The entry flags are currently set to emulation mode, but tests should not rely on that.

If the leading number is 2000 or greater, the test file will be loaded as a saved project. A file with the same name plus a ".dis65" extension will be opened as the project file.

Execution

With debug features enabled, you can open the test runner from the menu with Debug > Source Generation Tests. Click "Run Test" to run all tests.

For each test, the test harness will create a new project or open the project file. For every known assembler, the test harness will generate source code, and compare it to the corresponding entry in the Expected directory. If they don't match exactly, a failure is reported for the generation phase. (These are text files, so the line terminators are not required to match.) Next, the generated sources are fed to the appropriate cross-assembler, whether or not the sources matched expectations. If the assembler reports success, the output file is compared to the original data file. If these match, success is reported for the assembly phase.

The top window in the test harness shows a summary of success or failure. The bottom window shows details reported for each individual test. Use the drop list to select which test is shown.

The generated sources and assembled output is placed into a temporary directory inside SGTestData that is named after the test. For example, test 2000-allops-value-6502 will have all of its generated output in a directory called "tmp2000". If all parts of the test are successful, the directory will be removed. If generation or assembly fails, or if you check the "retain output" box in the test harness, the directory and its contents will remain. This allows you to examine the outputs when investigating failures.

As a safety measure, the directory will NOT be removed if it contains files that the test harness doesn't recognize.

Updating Tests

If you want to add or update a test, follow these steps:

  1. Make the changes to the test data file and test project file.
  2. Run the test harness. The generation test will fail and leave output in the tmpNNNN directory. Make sure the assembly test is succeeding.
  3. After verifying that the generated sources look correct, copy them into the Expected directory, replacing any existing copies.
  4. Run the test harness. This should now report success, and will remove the tmpNNNN directory.

Be sure to have the version of the cross-assembler identified at the top of this document configured.

Other Notes

The original source code used to generate the test cases can be found in the Source directory. The test harness does not use these files. If you want to update a test file, you will need to run the assembler yourself. The assembler used is noted in a comment at the top of the file.

The code is not required to do anything useful. Many of the test cases would crash or hang if executed.

FunkyProjects

This is a collection of project files with deliberate errors. These exist to exercise the load-time error reporting. See the README in that directory for a full explanation.