diff --git a/archinfo/arch_pcode.py b/archinfo/arch_pcode.py index 2af7ebc..21135be 100644 --- a/archinfo/arch_pcode.py +++ b/archinfo/arch_pcode.py @@ -1,11 +1,14 @@ import logging -from typing import Union +from typing import TYPE_CHECKING, Union from .arch import Arch, Endness, Register from .archerror import ArchError from .tls import TLSArchInfo from .types import RegisterOffset +if TYPE_CHECKING: + import pypcode + try: import pypcode @@ -64,8 +67,7 @@ def __init__(self, language: Union["pypcode.ArchLanguage", str]): archinfo_regs[pc_reg.lower()].alias_names = tuple(aliases) if pc_offset is None: - log.warning("Unknown program counter register offset?") - pc_offset = 0x80000000 + log.debug("%s declares no program counter", self.name) sp_offset = None ret_offset = RegisterOffset(0) @@ -112,7 +114,7 @@ def find_matching_cid(language, desired): sp_offset = 0x80000008 self.instruction_alignment = 1 - self.ip_offset = RegisterOffset(pc_offset) + self.ip_offset = None if pc_offset is None else RegisterOffset(pc_offset) self.sp_offset = RegisterOffset(sp_offset) self.bp_offset = RegisterOffset(sp_offset) self.ret_offset = RegisterOffset(ret_offset) diff --git a/tests/test_pcode.py b/tests/test_pcode.py index a29d6e9..7bcdf7e 100644 --- a/tests/test_pcode.py +++ b/tests/test_pcode.py @@ -17,6 +17,21 @@ def test_arch_68000(self): assert arch.instruction_endness == Endness.BE assert arch.bits == 32 + def test_arch_without_program_counter(self): + """Dalvik and the DATA languages declare no program counter, so archinfo reports none.""" + for lang_id in ("Dalvik:LE:32:DEX_Nougat", "DATA:LE:64:default"): + arch = ArchPcode(lang_id) + assert arch.ip_offset is None + assert "ip" not in arch.registers + assert "pc" not in arch.registers + + def test_arch_with_program_counter(self): + """A language that names its program counter keeps naming it, under pc and ip both.""" + arch = ArchPcode("x86:LE:64:default") + assert arch.registers["ip"] == arch.registers["rip"] + assert arch.registers["pc"] == arch.registers["rip"] + assert arch.ip_offset == arch.registers["rip"][0] + def test_arch_bad_langid(self): with self.assertRaises(ArchError): ArchPcode("invalid")