1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-11-25 09:45:02 +00:00

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
This commit is contained in:
Roman971 2021-05-02 22:21:27 +02:00 committed by GitHub
parent ce44541d33
commit 4e9f40cb13
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 20 deletions

View file

@ -110,6 +110,10 @@ O_FILES := $(foreach f,$(S_FILES:.s=.o),build/$f) \
$(foreach f,$(C_FILES:.c=.o),build/$f) \ $(foreach f,$(C_FILES:.c=.o),build/$f) \
$(foreach f,$(wildcard baserom/*),build/$f.o) $(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_RGBA32 := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.rgba32.png))
TEXTURE_FILES_RGBA16 := $(foreach dir,$(ASSET_BIN_DIRS),$(wildcard $(dir)/*.rgb5a1.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)) 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 $< $@ $(OBJCOPY) -I binary -O elf32-big $< $@
build/asm/%.o: asm/%.s build/asm/%.o: asm/%.s
$(AS) $(ASFLAGS) $^ -o $@ $(AS) $(ASFLAGS) $< -o $@
build/data/%.o: data/%.s 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 build/assets/%.o: assets/%.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(OBJCOPY) -O binary $@ $@.bin $(OBJCOPY) -O binary $@ $@.bin
build/src/overlays/%.o: src/overlays/%.c build/src/overlays/%.o: src/overlays/%.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(CC_CHECK) $^ $(CC_CHECK) $<
$(ZAPD) bovl -i $@ -cfg $^ --outputpath $(@D)/$(notdir $(@D))_reloc.s $(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 -test -f $(@D)/$(notdir $(@D))_reloc.s && $(AS) $(ASFLAGS) $(@D)/$(notdir $(@D))_reloc.s -o $(@D)/$(notdir $(@D))_reloc.o
@$(OBJDUMP) -d $@ > $(@:.o=.s) @$(OBJDUMP) -d $@ > $(@:.o=.s)
build/src/%.o: src/%.c build/src/%.o: src/%.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(CC_CHECK) $^ $(CC_CHECK) $<
@$(OBJDUMP) -d $@ > $(@:.o=.s) @$(OBJDUMP) -d $@ > $(@:.o=.s)
build/src/libultra_boot_O1/ll.o: src/libultra_boot_O1/ll.c build/src/libultra_boot_O1/ll.o: src/libultra_boot_O1/ll.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(CC_CHECK) $^ $(CC_CHECK) $<
python3 tools/set_o32abi_bit.py $@ python3 tools/set_o32abi_bit.py $@
@$(OBJDUMP) -d $@ > $(@:.o=.s) @$(OBJDUMP) -d $@ > $(@:.o=.s)
build/src/libultra_code_O1/llcvt.o: src/libultra_code_O1/llcvt.c build/src/libultra_code_O1/llcvt.o: src/libultra_code_O1/llcvt.c
$(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $^ $(CC) -c $(CFLAGS) $(MIPS_VERSION) $(OPTFLAGS) -o $@ $<
$(CC_CHECK) $^ $(CC_CHECK) $<
python3 tools/set_o32abi_bit.py $@ python3 tools/set_o32abi_bit.py $@
@$(OBJDUMP) -d $@ > $(@:.o=.s) @$(OBJDUMP) -d $@ > $(@:.o=.s)
@ -286,3 +290,5 @@ build/assets/%.bin.inc.c: assets/%.bin
build/assets/%.jpg.inc.c: assets/%.jpg build/assets/%.jpg.inc.c: assets/%.jpg
$(ZAPD) bren -i $< -o $@ -eh $(ZAPD) bren -i $< -o $@ -eh
-include $(DEP_FILES)

View file

@ -722,7 +722,7 @@ float_regexpr = re.compile(r"[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?f")
def repl_float_hex(m): def repl_float_hex(m):
return str(struct.unpack(">I", struct.pack(">f", float(m.group(0).strip().rstrip("f"))))[0]) 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 opt in ['O2', 'O1']:
if framepointer: if framepointer:
min_instr_count = 6 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("')) elif ((line.startswith('GLOBAL_ASM("') or line.startswith('#pragma GLOBAL_ASM("'))
and line.endswith('")')): and line.endswith('")')):
fname = line[line.index('(') + 2 : -2] fname = line[line.index('(') + 2 : -2]
out_dependencies.append(fname)
global_asm = GlobalAsmBlock(fname) global_asm = GlobalAsmBlock(fname)
with open(fname, encoding=input_enc) as f: with open(fname, encoding=input_enc) as f:
for line2 in 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 # C includes qualified with EARLY (i.e. #include "file.c" EARLY) will be
# processed recursively when encountered # processed recursively when encountered
fpath = os.path.dirname(f.name) 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() include_src = StringIO()
with open(fpath + os.path.sep + fname, encoding=input_enc) as include_file: with open(fname, encoding=input_enc) as include_file:
parse_source(include_file, opt, framepointer, input_enc, output_enc, include_src) parse_source(include_file, opt, framepointer, input_enc, output_enc, out_dependencies, include_src)
include_src.write('#line ' + str(line_no + 1) + ' "' + f.name + '"') include_src.write('#line ' + str(line_no + 1) + ' "' + f.name + '"')
output_lines[-1] = include_src.getvalue() output_lines[-1] = include_src.getvalue()
include_src.close() include_src.close()
@ -1078,7 +1080,7 @@ def fixup_objfile(objfile_name, functions, asm_prelude, assembler, output_enc):
assert symbol_name_offset_end != -1 assert symbol_name_offset_end != -1
symbol_name = objfile.data[symbol_name_offset : 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') 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) section = objfile.find_section(section_name)
symtype = STT_FUNC if sc == 1 else STT_OBJECT symtype = STT_FUNC if sc == 1 else STT_OBJECT
sym = Symbol.from_parts( sym = Symbol.from_parts(
@ -1191,13 +1193,15 @@ def run_wrapped(argv, outfile, functions):
if args.objfile is None: if args.objfile is None:
with open(args.filename, encoding=args.input_enc) as f: 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: else:
if args.assembler is None: if args.assembler is None:
raise Failure("must pass assembler command") raise Failure("must pass assembler command")
if functions is None: if functions is None:
with open(args.filename, encoding=args.input_enc) as f: 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: if not functions:
return return
asm_prelude = b'' asm_prelude = b''

View file

@ -35,7 +35,7 @@ try:
asmproc_flags = opt_flags + [in_file, '--input-enc', 'utf-8', '--output-enc', 'euc-jp'] 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] 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: try:
subprocess.check_call(compile_cmdline) subprocess.check_call(compile_cmdline)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
@ -48,5 +48,17 @@ try:
# os._exit(1) # os._exit(1)
asm_processor.run(asmproc_flags + ['--post-process', out_file, '--assembler', assembler_sh, '--asm-prelude', prelude], functions=functions) 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: finally:
os.remove(preprocessed_file.name) os.remove(preprocessed_file.name)