splat64 0.36.4__tar.gz → 0.37.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {splat64-0.36.4 → splat64-0.37.1}/CHANGELOG.md +20 -1
- {splat64-0.36.4 → splat64-0.37.1}/PKG-INFO +4 -4
- {splat64-0.36.4 → splat64-0.37.1}/README.md +1 -1
- {splat64-0.36.4 → splat64-0.37.1}/docs/Configuration.md +34 -0
- {splat64-0.36.4 → splat64-0.37.1}/pyproject.toml +2 -2
- {splat64-0.36.4 → splat64-0.37.1}/requirements.txt +1 -1
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/__init__.py +1 -1
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/disassembler/spimdisasm_disassembler.py +3 -1
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/scripts/split.py +1 -1
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/c.py +2 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/codesubsegment.py +20 -15
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/compiler.py +2 -1
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/file_presets.py +19 -7
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/options.py +13 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/main.s +48 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/include/include_asm.h +6 -1
- {splat64-0.36.4 → splat64-0.37.1}/.gitattributes +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/.github/workflows/format.yml +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/.github/workflows/lint.yml +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/.github/workflows/publish_docs_to_wiki.yml +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/.github/workflows/pypi.yml +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/.github/workflows/test_lib.yml +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/.github/workflows/unit_tests.yml +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/.gitignore +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/LICENSE +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/create_config.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/Adding-Symbols.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/Advanced-Reloc.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/Advanced.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/Examples.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/General-Workflow.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/Home.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/Quickstart-Elf.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/Quickstart.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/Segments.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/docs/VramClasses.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/mypy.ini +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/split.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/__main__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/disassembler/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/disassembler/disassembler.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/disassembler/disassembler_instance.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/disassembler/disassembler_section.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/disassembler/null_disassembler.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/platforms/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/platforms/n64.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/platforms/ps2.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/platforms/psp.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/platforms/psx.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/py.typed +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/scripts/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/scripts/capy.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/scripts/create_config.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/asm.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/asmtu.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/bin.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/bss.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/code.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/cpp.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/data.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/databin.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/eh_frame.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/gcc_except_table.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/group.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/hasm.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/header.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/lib.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/linker_offset.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/pad.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/rdata.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/rodata.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/rodatabin.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/sbss.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/sdata.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/segment.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/common/textbin.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/linker_entry.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/ci.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/ci4.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/ci8.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/decompressor.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/gfx.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/header.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/i1.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/i4.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/i8.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/ia16.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/ia4.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/ia8.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/img.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/ipl3.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/mio0.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/palette.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/rgba16.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/rgba32.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/rsp.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/vtx.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/n64/yay0.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/ps2/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/ps2/ctor.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/ps2/lit4.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/ps2/lit8.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/ps2/vtables.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/psp/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/psx/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/psx/header.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/segtypes/segment.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/cache_handler.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/color.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/conf.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/log.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/n64/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/n64/find_code_length.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/n64/rominfo.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/palettes.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/progress_bar.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/ps2/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/ps2/ps2elfinfo.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/psx/__init__.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/psx/psxexeinfo.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/relocs.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/statistics.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/symbols.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/utils.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/src/splat/util/vram_classes.py +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/Dockerfile +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/README.md +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/.gitignore +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/Makefile +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/build/basic_app.bin +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/dummy_ipl3.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/.splache +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/data/main.bss.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/data/main.data.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/data/main.rodata.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/handwritten.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/header.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/nonmatchings/main/D_80000510.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/nonmatchings/main/func_80000400.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/nonmatchings/main/func_800004A0.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/assets/dummy_ipl3.bin +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/basic_app.d +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/build/test/basic_app/split/src/main.asmproc.d +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/include/labels.inc +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/include/macro.inc +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/src/main.c +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/undefined_funcs_auto.txt +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/undefined_syms_auto.txt +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/handwritten.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/header.s +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/basic_app/main.c +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test/test_gen_expected.sh +0 -0
- {splat64-0.36.4 → splat64-0.37.1}/test.py +0 -0
|
@@ -1,12 +1,31 @@
|
|
|
1
1
|
# splat Release Notes
|
|
2
2
|
|
|
3
|
+
### 0.37.1
|
|
4
|
+
|
|
5
|
+
* Fix `make_full_disasm_for_code` not extracting data-only TUs.
|
|
6
|
+
* Fix `make_full_disasm_for_code` and `disassemble_all` combo
|
|
7
|
+
* Fixes not writing other sections to asm file when both options are enabled.
|
|
8
|
+
|
|
9
|
+
### 0.37.0
|
|
10
|
+
|
|
11
|
+
* Add define check to allow using `macro.inc` instead of `labels.inc` in `include_asm.h`.
|
|
12
|
+
* The macro must be `INCLUDE_ASM_USE_MACRO_INC` and have a non zero value.
|
|
13
|
+
* New option: `generated_asm_macros_directory`
|
|
14
|
+
* Allow changing the directory for the generated assembly macros files.
|
|
15
|
+
* Add workaround for the short loop bug that happens in SN PS2 compilers.
|
|
16
|
+
* This workaround is only used when the selected compiler is `EEGCC`.
|
|
17
|
+
* This can be manually overriden with the option `align_on_branch_labels`.
|
|
18
|
+
* Emit an `.align` directive in branch labels to avoid triggering the bug.
|
|
19
|
+
* The bug in question adds a non-zero number of nops as a workaround for a hardware defect, producing non-matching builds.
|
|
20
|
+
|
|
3
21
|
### 0.36.4
|
|
4
22
|
|
|
5
23
|
* Fix missing dollar signs (`$`) on specific ps2 registers on the extra assembly files generated by `make_full_disasm_for_code`.
|
|
6
24
|
* Pin versions of dependencies to avoid breaking because they broke.
|
|
7
25
|
* Add more checks for texture and palette segments to have a correct size in their yaml entries, ensuring their `width`/`height` or `size` attributes match the sizes relative to other segments.
|
|
8
26
|
* Fix `gfx` segments sometimes not picking up properly the corresponding typed reference.
|
|
9
|
-
*
|
|
27
|
+
* Fix sometimes picking a name symbol from a different segment instead of the owned segment when both symbols have the same address but are from completely different segments.
|
|
28
|
+
* Add PS2 compatibility to `create_config`.
|
|
10
29
|
|
|
11
30
|
### 0.36.3
|
|
12
31
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: splat64
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.37.1
|
|
4
4
|
Summary: A binary splitting tool to assist with decompilation and modding projects
|
|
5
5
|
Project-URL: Repository, https://github.com/ethteck/splat
|
|
6
6
|
Project-URL: Issues, https://github.com/ethteck/splat/issues
|
|
@@ -42,7 +42,7 @@ Requires-Dist: n64img>=0.3.3; extra == 'dev'
|
|
|
42
42
|
Requires-Dist: pygfxd>=1.0.5; extra == 'dev'
|
|
43
43
|
Requires-Dist: rabbitizer<2.0.0,>=1.12.0; extra == 'dev'
|
|
44
44
|
Requires-Dist: ruff; extra == 'dev'
|
|
45
|
-
Requires-Dist: spimdisasm<2.0.0,>=1.
|
|
45
|
+
Requires-Dist: spimdisasm<2.0.0,>=1.39.0; extra == 'dev'
|
|
46
46
|
Requires-Dist: types-colorama; extra == 'dev'
|
|
47
47
|
Requires-Dist: types-pyyaml; extra == 'dev'
|
|
48
48
|
Provides-Extra: mips
|
|
@@ -50,7 +50,7 @@ Requires-Dist: crunch64<1.0.0,>=0.5.1; extra == 'mips'
|
|
|
50
50
|
Requires-Dist: n64img>=0.3.3; extra == 'mips'
|
|
51
51
|
Requires-Dist: pygfxd>=1.0.5; extra == 'mips'
|
|
52
52
|
Requires-Dist: rabbitizer<2.0.0,>=1.12.0; extra == 'mips'
|
|
53
|
-
Requires-Dist: spimdisasm<2.0.0,>=1.
|
|
53
|
+
Requires-Dist: spimdisasm<2.0.0,>=1.39.0; extra == 'mips'
|
|
54
54
|
Description-Content-Type: text/markdown
|
|
55
55
|
|
|
56
56
|
# splat
|
|
@@ -76,7 +76,7 @@ The brackets corresponds to the optional dependencies to install while installin
|
|
|
76
76
|
If you use a `requirements.txt` file in your repository, then you can add this library with the following line:
|
|
77
77
|
|
|
78
78
|
```txt
|
|
79
|
-
splat64[mips]>=0.
|
|
79
|
+
splat64[mips]>=0.37.1,<1.0.0
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
### Optional dependencies
|
|
@@ -21,7 +21,7 @@ The brackets corresponds to the optional dependencies to install while installin
|
|
|
21
21
|
If you use a `requirements.txt` file in your repository, then you can add this library with the following line:
|
|
22
22
|
|
|
23
23
|
```txt
|
|
24
|
-
splat64[mips]>=0.
|
|
24
|
+
splat64[mips]>=0.37.1,<1.0.0
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
### Optional dependencies
|
|
@@ -147,6 +147,12 @@ Allows configuring the style used by the generated `INCLUDE_ASM` macro. It curre
|
|
|
147
147
|
|
|
148
148
|
Defaults to `default`.
|
|
149
149
|
|
|
150
|
+
### generated_asm_macros_directory
|
|
151
|
+
|
|
152
|
+
Change the directory where the assembly macros files are written to.
|
|
153
|
+
|
|
154
|
+
Defaults to `include`.
|
|
155
|
+
|
|
150
156
|
### o_as_suffix
|
|
151
157
|
|
|
152
158
|
Used to determine the file extension of the built files that will be listed on the linker script.
|
|
@@ -842,6 +848,16 @@ Emit a full `.s` file for each `c`/`cpp` segment containing disassembly of .text
|
|
|
842
848
|
|
|
843
849
|
Can be used to generate "target" or "expected" objects for asm diffing.
|
|
844
850
|
|
|
851
|
+
To generate `.s` files for data-only TUs (or rodata/bss only, or any other combination that doesn't have a text section) a dummy `c` or `cpp` section with the same name as the data section must be defined in the yaml with an start value of `auto` instead of a number. For example:
|
|
852
|
+
|
|
853
|
+
```yaml
|
|
854
|
+
- [auto, c, boot/rom_offsets]
|
|
855
|
+
|
|
856
|
+
# -- Other c or data subsegments --
|
|
857
|
+
|
|
858
|
+
- [0x00F340, .data, boot/rom_offsets]
|
|
859
|
+
```
|
|
860
|
+
|
|
845
861
|
### global_vram_start and global_vram_end
|
|
846
862
|
|
|
847
863
|
Allow specifying that the global memory range may be larger than what was automatically detected.
|
|
@@ -932,3 +948,21 @@ use_legacy_include_asm: True
|
|
|
932
948
|
|
|
933
949
|
#### Default
|
|
934
950
|
`False`
|
|
951
|
+
|
|
952
|
+
## align_on_branch_labels
|
|
953
|
+
|
|
954
|
+
If enabled emit no-op alignment directives on all branch labels.
|
|
955
|
+
|
|
956
|
+
This is useful as a workaround for the "short loop bug" present in SN PS2 compilers, in which the compiler may decide to insert extra `nop` instructions due to a hardware defect, producing non-matching builds.
|
|
957
|
+
|
|
958
|
+
This option is enabled automatically if the selected compiler is known to have this issue, but this option allows to override the default selection in case this setting ends up producing problems.
|
|
959
|
+
|
|
960
|
+
#### Usage
|
|
961
|
+
|
|
962
|
+
```yaml
|
|
963
|
+
align_on_branch_labels: False
|
|
964
|
+
```
|
|
965
|
+
|
|
966
|
+
#### Default
|
|
967
|
+
|
|
968
|
+
`True` if [`compiler`](#compiler) is set to `EEGCC`, `False` otherwise
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "splat64"
|
|
3
3
|
# Should be synced with src/splat/__init__.py
|
|
4
|
-
version = "0.
|
|
4
|
+
version = "0.37.1"
|
|
5
5
|
description = "A binary splitting tool to assist with decompilation and modding projects"
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
license = {file = "LICENSE"}
|
|
@@ -20,7 +20,7 @@ dependencies = [
|
|
|
20
20
|
|
|
21
21
|
[project.optional-dependencies]
|
|
22
22
|
mips = [
|
|
23
|
-
"spimdisasm>=1.
|
|
23
|
+
"spimdisasm>=1.39.0,<2.0.0", # This value should be keep in sync with the version listed on disassembler/spimdisasm_disassembler.py
|
|
24
24
|
"rabbitizer>=1.12.0,<2.0.0",
|
|
25
25
|
"pygfxd>=1.0.5",
|
|
26
26
|
"n64img>=0.3.3",
|
|
@@ -4,7 +4,7 @@ tqdm==4.67.1
|
|
|
4
4
|
intervaltree==3.1.0
|
|
5
5
|
colorama==0.4.6
|
|
6
6
|
# This value should be keep in sync with the version listed on disassembler/spimdisasm_disassembler.py and pyproject.toml
|
|
7
|
-
spimdisasm>=1.
|
|
7
|
+
spimdisasm>=1.39.0
|
|
8
8
|
rabbitizer>=1.10.0
|
|
9
9
|
pygfxd>=1.0.5
|
|
10
10
|
n64img>=0.1.4
|
|
@@ -7,7 +7,7 @@ from typing import Set
|
|
|
7
7
|
|
|
8
8
|
class SpimdisasmDisassembler(disassembler.Disassembler):
|
|
9
9
|
# This value should be kept in sync with the version listed on requirements.txt and pyproject.toml
|
|
10
|
-
SPIMDISASM_MIN = (1,
|
|
10
|
+
SPIMDISASM_MIN = (1, 39, 0)
|
|
11
11
|
|
|
12
12
|
def configure(self):
|
|
13
13
|
# Configure spimdisasm
|
|
@@ -74,6 +74,8 @@ class SpimdisasmDisassembler(disassembler.Disassembler):
|
|
|
74
74
|
spimdisasm.common.GlobalConfig.SYMBOL_FINDER_FILTERED_ADDRESSES_AS_HILO = (
|
|
75
75
|
False
|
|
76
76
|
)
|
|
77
|
+
if options.opts.align_on_branch_labels:
|
|
78
|
+
spimdisasm.common.GlobalConfig.ASM_EMIT_ALIGN_BRANCH_LABELS = True
|
|
77
79
|
rabbitizer.config.toolchainTweaks_treatJAsUnconditionalBranch = (
|
|
78
80
|
selected_compiler.j_as_branch
|
|
79
81
|
)
|
|
@@ -581,7 +581,7 @@ def add_arguments_to_parser(parser: argparse.ArgumentParser):
|
|
|
581
581
|
nargs="+",
|
|
582
582
|
type=Path,
|
|
583
583
|
)
|
|
584
|
-
parser.add_argument("--modes", nargs="+", default="all")
|
|
584
|
+
parser.add_argument("--modes", nargs="+", default=["all"])
|
|
585
585
|
parser.add_argument("--verbose", action="store_true", help="Enable debug logging")
|
|
586
586
|
parser.add_argument(
|
|
587
587
|
"--use-cache", action="store_true", help="Only split changed segments in config"
|
|
@@ -152,6 +152,8 @@ class CommonSegC(CommonSegCodeSubsegment):
|
|
|
152
152
|
|
|
153
153
|
def split(self, rom_bytes: bytes):
|
|
154
154
|
if self.is_auto_segment:
|
|
155
|
+
if options.opts.make_full_disasm_for_code:
|
|
156
|
+
self.split_as_asmtu_file(self.asm_out_path())
|
|
155
157
|
return
|
|
156
158
|
|
|
157
159
|
if self.rom_start != self.rom_end:
|
|
@@ -252,22 +252,21 @@ class CommonSegCodeSubsegment(Segment):
|
|
|
252
252
|
f.write(self.spim_section.disassemble())
|
|
253
253
|
|
|
254
254
|
# Same as above but write all sections from siblings
|
|
255
|
-
def split_as_asmtu_file(self, out_path:
|
|
256
|
-
if self.spim_section is None:
|
|
257
|
-
return
|
|
258
|
-
|
|
259
|
-
if not out_path:
|
|
260
|
-
return
|
|
261
|
-
|
|
255
|
+
def split_as_asmtu_file(self, out_path: Path):
|
|
262
256
|
out_path.parent.mkdir(parents=True, exist_ok=True)
|
|
263
257
|
|
|
264
258
|
self.print_file_boundaries()
|
|
265
259
|
|
|
266
260
|
with open(out_path, "w", newline="\n") as f:
|
|
267
|
-
#
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
261
|
+
# self.spim_section would be None if the current section was
|
|
262
|
+
# declared `auto` in the yaml.
|
|
263
|
+
# This can be useful when there are TUs with only data/rodata/bss/etc
|
|
264
|
+
# sections but not text section.
|
|
265
|
+
if self.spim_section is not None:
|
|
266
|
+
# Write `.text` contents
|
|
267
|
+
for line in self.get_asm_file_header():
|
|
268
|
+
f.write(line + "\n")
|
|
269
|
+
f.write(self.spim_section.disassemble())
|
|
271
270
|
|
|
272
271
|
# Disassemble the siblings to this file by respecting the `section_order`
|
|
273
272
|
for sect in self.section_order:
|
|
@@ -281,25 +280,31 @@ class CommonSegCodeSubsegment(Segment):
|
|
|
281
280
|
if (
|
|
282
281
|
isinstance(sibling, CommonSegCodeSubsegment)
|
|
283
282
|
and sibling.spim_section is not None
|
|
284
|
-
and
|
|
283
|
+
and (
|
|
284
|
+
not sibling.should_self_split()
|
|
285
|
+
or options.opts.make_full_disasm_for_code
|
|
286
|
+
)
|
|
285
287
|
):
|
|
286
288
|
f.write("\n")
|
|
287
289
|
f.write(f"{sibling.get_section_asm_line()}\n\n")
|
|
288
290
|
f.write(sibling.spim_section.disassemble())
|
|
289
291
|
|
|
290
|
-
# Another loop to check anything that somehow may not be present
|
|
292
|
+
# Another loop to check anything that somehow may not be present in the `section_order`
|
|
291
293
|
for sect, sibling in self.siblings.items():
|
|
292
294
|
if sect == self.get_linker_section_linksection():
|
|
293
295
|
continue
|
|
294
296
|
|
|
295
297
|
if sect in self.section_order:
|
|
296
|
-
# Already handled
|
|
298
|
+
# Already handled in the above loop
|
|
297
299
|
continue
|
|
298
300
|
|
|
299
301
|
if (
|
|
300
302
|
isinstance(sibling, CommonSegCodeSubsegment)
|
|
301
303
|
and sibling.spim_section is not None
|
|
302
|
-
and
|
|
304
|
+
and (
|
|
305
|
+
not sibling.should_self_split()
|
|
306
|
+
or options.opts.make_full_disasm_for_code
|
|
307
|
+
)
|
|
303
308
|
):
|
|
304
309
|
f.write("\n")
|
|
305
310
|
f.write(f"{sibling.get_section_asm_line()}\n\n")
|
|
@@ -18,6 +18,7 @@ class Compiler:
|
|
|
18
18
|
asm_emit_size_directive: Optional[bool] = None
|
|
19
19
|
j_as_branch: bool = False
|
|
20
20
|
uses_include_asm: bool = True
|
|
21
|
+
align_on_branch_labels: bool = False
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
GCC = Compiler(
|
|
@@ -61,7 +62,7 @@ PSYQ = Compiler(
|
|
|
61
62
|
|
|
62
63
|
# PS2
|
|
63
64
|
MWCCPS2 = Compiler("MWCCPS2", uses_include_asm=False)
|
|
64
|
-
EEGCC = Compiler("EEGCC")
|
|
65
|
+
EEGCC = Compiler("EEGCC", align_on_branch_labels=True)
|
|
65
66
|
|
|
66
67
|
compiler_for_name: Dict[str, Compiler] = {
|
|
67
68
|
x.name: x
|
|
@@ -5,10 +5,12 @@ This includes writing files like:
|
|
|
5
5
|
- include/macro.inc
|
|
6
6
|
- include/labels.inc
|
|
7
7
|
- include/gte_macros.inc
|
|
8
|
+
|
|
9
|
+
The directory where these files are written to can be controlled with
|
|
10
|
+
`options.opts.generated_asm_macros_directory`.
|
|
8
11
|
"""
|
|
9
12
|
|
|
10
13
|
from pathlib import Path
|
|
11
|
-
import os
|
|
12
14
|
|
|
13
15
|
from . import options, log
|
|
14
16
|
|
|
@@ -22,7 +24,7 @@ def write_all_files():
|
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
def _write(filepath: str, contents: str):
|
|
25
|
-
p = Path(
|
|
27
|
+
p = Path(filepath)
|
|
26
28
|
p.parent.mkdir(parents=True, exist_ok=True)
|
|
27
29
|
|
|
28
30
|
if p.exists():
|
|
@@ -39,6 +41,8 @@ def write_include_asm_h():
|
|
|
39
41
|
# These compilers do not use the `INCLUDE_ASM` macro.
|
|
40
42
|
return
|
|
41
43
|
|
|
44
|
+
directory = options.opts.generated_asm_macros_directory.as_posix()
|
|
45
|
+
|
|
42
46
|
if options.opts.include_asm_macro_style == "maspsx_hack":
|
|
43
47
|
include_asm_macro = """\
|
|
44
48
|
#define INCLUDE_ASM(FOLDER, NAME) \\
|
|
@@ -88,7 +92,12 @@ def write_include_asm_h():
|
|
|
88
92
|
#ifndef INCLUDE_RODATA
|
|
89
93
|
{include_rodata_macro}\
|
|
90
94
|
#endif
|
|
91
|
-
|
|
95
|
+
|
|
96
|
+
#if INCLUDE_ASM_USE_MACRO_INC
|
|
97
|
+
__asm__(".include \\"{directory}/macro.inc\\"\\n");
|
|
98
|
+
#else
|
|
99
|
+
__asm__(".include \\"{directory}/labels.inc\\"\\n");
|
|
100
|
+
#endif
|
|
92
101
|
|
|
93
102
|
#else
|
|
94
103
|
|
|
@@ -103,10 +112,12 @@ __asm__(".include \\"include/labels.inc\\"\\n");
|
|
|
103
112
|
|
|
104
113
|
#endif /* INCLUDE_ASM_H */
|
|
105
114
|
"""
|
|
106
|
-
_write("
|
|
115
|
+
_write(f"{directory}/include_asm.h", file_data)
|
|
107
116
|
|
|
108
117
|
|
|
109
118
|
def write_assembly_inc_files():
|
|
119
|
+
directory = options.opts.generated_asm_macros_directory.as_posix()
|
|
120
|
+
|
|
110
121
|
func_macros = f"""\
|
|
111
122
|
# A function symbol.
|
|
112
123
|
.macro {options.opts.asm_function_macro} label, visibility=global
|
|
@@ -230,7 +241,7 @@ def write_assembly_inc_files():
|
|
|
230
241
|
{data_macros}
|
|
231
242
|
{nm_macros}\
|
|
232
243
|
"""
|
|
233
|
-
_write("
|
|
244
|
+
_write(f"{directory}/labels.inc", labels_inc)
|
|
234
245
|
|
|
235
246
|
if options.opts.platform in {"n64", "psx"}:
|
|
236
247
|
gas = macros_inc
|
|
@@ -338,7 +349,7 @@ def write_assembly_inc_files():
|
|
|
338
349
|
{gas}
|
|
339
350
|
.endif
|
|
340
351
|
"""
|
|
341
|
-
_write("
|
|
352
|
+
_write(f"{directory}/macro.inc", f"{preamble}\n{gas}")
|
|
342
353
|
|
|
343
354
|
|
|
344
355
|
def write_gte_macros():
|
|
@@ -762,4 +773,5 @@ def write_gte_macros():
|
|
|
762
773
|
.endif
|
|
763
774
|
"""
|
|
764
775
|
|
|
765
|
-
|
|
776
|
+
directory = options.opts.generated_asm_macros_directory.as_posix()
|
|
777
|
+
_write(f"{directory}/gte_macros.inc", gte_macros)
|
|
@@ -43,6 +43,8 @@ class SplatOpts:
|
|
|
43
43
|
# default: The default one.
|
|
44
44
|
# maspsx_hack: Use the maspsx hack workaround definition https://github.com/mkst/maspsx?tab=readme-ov-file#include_asm-reordering-workaround-hack
|
|
45
45
|
include_asm_macro_style: Literal["default", "maspsx_hack"]
|
|
46
|
+
# Directory to place the generated asm macros files.
|
|
47
|
+
generated_asm_macros_directory: Path
|
|
46
48
|
# Determines whether to use .o as the suffix for all binary files?... TODO document
|
|
47
49
|
use_o_as_suffix: bool
|
|
48
50
|
# the value of the $gp register to correctly calculate offset to %gp_rel relocs
|
|
@@ -278,6 +280,8 @@ class SplatOpts:
|
|
|
278
280
|
# Determines whether to use a legacy INCLUDE_ASM macro format in c files
|
|
279
281
|
# only applies to GCC/SN64
|
|
280
282
|
use_legacy_include_asm: bool
|
|
283
|
+
# Emit alignment directives in branch labels, as a way to workaround the short loop bug present in SN PS2 compilers
|
|
284
|
+
align_on_branch_labels: bool
|
|
281
285
|
|
|
282
286
|
# Returns whether the given mode is currently enabled
|
|
283
287
|
def is_mode_active(self, mode: str) -> bool:
|
|
@@ -392,6 +396,11 @@ def _parse_yaml(
|
|
|
392
396
|
if asm_emit_size_directive is None:
|
|
393
397
|
asm_emit_size_directive = comp.asm_emit_size_directive
|
|
394
398
|
|
|
399
|
+
align_on_branch_labels = p.parse_optional_opt("align_on_branch_labels", bool)
|
|
400
|
+
# If option not provided then use the compiler default
|
|
401
|
+
if align_on_branch_labels is None:
|
|
402
|
+
align_on_branch_labels = comp.align_on_branch_labels
|
|
403
|
+
|
|
395
404
|
def parse_endianness() -> Literal["big", "little"]:
|
|
396
405
|
endianness = p.parse_opt_within(
|
|
397
406
|
"endianness",
|
|
@@ -454,6 +463,9 @@ def _parse_yaml(
|
|
|
454
463
|
),
|
|
455
464
|
generate_asm_macros_files=p.parse_opt("generate_asm_macros_files", bool, True),
|
|
456
465
|
include_asm_macro_style=parse_include_asm_macro_style(),
|
|
466
|
+
generated_asm_macros_directory=p.parse_path(
|
|
467
|
+
base_path, "generated_asm_macros_directory", "include"
|
|
468
|
+
),
|
|
457
469
|
use_o_as_suffix=p.parse_opt("o_as_suffix", bool, False),
|
|
458
470
|
gp=p.parse_optional_opt("gp_value", int),
|
|
459
471
|
check_consecutive_segment_types=p.parse_opt(
|
|
@@ -608,6 +620,7 @@ def _parse_yaml(
|
|
|
608
620
|
hardware_regs=p.parse_opt("hardware_regs", bool, False),
|
|
609
621
|
image_type_in_extension=p.parse_opt("image_type_in_extension", bool, False),
|
|
610
622
|
use_legacy_include_asm=p.parse_opt("use_legacy_include_asm", bool, False),
|
|
623
|
+
align_on_branch_labels=align_on_branch_labels,
|
|
611
624
|
disasm_unknown=p.parse_opt("disasm_unknown", bool, False),
|
|
612
625
|
detect_redundant_function_end=p.parse_opt(
|
|
613
626
|
"detect_redundant_function_end", bool, True
|
|
@@ -86,3 +86,51 @@ glabel func_800004A0
|
|
|
86
86
|
/* 10E8 800004E8 27BD0018 */ addiu $sp, $sp, 0x18
|
|
87
87
|
endlabel func_800004A0
|
|
88
88
|
/* 10EC 800004EC 00000000 */ nop
|
|
89
|
+
|
|
90
|
+
.section .data, "wa"
|
|
91
|
+
|
|
92
|
+
nonmatching D_80000500
|
|
93
|
+
|
|
94
|
+
dlabel D_80000500
|
|
95
|
+
/* 1100 80000500 00000001 */ .word 0x00000001
|
|
96
|
+
enddlabel D_80000500
|
|
97
|
+
|
|
98
|
+
nonmatching D_80000504
|
|
99
|
+
|
|
100
|
+
dlabel D_80000504
|
|
101
|
+
/* 1104 80000504 00000000 */ .word 0x00000000
|
|
102
|
+
/* 1108 80000508 00000000 */ .word 0x00000000
|
|
103
|
+
/* 110C 8000050C 00000000 */ .word 0x00000000
|
|
104
|
+
enddlabel D_80000504
|
|
105
|
+
|
|
106
|
+
.section .rodata, "a"
|
|
107
|
+
|
|
108
|
+
nonmatching D_80000510
|
|
109
|
+
|
|
110
|
+
dlabel D_80000510
|
|
111
|
+
/* 1110 80000510 00010203 */ .word 0x00010203
|
|
112
|
+
/* 1114 80000514 04050607 */ .word 0x04050607
|
|
113
|
+
enddlabel D_80000510
|
|
114
|
+
|
|
115
|
+
.align 3
|
|
116
|
+
nonmatching jtbl_80000518
|
|
117
|
+
|
|
118
|
+
dlabel jtbl_80000518
|
|
119
|
+
/* 1118 80000518 80000448 */ .word .L80000448
|
|
120
|
+
/* 111C 8000051C 80000450 */ .word .L80000450
|
|
121
|
+
/* 1120 80000520 80000458 */ .word .L80000458
|
|
122
|
+
/* 1124 80000524 80000460 */ .word .L80000460
|
|
123
|
+
/* 1128 80000528 80000468 */ .word .L80000468
|
|
124
|
+
/* 112C 8000052C 80000470 */ .word .L80000470
|
|
125
|
+
/* 1130 80000530 80000478 */ .word .L80000478
|
|
126
|
+
/* 1134 80000534 80000480 */ .word .L80000480
|
|
127
|
+
/* 1138 80000538 00000000 */ .word 0x00000000
|
|
128
|
+
/* 113C 8000053C 00000000 */ .word 0x00000000
|
|
129
|
+
enddlabel jtbl_80000518
|
|
130
|
+
|
|
131
|
+
.section .bss, "wa"
|
|
132
|
+
|
|
133
|
+
nonmatching D_80000540, 0x80
|
|
134
|
+
|
|
135
|
+
dlabel D_80000540
|
|
136
|
+
/* 80000540 */ .space 0x80
|
|
@@ -22,7 +22,12 @@
|
|
|
22
22
|
".section .text" \
|
|
23
23
|
)
|
|
24
24
|
#endif
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
#if INCLUDE_ASM_USE_MACRO_INC
|
|
27
|
+
__asm__(".include \"test/basic_app/split/include/macro.inc\"\n");
|
|
28
|
+
#else
|
|
29
|
+
__asm__(".include \"test/basic_app/split/include/labels.inc\"\n");
|
|
30
|
+
#endif
|
|
26
31
|
|
|
27
32
|
#else
|
|
28
33
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/nonmatchings/main/D_80000510.s
RENAMED
|
File without changes
|
{splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/nonmatchings/main/func_80000400.s
RENAMED
|
File without changes
|
{splat64-0.36.4 → splat64-0.37.1}/test/basic_app/expected/asm/nonmatchings/main/func_800004A0.s
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|