diff options
| author | Peter LaFosse <peter@vector35.com> | 2018-09-20 16:51:56 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2018-09-20 16:51:56 -0400 |
| commit | dd9a865f2ebcb4dfbe462154114f495e49a16fe4 (patch) | |
| tree | 9fffa7b1fa1c6b0f8c90dfad603fab7a07519852 /callingconvention.cpp | |
| parent | f48203de0acafb1d981d56c79d0edff921102065 (diff) | |
| parent | 536908c5d4ba2f919765b41a050269669c800a75 (diff) | |
Merge branch 'dev' into test_relocation
Diffstat (limited to 'callingconvention.cpp')
| -rw-r--r-- | callingconvention.cpp | 31 |
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, ®s[count]); + BNFreeRegisterList(regs); + return result; +} + + vector<uint32_t> CoreCallingConvention::GetIntegerArgumentRegisters() { size_t count; |
