mirror of https://github.com/zeldaret/oot.git
				
				
				
			
		
			
				
	
	
		
			94 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env python3
 | |
| # SPDX-FileCopyrightText: © 2024 ZeldaRET
 | |
| # SPDX-License-Identifier: CC0-1.0
 | |
| 
 | |
| import argparse
 | |
| from colorama import Fore
 | |
| from pathlib import Path
 | |
| 
 | |
| import mapfile_parser
 | |
| 
 | |
| 
 | |
| # symbols listed here will not be reported as unknown
 | |
| IGNORE_NTSC_1_2_SYMS_MISSING = """
 | |
| func_800ADC5C_unknown  func_800ADE30_unknown  func_80AEEA48_unknown  func_80800AD0_unknown  func_80800B08_unknown  func_800AF4DC_unknown  func_800CDDF8_unknown  func_800014E8_unknown  func_800AE558_unknown  func_800AE064_unknown  func_800AE1E0_unknown  func_800014FC_unknown  func_800ADFE4_unknown  func_800CDDC4_unknown  func_800AF0E0_unknown  func_800AE2B8_unknown  func_800AF304_unknown  func_800AE020_unknown  func_800AE05C_unknown  func_800AE408_unknown  func_8000161C_unknown  func_800AF558_unknown  func_800AED1C_unknown  func_80001640_unknown  func_800ADF4C_unknown  func_800015E8_unknown  func_800ADF90_unknown  func_800ADD14_unknown  func_800AE998_unknown  func_800AE4C0_unknown  func_800AF3DC_unknown  func_800AF1C4_unknown  func_8009D434_unknown  func_800AE35C_unknown  func_800AF720_unknown  func_800AF370_unknown  func_800AE258_unknown  func_800AF7F0_unknown  func_80001714_unknown  func_800AEC94_unknown  func_800ADDF0_unknown  func_800AE1F8_unknown
 | |
| __osReallocDebug  __osMallocRDebug  __osFreeDebug  __osMallocDebug
 | |
| guTranslateF  guScaleF  guMtxL2F
 | |
| osEPiWriteIo  createSpeedParam
 | |
| AudioDebug_ProcessInput
 | |
| func_800FF334
 | |
| n64dd_SetDiskVersion
 | |
| sJpegTask  _n64ddSegmentRomStart  _n64ddSegmentRomEnd  _n64ddSegmentStart  _string_n64dd_c
 | |
| _Putfld  _Ldunscale  _Genld
 | |
| """.split()
 | |
| 
 | |
| 
 | |
| def get_ldscript_syms(ldscript_p: Path):
 | |
|     symbols = set()
 | |
|     for l in ldscript_p.read_text().splitlines():
 | |
|         if "=" not in l:
 | |
|             continue
 | |
|         sym = l.split("=")[0].strip()
 | |
|         symbols.add(sym)
 | |
|     return symbols
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     parser = argparse.ArgumentParser()
 | |
|     parser.add_argument("-v", "--version", dest="oot_version", required=True)
 | |
|     args = parser.parse_args()
 | |
| 
 | |
|     version = args.oot_version
 | |
| 
 | |
|     ignore_syms_missing = set(
 | |
|         {
 | |
|             "ntsc-1.2": IGNORE_NTSC_1_2_SYMS_MISSING,
 | |
|         }.get(version, ())
 | |
|     )
 | |
| 
 | |
|     mapfile = mapfile_parser.mapfile.MapFile()
 | |
|     mapfile_path = Path(f"build/{version}/oot-{version}.map")
 | |
|     mapfile.readMapFile(mapfile_path)
 | |
| 
 | |
|     map_symbols = set()
 | |
|     for segment in mapfile:
 | |
|         for file in segment:
 | |
|             for sym in file:
 | |
|                 map_symbols.add(sym.name)
 | |
| 
 | |
|     has_unknown_metadata_syms = False
 | |
| 
 | |
|     undefined_syms_p = Path(f"build/{version}/undefined_syms.txt")
 | |
|     undefined_syms = get_ldscript_syms(undefined_syms_p)
 | |
| 
 | |
|     known_syms = map_symbols | undefined_syms
 | |
| 
 | |
|     for metadata_p in (
 | |
|         Path(f"tools/disasm/{version}/functions.txt"),
 | |
|         Path(f"tools/disasm/{version}/variables.txt"),
 | |
|     ):
 | |
|         metadata_symbols = get_ldscript_syms(metadata_p)
 | |
|         unknown_metadata_syms = metadata_symbols - known_syms
 | |
|         unknown_metadata_syms -= ignore_syms_missing
 | |
|         if unknown_metadata_syms:
 | |
|             print(
 | |
|                 f"{Fore.RED}Found",
 | |
|                 len(unknown_metadata_syms),
 | |
|                 f"symbols in{Fore.RESET}",
 | |
|                 metadata_p,
 | |
|                 f"{Fore.RED}that are neither in the map",
 | |
|                 f"nor in undefined_syms.txt{Fore.RESET}",
 | |
|             )
 | |
|             print("Were they renamed and the disasm metadata not updated? (or is the map out of date?)")
 | |
|             print("  ".join(unknown_metadata_syms))
 | |
|             has_unknown_metadata_syms = True
 | |
| 
 | |
|     if has_unknown_metadata_syms:
 | |
|         exit(1)
 | |
|     else:
 | |
|         print(f"{Fore.GREEN}OK{Fore.RESET}")
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     main()
 |