From 4e9f40cb139ab66313fd24282fb9ef2060db5eed Mon Sep 17 00:00:00 2001 From: Roman971 <32455037+Roman971@users.noreply.github.com> Date: Sun, 2 May 2021 22:21:27 +0200 Subject: [PATCH] Update asm-processor and add make dependencies for global asm and early includes (#801) * Update asm-processor to latest master * Add make dependencies for global asm and early includes * Update asm-processor to latest master --- Makefile | 30 +++++++++++++++++----------- tools/asm_processor/asm_processor.py | 18 ++++++++++------- tools/asm_processor/build.py | 14 ++++++++++++- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 8d0afaa017..e0b058df00 100644 --- a/Makefile +++ b/Makefile @@ -110,6 +110,10 @@ O_FILES := $(foreach f,$(S_FILES:.s=.o),build/$f) \ $(foreach f,$(C_FILES:.c=.o),build/$f) \ $(foreach f,$(wildcard baserom/*),build/$f.o) +# Automatic dependency files +# (Only asm_processor dependencies are handled for now) +DEP_FILES := $(O_FILES:.o=.asmproc.d) + TEXTURE_FILES_RGBA32 := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.rgba32.png)) TEXTURE_FILES_RGBA16 := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.rgb5a1.png)) TEXTURE_FILES_GRAY4 := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.i4.png)) @@ -216,36 +220,36 @@ build/baserom/%.o: baserom/% $(OBJCOPY) -I binary -O elf32-big $< $@ build/asm/%.o: asm/%.s - $(AS) $(ASFLAGS) $^ -o $@ + $(AS) $(ASFLAGS) $< -o $@ build/data/%.o: data/%.s - iconv --from UTF-8 --to EUC-JP $^ | $(AS) $(ASFLAGS) -o $@ + iconv --from UTF-8 --to EUC-JP $< | $(AS) $(ASFLAGS) -o $@ build/assets/%.o: assets/%.c - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ + $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< $(OBJCOPY) -O binary $@ $@.bin build/src/overlays/%.o: src/overlays/%.c - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ - $(CC_CHECK) $^ - $(ZAPD) bovl -i $@ -cfg $^ --outputpath $(@D)/$(notdir $(@D))_reloc.s + $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< + $(CC_CHECK) $< + $(ZAPD) bovl -i $@ -cfg $< --outputpath $(@D)/$(notdir $(@D))_reloc.s -test -f $(@D)/$(notdir $(@D))_reloc.s && $(AS) $(ASFLAGS) $(@D)/$(notdir $(@D))_reloc.s -o $(@D)/$(notdir $(@D))_reloc.o @$(OBJDUMP) -d $@ > $(@:.o=.s) build/src/%.o: src/%.c - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ - $(CC_CHECK) $^ + $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< + $(CC_CHECK) $< @$(OBJDUMP) -d $@ > $(@:.o=.s) build/src/libultra_boot_O1/ll.o: src/libultra_boot_O1/ll.c - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ - $(CC_CHECK) $^ + $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< + $(CC_CHECK) $< python3 tools/set_o32abi_bit.py $@ @$(OBJDUMP) -d $@ > $(@:.o=.s) build/src/libultra_code_O1/llcvt.o: src/libultra_code_O1/llcvt.c - $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ - $(CC_CHECK) $^ + $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $< + $(CC_CHECK) $< python3 tools/set_o32abi_bit.py $@ @$(OBJDUMP) -d $@ > $(@:.o=.s) @@ -286,3 +290,5 @@ build/assets/%.bin.inc.c: assets/%.bin build/assets/%.jpg.inc.c: assets/%.jpg $(ZAPD) bren -i $< -o $@ -eh + +-include $(DEP_FILES) diff --git a/tools/asm_processor/asm_processor.py b/tools/asm_processor/asm_processor.py index 89da9a1fc8..302668d7de 100644 --- a/tools/asm_processor/asm_processor.py +++ b/tools/asm_processor/asm_processor.py @@ -722,7 +722,7 @@ float_regexpr = re.compile(r"[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?f") def repl_float_hex(m): return str(struct.unpack(">I", struct.pack(">f", float(m.group(0).strip().rstrip("f"))))[0]) -def parse_source(f, opt, framepointer, input_enc, output_enc, print_source=None): +def parse_source(f, opt, framepointer, input_enc, output_enc, out_dependencies, print_source=None): if opt in ['O2', 'O1']: if framepointer: min_instr_count = 6 @@ -786,6 +786,7 @@ def parse_source(f, opt, framepointer, input_enc, output_enc, print_source=None) elif ((line.startswith('GLOBAL_ASM("') or line.startswith('#pragma GLOBAL_ASM("')) and line.endswith('")')): fname = line[line.index('(') + 2 : -2] + out_dependencies.append(fname) global_asm = GlobalAsmBlock(fname) with open(fname, encoding=input_enc) as f: for line2 in f: @@ -798,10 +799,11 @@ def parse_source(f, opt, framepointer, input_enc, output_enc, print_source=None) # C includes qualified with EARLY (i.e. #include "file.c" EARLY) will be # processed recursively when encountered fpath = os.path.dirname(f.name) - fname = line[line.index(' ') + 2 : -7] + fname = os.path.join(fpath, line[line.index(' ') + 2 : -7]) + out_dependencies.append(fname) include_src = StringIO() - with open(fpath + os.path.sep + fname, encoding=input_enc) as include_file: - parse_source(include_file, opt, framepointer, input_enc, output_enc, include_src) + with open(fname, encoding=input_enc) as include_file: + parse_source(include_file, opt, framepointer, input_enc, output_enc, out_dependencies, include_src) include_src.write('#line ' + str(line_no + 1) + ' "' + f.name + '"') output_lines[-1] = include_src.getvalue() include_src.close() @@ -1078,7 +1080,7 @@ def fixup_objfile(objfile_name, functions, asm_prelude, assembler, output_enc): assert symbol_name_offset_end != -1 symbol_name = objfile.data[symbol_name_offset : symbol_name_offset_end + 1] symbol_name_str = symbol_name[:-1].decode('latin1') - section_name = ['', '.text', '.data', '.bss'][sc] + section_name = {1: '.text', 2: '.data', 3: '.bss', 15: '.rodata'}[sc] section = objfile.find_section(section_name) symtype = STT_FUNC if sc == 1 else STT_OBJECT sym = Symbol.from_parts( @@ -1191,13 +1193,15 @@ def run_wrapped(argv, outfile, functions): if args.objfile is None: with open(args.filename, encoding=args.input_enc) as f: - return parse_source(f, opt=opt, framepointer=args.framepointer, input_enc=args.input_enc, output_enc=args.output_enc, print_source=outfile) + deps = [] + functions = parse_source(f, opt=opt, framepointer=args.framepointer, input_enc=args.input_enc, output_enc=args.output_enc, out_dependencies=deps, print_source=outfile) + return functions, deps else: if args.assembler is None: raise Failure("must pass assembler command") if functions is None: with open(args.filename, encoding=args.input_enc) as f: - functions = parse_source(f, opt=opt, framepointer=args.framepointer, input_enc=args.input_enc, output_enc=args.output_enc) + functions = parse_source(f, opt=opt, framepointer=args.framepointer, input_enc=args.input_enc, out_dependencies=[], output_enc=args.output_enc) if not functions: return asm_prelude = b'' diff --git a/tools/asm_processor/build.py b/tools/asm_processor/build.py index c173e8fbde..493afd4d5f 100644 --- a/tools/asm_processor/build.py +++ b/tools/asm_processor/build.py @@ -35,7 +35,7 @@ try: asmproc_flags = opt_flags + [in_file, '--input-enc', 'utf-8', '--output-enc', 'euc-jp'] compile_cmdline = compiler + compile_args + ['-I', in_dir, '-o', out_file, preprocessed_file.name] - functions = asm_processor.run(asmproc_flags, outfile=preprocessed_file) + functions, deps = asm_processor.run(asmproc_flags, outfile=preprocessed_file) try: subprocess.check_call(compile_cmdline) except subprocess.CalledProcessError as e: @@ -48,5 +48,17 @@ try: # os._exit(1) asm_processor.run(asmproc_flags + ['--post-process', out_file, '--assembler', assembler_sh, '--asm-prelude', prelude], functions=functions) + + deps_file = out_file[:-2] + ".asmproc.d" + if deps: + with open(deps_file, "w") as f: + f.write(out_file + ": " + " \\\n ".join(deps) + "\n") + for dep in deps: + f.write("\n" + dep + ":\n") + else: + try: + os.remove(deps_file) + except OSError: + pass finally: os.remove(preprocessed_file.name)