summaryrefslogtreecommitdiff
path: root/callingconvention.cpp
diff options
context:
space:
mode:
authorPeter LaFosse <peter@vector35.com>2018-09-20 16:51:56 -0400
committerPeter LaFosse <peter@vector35.com>2018-09-20 16:51:56 -0400
commitdd9a865f2ebcb4dfbe462154114f495e49a16fe4 (patch)
tree9fffa7b1fa1c6b0f8c90dfad603fab7a07519852 /callingconvention.cpp
parentf48203de0acafb1d981d56c79d0edff921102065 (diff)
parent536908c5d4ba2f919765b41a050269669c800a75 (diff)
Merge branch 'dev' into test_relocation
Diffstat (limited to 'callingconvention.cpp')
-rw-r--r--callingconvention.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/callingconvention.cpp b/callingconvention.cpp
index 3a7298a2..d057a5cc 100644
--- a/callingconvention.cpp
+++ b/callingconvention.cpp
@@ -36,6 +36,7 @@ CallingConvention::CallingConvention(Architecture* arch, const string& name)
cc.context = this;
cc.freeObject = FreeCallback;
cc.getCallerSavedRegisters = GetCallerSavedRegistersCallback;
+ cc.getCalleeSavedRegisters = GetCalleeSavedRegistersCallback;
cc.getIntegerArgumentRegisters = GetIntegerArgumentRegistersCallback;
cc.getFloatArgumentRegisters = GetFloatArgumentRegistersCallback;
cc.freeRegisterList = FreeRegisterListCallback;
@@ -77,6 +78,19 @@ uint32_t* CallingConvention::GetCallerSavedRegistersCallback(void* ctxt, size_t*
}
+uint32_t* CallingConvention::GetCalleeSavedRegistersCallback(void* ctxt, size_t* count)
+{
+ CallingConvention* cc = (CallingConvention*)ctxt;
+ vector<uint32_t> regs = cc->GetCalleeSavedRegisters();
+ *count = regs.size();
+
+ uint32_t* result = new uint32_t[regs.size()];
+ for (size_t i = 0; i < regs.size(); i++)
+ result[i] = regs[i];
+ return result;
+}
+
+
uint32_t* CallingConvention::GetIntegerArgumentRegistersCallback(void* ctxt, size_t* count)
{
CallingConvention* cc = (CallingConvention*)ctxt;
@@ -234,6 +248,12 @@ vector<uint32_t> CallingConvention::GetCallerSavedRegisters()
}
+vector<uint32_t> CallingConvention::GetCalleeSavedRegisters()
+{
+ return vector<uint32_t>();
+}
+
+
vector<uint32_t> CallingConvention::GetIntegerArgumentRegisters()
{
return vector<uint32_t>();
@@ -336,6 +356,17 @@ vector<uint32_t> CoreCallingConvention::GetCallerSavedRegisters()
}
+vector<uint32_t> CoreCallingConvention::GetCalleeSavedRegisters()
+{
+ size_t count;
+ uint32_t* regs = BNGetCalleeSavedRegisters(m_object, &count);
+ vector<uint32_t> result;
+ result.insert(result.end(), regs, &regs[count]);
+ BNFreeRegisterList(regs);
+ return result;
+}
+
+
vector<uint32_t> CoreCallingConvention::GetIntegerArgumentRegisters()
{
size_t count;