mirror of
https://github.com/izzy2lost/2ship2harkinian-Android.git
synced 2026-06-19 01:20:08 -07:00
Overhaul the build system (#234)
* wip * fix * add disassembler * Disasm builds OK * Variable addends * More wip * Rodata migration implemented * Cleanup old tools * Try fix submodule -> subrepo merge * git subrepo pull --force --remote=https://github.com/zeldaret/ZAPD.git tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "602e609" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "602e609" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" * Builds again but assets are totally broken * git subrepo pull --force tools/asm-processor subrepo: subdir: "tools/asm-processor" merged: "1ffdb08a" upstream: origin: "https://github.com/simonlindholm/asm-processor.git" branch: "master" commit: "1ffdb08a" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" * More cleanup, move functions.txt and variables.txt to tools/disasm and rm tables * rm z64compress in preparation for subrepo * git subrepo clone (merge) https://github.com/z64me/z64compress.git tools/z64compress subrepo: subdir: "tools/z64compress" merged: "eb11085c" upstream: origin: "https://github.com/z64me/z64compress.git" branch: "main" commit: "eb11085c" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" * Fix asset extraction * Fix diff-init make rule * Split code bss * Split assumed linker bug padding from assembly files * add filelists for mm.us.rev1 * Maybe working, but I'm not sure * add overlays to spec * Add rodata to actos * Everything compiles * Make a lot of C files for code * Add almost every file in code to spec * whoops * 3 code files left * add scenes to spec * More progress on progress.py * Fix skelanime in spec * audio files! * Fix merge issues * Fix some C files in code * Fix remaining code files * Use existing O1 C files in spec * reorder boot order in spec * update spec * fault.c * Convert relocs on completed actors, fixbaserom uses current rom name * more boot files * Add VT macros and script * finish already existing boot files * most of libultra * fix 64bits libultra files * Use C files for libultra, wrap some functions in NON_MATCHING * Remove duplicate of OS_CLOCK_RATE from fault.c * C files for fbdemos * delete dumb files * bootstrap C files, still need to add them to the spec * update fixbaserom * boot OK? * I forgot to commit the spec * C for gamestates * C for kaleido * Change all includes to "" * copy actor sizes script from oot * I forgot to delete those files * Basic C files for effects * Add effects initvars names * Remove mislabelled boot functions from header/txt * Begin porting bootstrap_fx, some sizes * Fix <> * Fix enum * Fix diff.py * fix libultra stuff * update regconvert * update setup warnings * add some missing ; * Fix some makefile stuff and other fixes on some non_matching functions * add executable flag in extract_baserom and fixbaserom * fix relative path * copy assist from oot * fix map path * another assist path fix * Delete C files for handwritten files * add code_801A51F0 to spec * add gfxbuffers to spec * Move rodata to top of each file when possible * UNK_TYPEs for func_801A51F0 * Remove kaleido rodata from spec * Update spec and undefined_syms for recent merge * GCC warnings and fix errors in nonmatchings, * round percentage numbers * progress script: format changes * progress: error on non-existing files * fix warning in z_scene_table * Match 2 nonmatchings in z_actor * Warnings in lightswitch and invadepoh * Fix warning in z_actor_dlftbls * I though I fixed this one * whoops * Comment out CC_CHECK * Removed redundant ultra64.h includes * Update asm_processor, sorted boot_O1 into other folders, completed the fbdemo bootstrap, cleaned up undefined_syms * Completed gamestates bootstrap * Split kaleido_scope * Remove section.h and segment.h, move keep object externs to a common location in variables.h * Completed effects bootstrap * Segmented address externs for effects, fbdemos, gamestates and kaleido * Move actor data externs out of the if 0 * Segmented address externs for actors * Prepare actionfunc detection * fix script, how did it even work before * Fix actionfunc script again, re-introduce some more intermediate prints to the disassembler * Automated actionFunc detection in actors * Segmented addresses from player .text * rm old segment addrs script and fix build * Move sizes folder to tools * Make build.py executable * New Jenkinsfile Prayge * Remove numpy dependencies * Add warnings_disasm_current.txt * my bad * Update spec and undefined_syms * Add z_eff_ss_hahen to pametfrog * git subrepo pull (merge) --force tools/z64compress subrepo: subdir: "tools/z64compress" merged: "163ca2af" upstream: origin: "https://github.com/z64me/z64compress.git" branch: "main" commit: "163ca2af" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" * Make z64compress print to stdout * sneeky commit to update warnings tooling * test * Another test * Mark fixing overlay reloc generating as a TODO * Update warnings stuff * Communicate the return code from running z64compress back to the Makefile through the wrapper * Run formatter, remove extra commented copy of function * Re-fix some includes * Convert atan to hex to conform to decided style * Some tidying up, remove c for fp and the other two handwritten code files * BSS in z_collision_check & z_scene_proc * add static back in * Fix timerintr bss, add file to spec, some cleanup * Remove externs * Newline * Readd enums * Typo * Colours * Comments for hitmark enum values Co-authored-by: EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com> * Improvements and suggestions * Organize and remove unused imports and use env for python3 scripts, delete unused overlay.py Co-authored-by: angie <angheloalf95@gmail.com> Co-authored-by: Elliptic Ellipsis <elliptic.ellipsis@gmail.com> Co-authored-by: engineer124 <engineer124engineer124@gmail.com> Co-authored-by: EllipticEllipsis <73679967+EllipticEllipsis@users.noreply.github.com>
This commit is contained in:
co-authored by
angie
Elliptic Ellipsis
engineer124
EllipticEllipsis
parent
60ff207982
commit
7743e5a2c4
@@ -1 +0,0 @@
|
||||
*.o
|
||||
@@ -1,12 +0,0 @@
|
||||
; DO NOT EDIT (unless you know what you are doing)
|
||||
;
|
||||
; This subdirectory is a git "subrepo", and this file is maintained by the
|
||||
; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
|
||||
;
|
||||
[subrepo]
|
||||
remote = https://github.com/simonlindholm/asm-processor.git
|
||||
branch = master
|
||||
commit = 85288fcdfefd5d2644d9bac1230c8b4aa7c92024
|
||||
parent = 492b92579d6bc30f635cbcc3852de1b17ed1bc43
|
||||
method = merge
|
||||
cmdver = 0.4.3
|
||||
@@ -1,24 +0,0 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org>
|
||||
@@ -1,93 +0,0 @@
|
||||
# asm-processor
|
||||
|
||||
Pre-process .c files and post-process .o files to enable embedding MIPS assembly into IDO-compiled C.
|
||||
|
||||
## Usage
|
||||
|
||||
Let's say you have a file compiled with `-g` on the IDO compiler, that looks like this:
|
||||
```c
|
||||
float func4(void) {
|
||||
"func4";
|
||||
return 0.2f;
|
||||
}
|
||||
```
|
||||
|
||||
This script enables replacing it by:
|
||||
```asm
|
||||
GLOBAL_ASM(
|
||||
.rdata
|
||||
.word 0x66756e63 # func
|
||||
.word 0x34000000 # 4\0\0\0
|
||||
|
||||
.late_rodata
|
||||
glabel rv
|
||||
.word 0x3e4ccccd # 0.2f
|
||||
|
||||
.text
|
||||
glabel func4
|
||||
lui $at, %hi(rv)
|
||||
jr $ra
|
||||
lwc1 $f0, %lo(rv)($at)
|
||||
jr $ra
|
||||
nop
|
||||
jr $ra
|
||||
nop
|
||||
)
|
||||
```
|
||||
|
||||
To compile the file, run `./compile.sh file.c`, or invoke the `asm_processor.py` script in a similar manner. (`compile.sh` is mostly just intended to describe example usage.)
|
||||
|
||||
Reading assembly from file is also supported, e.g. `GLOBAL_ASM("file.s")`.
|
||||
|
||||
### What is supported?
|
||||
|
||||
`.text`, `.data`, `.bss` and `.rodata` sections, `.word`/`.incbin`, `.ascii`/`.asciz`, and `-g`, `-g3`, `-O1`, `-O2` and `-framepointer` flags to the IDO compiler.
|
||||
|
||||
### What is not supported?
|
||||
|
||||
* complicated assembly (.ifdef, macro declarations/calls other than `glabel`, pseudo-instructions that expand to several real instructions)
|
||||
* non-IDO compilers
|
||||
* `-mips1` (`-mips3` may also not work fully)
|
||||
|
||||
C `#ifdef`s only work outside of `GLOBAL_ASM` calls, but is otherwise able to replace `.ifdef`.
|
||||
|
||||
### What's up with "late rodata"?
|
||||
|
||||
The IDO compiler emits rodata in two passes: first array/string contents, then large literals/switch jump tables.
|
||||
|
||||
Data declared within `.rdata`/`.section .rodata` will end up in the first half, and `.late_rodata`/`.section .late_rodata` in the second half.
|
||||
|
||||
### How does it work?
|
||||
|
||||
It's a bit of a hack!
|
||||
The basic idea is replace `GLOBAL_ASM` blocks with dummy C functions/global vars of the same sections sizes as the assembly.
|
||||
Then the C file gets compiled, and the dummy contents overwritten with the injected assembly.
|
||||
|
||||
To accomplish this, asm-processor has logic for guessing the size of assembly contents
|
||||
(which assumes the assembly isn't too complicated, e.g. no macros),
|
||||
and for emitting C code of exact sizes for a bunch of different IDO compiler flags.
|
||||
|
||||
The assembler code is padded with nops to line it up with its correct position in the C;
|
||||
this allows C and asm ELF files to be merged easily without having to fix up e.g. symbol addresses.
|
||||
|
||||
The most difficulty part is `late_rodata`, which is hard to create programmatically.
|
||||
asm-processor does that by emitting code that uses dummy float literals/double literals/jump tables,
|
||||
assembles the late_rodata at another location of the .rodata section, then overwrites the dummy rodata.
|
||||
This does require some movement of symbols and relocations, and quite a bit of care in what code to
|
||||
emit and how to preserve .double alignment.
|
||||
|
||||
It's worth noting some alternative ways in which asm-processor would have been implemented:
|
||||
- One idea to get rid of the C/asm size estimations is to emit arbitrary code, and then move code,
|
||||
symbols and relocations to the correct place after the sizes are known.
|
||||
Given the machinery for `late_rodata` this wouldn't have been too difficult, and it would have the upside of improved portability.
|
||||
There is a big downside, however: using dummy code of incorrect size throws off alignment and can introduce unintended padding.
|
||||
Fixing this would require running multiple passes of asm-processor, with one compile per `ASM_GLOBAL`.
|
||||
- Another idea is to run the compiler with -S to emit assembly, modify the emitted assembly, then run the assembler
|
||||
(which in IDO's case may perform additional instruction reordering etc.).
|
||||
This option has not been investigated in much detail, and would perhaps be superior to the current implementation.
|
||||
It does have a few unknowns to it, e.g. instruction encoding differences between GNU `as` and IDO's assembler,
|
||||
how to avoid reordering the injected assembly, and how .rodata/.late_rodata are implemented.
|
||||
|
||||
### Testing
|
||||
|
||||
There are a few tests to ensure you don't break anything when hacking on asm-processor: `./run-tests.sh` should exit without output if they pass, or else output a diff from previous to new version.
|
||||
@@ -1,4 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
for A in "$@"; do
|
||||
./compile.sh "$A" && mips-linux-gnu-objdump -s "${A%.c}.o" > "${A%.c}.objdump"
|
||||
done
|
||||
@@ -380,7 +380,7 @@ class Failure(Exception):
|
||||
|
||||
|
||||
class GlobalState:
|
||||
def __init__(self, min_instr_count, skip_instr_count, use_jtbl_for_rodata, mips1):
|
||||
def __init__(self, min_instr_count, skip_instr_count, use_jtbl_for_rodata):
|
||||
# A value that hopefully never appears as a 32-bit rodata constant (or we
|
||||
# miscompile late rodata). Increases by 1 in each step.
|
||||
self.late_rodata_hex = 0xE0123456
|
||||
@@ -388,7 +388,6 @@ class GlobalState:
|
||||
self.min_instr_count = min_instr_count
|
||||
self.skip_instr_count = skip_instr_count
|
||||
self.use_jtbl_for_rodata = use_jtbl_for_rodata
|
||||
self.mips1 = mips1
|
||||
|
||||
def next_late_rodata_hex(self):
|
||||
dummy_bytes = struct.pack('>I', self.late_rodata_hex)
|
||||
@@ -609,13 +608,12 @@ class GlobalAsmBlock:
|
||||
size = self.fn_section_sizes['.late_rodata'] // 4
|
||||
skip_next = False
|
||||
needs_double = (self.late_rodata_alignment != 0)
|
||||
extra_mips1_nop = False
|
||||
for i in range(size):
|
||||
if skip_next:
|
||||
skip_next = False
|
||||
continue
|
||||
# Jump tables give 9 instructions (11 with -mips1) for >= 5 words of rodata,
|
||||
# and should be emitted when:
|
||||
# Jump tables give 9 instructions for >= 5 words of rodata, and should be
|
||||
# emitted when:
|
||||
# - -O2 or -O2 -g3 are used, which give the right codegen
|
||||
# - we have emitted our first .float/.double (to ensure that we find the
|
||||
# created rodata in the binary)
|
||||
@@ -625,14 +623,12 @@ class GlobalAsmBlock:
|
||||
# generate a jump table)
|
||||
# - we have at least 10 more instructions to go in this function (otherwise our
|
||||
# function size computation will be wrong since the delay slot goes unused)
|
||||
jtbl_size = 11 if state.mips1 else 9
|
||||
if (not needs_double and state.use_jtbl_for_rodata and i >= 1 and
|
||||
size - i >= 5 and num_instr - len(late_rodata_fn_output) >= jtbl_size + 1):
|
||||
size - i >= 5 and num_instr - len(late_rodata_fn_output) >= 10):
|
||||
cases = " ".join("case {}:".format(case) for case in range(size - i))
|
||||
late_rodata_fn_output.append("switch (*(volatile int*)0) { " + cases + " ; }")
|
||||
late_rodata_fn_output.extend([""] * (jtbl_size - 1))
|
||||
late_rodata_fn_output.extend([""] * 8)
|
||||
jtbl_rodata_size = (size - i) * 4
|
||||
extra_mips1_nop = True
|
||||
break
|
||||
dummy_bytes = state.next_late_rodata_hex()
|
||||
late_rodata_dummy_bytes.append(dummy_bytes)
|
||||
@@ -642,20 +638,12 @@ class GlobalAsmBlock:
|
||||
fval, = struct.unpack('>d', dummy_bytes + dummy_bytes2)
|
||||
late_rodata_fn_output.append('*(volatile double*)0 = {};'.format(fval))
|
||||
skip_next = True
|
||||
needs_double = False
|
||||
if state.mips1:
|
||||
# mips1 does not have ldc1/sdc1
|
||||
late_rodata_fn_output.append('')
|
||||
late_rodata_fn_output.append('')
|
||||
extra_mips1_nop = False
|
||||
needs_double = True
|
||||
else:
|
||||
fval, = struct.unpack('>f', dummy_bytes)
|
||||
late_rodata_fn_output.append('*(volatile float*)0 = {}f;'.format(fval))
|
||||
extra_mips1_nop = True
|
||||
late_rodata_fn_output.append('')
|
||||
late_rodata_fn_output.append('')
|
||||
if state.mips1 and extra_mips1_nop:
|
||||
late_rodata_fn_output.append('')
|
||||
|
||||
text_name = None
|
||||
if self.fn_section_sizes['.text'] > 0 or late_rodata_fn_output:
|
||||
@@ -734,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, mips1, input_enc, output_enc, out_dependencies, 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
|
||||
@@ -763,7 +751,7 @@ def parse_source(f, opt, framepointer, mips1, input_enc, output_enc, out_depende
|
||||
if opt in ['O2', 'g3'] and not framepointer:
|
||||
use_jtbl_for_rodata = True
|
||||
|
||||
state = GlobalState(min_instr_count, skip_instr_count, use_jtbl_for_rodata, mips1)
|
||||
state = GlobalState(min_instr_count, skip_instr_count, use_jtbl_for_rodata)
|
||||
|
||||
global_asm = None
|
||||
asm_functions = []
|
||||
@@ -815,7 +803,7 @@ def parse_source(f, opt, framepointer, mips1, input_enc, output_enc, out_depende
|
||||
out_dependencies.append(fname)
|
||||
include_src = StringIO()
|
||||
with open(fname, encoding=input_enc) as include_file:
|
||||
parse_source(include_file, opt, framepointer, mips1, input_enc, output_enc, out_dependencies, 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 + '"')
|
||||
output_lines[-1] = include_src.getvalue()
|
||||
include_src.close()
|
||||
@@ -1191,7 +1179,6 @@ def run_wrapped(argv, outfile, functions):
|
||||
parser.add_argument('--input-enc', default='latin1', help="Input encoding (default: latin1)")
|
||||
parser.add_argument('--output-enc', default='latin1', help="Output encoding (default: latin1)")
|
||||
parser.add_argument('-framepointer', dest='framepointer', action='store_true')
|
||||
parser.add_argument('-mips1', dest='mips1', action='store_true')
|
||||
parser.add_argument('-g3', dest='g3', action='store_true')
|
||||
group = parser.add_mutually_exclusive_group(required=True)
|
||||
group.add_argument('-O1', dest='opt', action='store_const', const='O1')
|
||||
@@ -1203,20 +1190,18 @@ def run_wrapped(argv, outfile, functions):
|
||||
if opt != 'O2':
|
||||
raise Failure("-g3 is only supported together with -O2")
|
||||
opt = 'g3'
|
||||
if args.mips1 and (opt != 'O2' or args.framepointer):
|
||||
raise Failure("-mips1 is only supported together with -O2")
|
||||
|
||||
if args.objfile is None:
|
||||
with open(args.filename, encoding=args.input_enc) as f:
|
||||
deps = []
|
||||
functions = parse_source(f, opt=opt, framepointer=args.framepointer, mips1=args.mips1, input_enc=args.input_enc, output_enc=args.output_enc, out_dependencies=deps, print_source=outfile)
|
||||
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, mips1=args.mips1, input_enc=args.input_enc, out_dependencies=[], 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''
|
||||
|
||||
Executable
+64
@@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
import os
|
||||
import shlex
|
||||
import subprocess
|
||||
import tempfile
|
||||
import asm_processor
|
||||
|
||||
dir_path = os.path.dirname(os.path.realpath(__file__))
|
||||
prelude = os.path.join(dir_path, "prelude.inc")
|
||||
|
||||
all_args = sys.argv[1:]
|
||||
sep1 = all_args.index('--')
|
||||
sep2 = all_args.index('--', sep1+1)
|
||||
|
||||
compiler = all_args[:sep1]
|
||||
|
||||
assembler = all_args[sep1+1:sep2]
|
||||
assembler_sh = ' '.join(shlex.quote(x) for x in assembler)
|
||||
|
||||
compile_args = all_args[sep2+1:]
|
||||
in_file = compile_args[-1]
|
||||
out_ind = compile_args.index('-o')
|
||||
out_file = compile_args[out_ind + 1]
|
||||
del compile_args[-1]
|
||||
del compile_args[out_ind + 1]
|
||||
del compile_args[out_ind]
|
||||
|
||||
in_dir = os.path.split(os.path.realpath(in_file))[0]
|
||||
opt_flags = [x for x in compile_args if x in ['-g3', '-g', '-O1', '-O2', '-framepointer']]
|
||||
|
||||
preprocessed_file = tempfile.NamedTemporaryFile(prefix='preprocessed', suffix='.c', delete=False)
|
||||
|
||||
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, deps = asm_processor.run(asmproc_flags, outfile=preprocessed_file)
|
||||
try:
|
||||
subprocess.check_call(compile_cmdline)
|
||||
except subprocess.CalledProcessError as e:
|
||||
print("Failed to compile file " + in_file + ". Command line:")
|
||||
print()
|
||||
print(' '.join(shlex.quote(x) for x in compile_cmdline))
|
||||
print()
|
||||
sys.exit(55)
|
||||
# To keep the preprocessed file:
|
||||
# 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)
|
||||
@@ -1,23 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -o pipefail
|
||||
INPUT="$1"
|
||||
OUTPUT="${INPUT%.c}.o"
|
||||
|
||||
CC="$QEMU_IRIX -silent -L $IRIX_ROOT $IRIX_ROOT/usr/bin/cc"
|
||||
CFLAGS="-Wab,-r4300_mul -non_shared -G 0 -Xcpluscomm -fullwarn -wlint -woff 819,820,852,821 -signed -DVERSION_JP=1" # -I include
|
||||
AS="mips-linux-gnu-as"
|
||||
ASFLAGS="-march=vr4300 -mabi=32 --defsym VERSION_JP=1" # -I include
|
||||
set +e
|
||||
OPTFLAGS=$(grep '^// COMPILE-FLAGS: ' $INPUT | sed 's#^// COMPILE-FLAGS: ##')
|
||||
ISET=$(grep '^// COMPILE-ISET: ' $INPUT | sed 's#^// COMPILE-ISET: ##')
|
||||
set -e
|
||||
if [[ -z "$OPTFLAGS" ]]; then
|
||||
OPTFLAGS="-g"
|
||||
fi
|
||||
if [[ -z "$ISET" ]]; then
|
||||
CFLAGS="$CFLAGS -mips2"
|
||||
fi
|
||||
|
||||
python3 asm_processor.py $OPTFLAGS $ISET "$INPUT" | $CC -c $CFLAGS include-stdin.c -o "$OUTPUT" $OPTFLAGS
|
||||
python3 asm_processor.py $OPTFLAGS $ISET "$INPUT" --post-process "$OUTPUT" --assembler "$AS $ASFLAGS" --asm-prelude prelude.s
|
||||
@@ -1,2 +0,0 @@
|
||||
// (this is used for piping input to the IRIX compiler without needing to make a temporary .c file)
|
||||
#include "/dev/stdin"
|
||||
@@ -0,0 +1,5 @@
|
||||
.set noat
|
||||
.set noreorder
|
||||
.set gp=64
|
||||
.include "macro.inc"
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
.set noat
|
||||
.set noreorder
|
||||
.set gp=64
|
||||
.macro glabel label
|
||||
.global \label
|
||||
\label:
|
||||
.endm
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
for A in tests/*.c; do
|
||||
OBJDUMPFLAGS=$(grep '^// OBJDUMP-FLAGS: ' "$A" | sed 's#^// OBJDUMP-FLAGS: ##')
|
||||
if [[ -z "$OBJDUMPFLAGS" ]]; then
|
||||
OBJDUMPFLAGS="-s"
|
||||
fi
|
||||
./compile.sh "$A" && mips-linux-gnu-objdump $OBJDUMPFLAGS "${A%.c}.o" | diff - "${A%.c}.objdump" || echo FAIL "$A"
|
||||
done
|
||||
@@ -1,19 +0,0 @@
|
||||
void foo(void) { "abcdef"; }
|
||||
|
||||
GLOBAL_ASM(
|
||||
.rdata
|
||||
.ascii "AB"
|
||||
.ascii "CD", "EF"
|
||||
.ascii "GH\n\n\n\0\11\222\3333\44444\x1234567\n\nIJK"
|
||||
)
|
||||
|
||||
void bar(void) { "hello"; }
|
||||
|
||||
GLOBAL_ASM(
|
||||
.rdata
|
||||
.asciiz "12"
|
||||
.asciiz "34", "56"
|
||||
.asciiz "78\n\n\n\0\11\222\3333\44444\x1234567\n\n9A"
|
||||
)
|
||||
|
||||
void baz(void) { "ghijkl"; }
|
||||
@@ -1,19 +0,0 @@
|
||||
|
||||
tests/ascii.o: file format elf32-tradbigmips
|
||||
|
||||
Contents of section .text:
|
||||
0000 03e00008 00000000 03e00008 00000000 ................
|
||||
0010 03e00008 00000000 03e00008 00000000 ................
|
||||
0020 03e00008 00000000 03e00008 00000000 ................
|
||||
Contents of section .rodata:
|
||||
0000 61626364 65660000 41424344 45464748 abcdef..ABCDEFGH
|
||||
0010 0a0a0a00 0992db33 24343467 0a0a494a .......3$44g..IJ
|
||||
0020 4b000000 68656c6c 6f000000 31320033 K...hello...12.3
|
||||
0030 34003536 0037380a 0a0a0009 92db3324 4.56.78.......3$
|
||||
0040 3434670a 0a394100 6768696a 6b6c0000 44g..9A.ghijkl..
|
||||
Contents of section .options:
|
||||
0000 01200000 00000000 80000000 00000000 . ..............
|
||||
0010 00000000 00000000 00000000 00007ff0 ................
|
||||
Contents of section .reginfo:
|
||||
0000 80000000 00000000 00000000 00000000 ................
|
||||
0010 00000000 00007ff0 ........
|
||||
@@ -1,6 +0,0 @@
|
||||
const char before[] = "^";
|
||||
GLOBAL_ASM(
|
||||
.rdata
|
||||
.asciz "aaaa /* bbbb */ # cccc" /**//**//**//**/ /*/ "xxxx" /*/ /* dddd " eeee */ "# ffff" # gggg "hhhh" /* iiii */
|
||||
)
|
||||
const char after[] = "$";
|
||||
@@ -1,13 +0,0 @@
|
||||
|
||||
tests/comments.o: file format elf32-tradbigmips
|
||||
|
||||
Contents of section .rodata:
|
||||
0000 5e000000 61616161 202f2a20 62626262 ^...aaaa /* bbbb
|
||||
0010 202a2f20 23206363 63630023 20666666 */ # cccc.# fff
|
||||
0020 66000000 24000000 00000000 00000000 f...$...........
|
||||
Contents of section .options:
|
||||
0000 01200000 00000000 00000000 00000000 . ..............
|
||||
0010 00000000 00000000 00000000 00007ff0 ................
|
||||
Contents of section .reginfo:
|
||||
0000 00000000 00000000 00000000 00000000 ................
|
||||
0010 00000000 00007ff0 ........
|
||||
@@ -1,7 +0,0 @@
|
||||
GLOBAL_ASM(
|
||||
.rdata
|
||||
.word 0x12345678
|
||||
glabel blah
|
||||
.word blah2
|
||||
/*a*/ blah2: /*b*/ .word blah /*c*/
|
||||
)
|
||||
@@ -1,11 +0,0 @@
|
||||
|
||||
tests/label-sameline.o: file format elf32-tradbigmips
|
||||
|
||||
Contents of section .rodata:
|
||||
0000 12345678 00000008 00000000 00000000 .4Vx............
|
||||
Contents of section .options:
|
||||
0000 01200000 00000000 00000000 00000000 . ..............
|
||||
0010 00000000 00000000 00000000 00007ff0 ................
|
||||
Contents of section .reginfo:
|
||||
0000 00000000 00000000 00000000 00000000 ................
|
||||
0010 00000000 00007ff0 ........
|
||||
@@ -1,164 +0,0 @@
|
||||
|
||||
GLOBAL_ASM(
|
||||
glabel test
|
||||
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
addiu $sp, $sp, -24
|
||||
sw $zero, 4($sp)
|
||||
lw $t6, 4($sp)
|
||||
addu $t7, $a0, $t6
|
||||
sb $zero, ($t7)
|
||||
lw $t8, 4($sp)
|
||||
addiu $t9, $t8, 1
|
||||
slt $at, $t9, $a1
|
||||
sw $t9, 4($sp)
|
||||
nop
|
||||
jr $ra
|
||||
addiu $sp, $sp, 24
|
||||
|
||||
)
|
||||
|
||||
void foo(void) {}
|
||||
@@ -1,50 +0,0 @@
|
||||
|
||||
tests/large.o: file format elf32-tradbigmips
|
||||
|
||||
Contents of section .text:
|
||||
0000 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0010 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0020 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0030 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0040 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0050 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0060 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0070 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0080 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0090 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
00a0 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
00b0 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
00c0 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
00d0 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
00e0 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
00f0 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0100 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0110 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0120 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0130 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0140 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0150 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0160 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0170 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0180 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0190 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
01a0 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
01b0 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
01c0 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
01d0 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
01e0 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
01f0 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0200 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0210 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0220 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0230 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0240 27bdffe8 afa00004 8fae0004 008e7821 '.............x!
|
||||
0250 a1e00000 8fb80004 27190001 0325082a ........'....%.*
|
||||
0260 afb90004 00000000 03e00008 27bd0018 ............'...
|
||||
0270 03e00008 00000000 03e00008 00000000 ................
|
||||
Contents of section .options:
|
||||
0000 01200000 00000000 80000000 00000000 . ..............
|
||||
0010 00000000 00000000 00000000 00007ff0 ................
|
||||
Contents of section .reginfo:
|
||||
0000 a300c032 00000000 00000000 00000000 ...2............
|
||||
0010 00000000 00007ff0 ........
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user