From 80fcccec8f686e0e5c89626b60af121a97baf856 Mon Sep 17 00:00:00 2001 From: kat Date: Mon, 7 Oct 2024 07:14:01 -0400 Subject: Calling Conventions for register specific arc functions --- arch/arm64/arch_arm64.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/arch/arm64/arch_arm64.cpp b/arch/arm64/arch_arm64.cpp index b48e6d32..4931ca6d 100644 --- a/arch/arm64/arch_arm64.cpp +++ b/arch/arm64/arch_arm64.cpp @@ -2722,6 +2722,26 @@ public: }; +class AppleArm64ObjcFastARCCallingConvention: public Arm64CallingConvention +{ + uint32_t m_reg; + public: + AppleArm64ObjcFastARCCallingConvention(Architecture* arch, uint32_t reg): Arm64CallingConvention(arch, "apple-arm64-objc-fast-arc-" + to_string(reg - REG_X0)), m_reg(reg) + { + } + + virtual vector GetIntegerArgumentRegisters() override + { + return vector {m_reg}; + } + + virtual bool AreArgumentRegistersUsedForVarArgs() override + { + return false; + } +}; + + class LinuxArm64SystemCallConvention: public CallingConvention { public: @@ -3583,6 +3603,14 @@ extern "C" conv = new AppleArm64CallingConvention(arm64); arm64->RegisterCallingConvention(conv); + for (uint32_t i = REG_X0; i <= REG_X28; i++) + { + if (i == REG_X16 || i == REG_X17 || i == REG_X18) // reserved by os. + continue; + conv = new AppleArm64ObjcFastARCCallingConvention(arm64, i); + arm64->RegisterCallingConvention(conv); + } + // Register ARM64 specific PLT trampoline recognizer arm64->RegisterFunctionRecognizer(new Arm64ImportedFunctionRecognizer()); -- cgit v1.3.1