diff options
| author | Rusty Wagner <rusty@vector35.com> | 2018-09-10 20:31:23 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2018-09-13 15:35:12 -0400 |
| commit | 409de0f7804a49b6dcc9c8a14307de2be29ecd60 (patch) | |
| tree | 92b04e17f71473ef39d87c62440b6e72b72ed9fb /callingconvention.cpp | |
| parent | 59a2824b1ad36ea5d0520919e86ad779cd97cc8f (diff) | |
Add callee saved registers on calling conventions to specify which registers are assumed to be preserved (used in heuristics to avoid incomplete data flow cloberring these registers)
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 a56b8f11..9e162ed9 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; |
