summaryrefslogtreecommitdiff
path: root/arch/arm64/arch_arm64.cpp
diff options
context:
space:
mode:
authorkat <kat@vector35.com>2024-10-07 07:14:01 -0400
committerkat <kat@vector35.com>2024-10-23 21:58:47 -0400
commit80fcccec8f686e0e5c89626b60af121a97baf856 (patch)
treeea84eb479de2d222a24a15b571748a7c792112fa /arch/arm64/arch_arm64.cpp
parent9aa54ef6723ad06b019c02c22b574516dca6289b (diff)
Calling Conventions for register specific arc functions
Diffstat (limited to 'arch/arm64/arch_arm64.cpp')
-rw-r--r--arch/arm64/arch_arm64.cpp28
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());