From f403938b6e04b626046f3a46183d5537661bd5d6 Mon Sep 17 00:00:00 2001 From: Ethan Date: Mon, 25 Mar 2024 20:14:35 +0900 Subject: [PATCH] little more --- m2c/arch_mips.py | 13 ++++++++++--- m2c/main.py | 5 ++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/m2c/arch_mips.py b/m2c/arch_mips.py index f8da4c4c..b317e2a6 100644 --- a/m2c/arch_mips.py +++ b/m2c/arch_mips.py @@ -727,6 +727,8 @@ def match(self, matcher: AsmMatcher) -> Optional[Replacement]: class MipsArch(Arch): arch = Target.ArchEnum.MIPS + num_function_arg_registers = 4 + stack_pointer_reg = Register("sp") frame_pointer_reg = Register("fp") return_address_reg = Register("ra") @@ -1718,6 +1720,7 @@ def function_abi( offset = (offset + align - 1) & -align name = param.name reg2: Optional[Register] + # TODO EABI: support eabi float args if ind < 2 and only_floats: reg = Register("f12" if ind == 0 else "f14") is_double = ( @@ -1740,7 +1743,11 @@ def function_abi( else: for i in range(offset // 4, (offset + size) // 4): unk_offset = 4 * i - offset - reg2 = Register(f"a{i}") if i < 4 else None + reg2 = ( + Register(f"a{i}") + if i < self.num_function_arg_registers + else None + ) if size > 4: name2 = f"{name}_unk{unk_offset:X}" if name else None sub_type = Type.any() @@ -1762,7 +1769,7 @@ def function_abi( offset += size if fn_sig.is_variadic: - for i in range(offset // 4, 4): + for i in range(offset // 4, self.num_function_arg_registers): candidate_slots.append( AbiArgSlot(i * 4, Register(f"a{i}"), Type.any_reg()) ) @@ -1854,7 +1861,7 @@ def function_return(expr: Expression) -> Dict[Register, Expression]: class MipseeArch(MipsArch): - arch = Target.ArchEnum.MIPS + num_function_arg_registers = 8 stack_pointer_reg = Register("sp") diff --git a/m2c/main.py b/m2c/main.py index f4ed6de9..a3870d3e 100644 --- a/m2c/main.py +++ b/m2c/main.py @@ -66,7 +66,10 @@ def print_exception_as_comment( def run(options: Options) -> int: arch: Arch if options.target.arch == Target.ArchEnum.MIPS: - arch = MipsArch() + if options.target.platform == Target.PlatformEnum.MIPSEE: + arch = MipseeArch() + else: + arch = MipsArch() elif options.target.arch == Target.ArchEnum.PPC: arch = PpcArch() else: