diff options
| author | kat <kat@vector35.com> | 2024-10-07 07:14:01 -0400 |
|---|---|---|
| committer | kat <kat@vector35.com> | 2024-10-23 21:58:47 -0400 |
| commit | 80fcccec8f686e0e5c89626b60af121a97baf856 (patch) | |
| tree | ea84eb479de2d222a24a15b571748a7c792112fa /arch/arm64/arch_arm64.cpp | |
| parent | 9aa54ef6723ad06b019c02c22b574516dca6289b (diff) | |
Calling Conventions for register specific arc functions
Diffstat (limited to 'arch/arm64/arch_arm64.cpp')
| -rw-r--r-- | arch/arm64/arch_arm64.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
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<uint32_t> GetIntegerArgumentRegisters() override + { + return vector<uint32_t> {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()); |
