summaryrefslogtreecommitdiff
path: root/callingconvention.cpp
diff options
context:
space:
mode:
authorRyan Snyder <ryan@vector35.com>2021-05-28 16:35:34 -0400
committerRyan Snyder <ryan@vector35.com>2021-05-28 18:01:44 -0400
commit0732c4d3e9b24382271139c6f796d1639efb1c5d (patch)
tree70bc863d4e1321fd2d1a5a8a1e819a00b1c6b5b7 /callingconvention.cpp
parent4c8f4c3ddb307bfd3168cf5bd573e1dffda9629b (diff)
Improve calling convention support for variadic argument resolution
Diffstat (limited to 'callingconvention.cpp')
-rw-r--r--callingconvention.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/callingconvention.cpp b/callingconvention.cpp
index b6354381..33fe45ff 100644
--- a/callingconvention.cpp
+++ b/callingconvention.cpp
@@ -41,6 +41,7 @@ CallingConvention::CallingConvention(Architecture* arch, const string& name)
cc.getFloatArgumentRegisters = GetFloatArgumentRegistersCallback;
cc.freeRegisterList = FreeRegisterListCallback;
cc.areArgumentRegistersSharedIndex = AreArgumentRegistersSharedIndexCallback;
+ cc.areArgumentRegistersUsedForVarArgs = AreArgumentRegistersUsedForVarArgsCallback;
cc.isStackReservedForArgumentRegisters = IsStackReservedForArgumentRegistersCallback;
cc.isStackAdjustedOnReturn = IsStackAdjustedOnReturnCallback;
cc.isEligibleForHeuristics = IsEligibleForHeuristicsCallback;
@@ -131,6 +132,13 @@ bool CallingConvention::AreArgumentRegistersSharedIndexCallback(void* ctxt)
}
+bool CallingConvention::AreArgumentRegistersUsedForVarArgsCallback(void* ctxt)
+{
+ CallingConvention* cc = (CallingConvention*)ctxt;
+ return cc->AreArgumentRegistersUsedForVarArgs();
+}
+
+
bool CallingConvention::IsStackReservedForArgumentRegistersCallback(void* ctxt)
{
CallingConvention* cc = (CallingConvention*)ctxt;
@@ -280,6 +288,12 @@ bool CallingConvention::AreArgumentRegistersSharedIndex()
}
+bool CallingConvention::AreArgumentRegistersUsedForVarArgs()
+{
+ return true;
+}
+
+
bool CallingConvention::IsStackReservedForArgumentRegisters()
{
return false;
@@ -409,6 +423,12 @@ bool CoreCallingConvention::AreArgumentRegistersSharedIndex()
}
+bool CoreCallingConvention::AreArgumentRegistersUsedForVarArgs()
+{
+ return BNAreArgumentRegistersUsedForVarArgs(m_object);
+}
+
+
bool CoreCallingConvention::IsStackReservedForArgumentRegisters()
{
return BNIsStackReservedForArgumentRegisters(m_object);