summaryrefslogtreecommitdiff
path: root/callingconvention.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-11-27 17:15:03 -0500
committerRusty Wagner <rusty@vector35.com>2017-11-27 17:15:03 -0500
commitc24b1bd108ee2885d7164cecd15f75aa1715a8df (patch)
tree29dd59ac7c2ad4d7d77d36c89dd5f26ab270ea6e /callingconvention.cpp
parentd5db0ddb807265b295bb6b4ff07613776945c92b (diff)
Register stack adjustments in calling conventions
Diffstat (limited to 'callingconvention.cpp')
-rw-r--r--callingconvention.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/callingconvention.cpp b/callingconvention.cpp
index b29d51e2..2eb57567 100644
--- a/callingconvention.cpp
+++ b/callingconvention.cpp
@@ -49,6 +49,8 @@ CallingConvention::CallingConvention(Architecture* arch, const string& name)
cc.getImplicitlyDefinedRegisters = GetImplicitlyDefinedRegistersCallback;
cc.getIncomingRegisterValue = GetIncomingRegisterValueCallback;
cc.getIncomingFlagValue = GetIncomingFlagValueCallback;
+ cc.getIncomingVariableForParameterVariable = GetIncomingVariableForParameterVariableCallback;
+ cc.getParameterVariableForIncomingVariable = GetParameterVariableForIncomingVariableCallback;
AddRefForRegistration();
m_object = BNCreateCallingConvention(arch->GetObject(), name.c_str(), &cc);
@@ -189,6 +191,24 @@ void CallingConvention::GetIncomingFlagValueCallback(void* ctxt, uint32_t reg, B
}
+void CallingConvention::GetIncomingVariableForParameterVariableCallback(void* ctxt, const BNVariable* var,
+ BNFunction* func, BNVariable* result)
+{
+ CallingConvention* cc = (CallingConvention*)ctxt;
+ *result = cc->GetIncomingVariableForParameterVariable(*var,
+ func ? new Function(BNNewFunctionReference(func)) : nullptr);
+}
+
+
+void CallingConvention::GetParameterVariableForIncomingVariableCallback(void* ctxt, const BNVariable* var,
+ BNFunction* func, BNVariable* result)
+{
+ CallingConvention* cc = (CallingConvention*)ctxt;
+ *result = cc->GetParameterVariableForIncomingVariable(*var,
+ func ? new Function(BNNewFunctionReference(func)) : nullptr);
+}
+
+
Ref<Architecture> CallingConvention::GetArchitecture() const
{
return new CoreArchitecture(BNGetCallingConventionArchitecture(m_object));
@@ -284,6 +304,18 @@ RegisterValue CallingConvention::GetIncomingFlagValue(uint32_t, Function*)
}
+Variable CallingConvention::GetIncomingVariableForParameterVariable(const Variable& var, Function*)
+{
+ return BNGetDefaultIncomingVariableForParameterVariable(m_object, &var);
+}
+
+
+Variable CallingConvention::GetParameterVariableForIncomingVariable(const Variable& var, Function*)
+{
+ return BNGetDefaultParameterVariableForIncomingVariable(m_object, &var);
+}
+
+
CoreCallingConvention::CoreCallingConvention(BNCallingConvention* cc): CallingConvention(cc)
{
}
@@ -385,3 +417,15 @@ RegisterValue CoreCallingConvention::GetIncomingFlagValue(uint32_t flag, Functio
{
return RegisterValue::FromAPIObject(BNGetIncomingFlagValue(m_object, flag, func ? func->GetObject() : nullptr));
}
+
+
+Variable CoreCallingConvention::GetIncomingVariableForParameterVariable(const Variable& var, Function* func)
+{
+ return BNGetIncomingVariableForParameterVariable(m_object, &var, func ? func->GetObject() : nullptr);
+}
+
+
+Variable CoreCallingConvention::GetParameterVariableForIncomingVariable(const Variable& var, Function* func)
+{
+ return BNGetParameterVariableForIncomingVariable(m_object, &var, func ? func->GetObject() : nullptr);
+}