From 409de0f7804a49b6dcc9c8a14307de2be29ecd60 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Mon, 10 Sep 2018 20:31:23 -0400 Subject: 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) --- callingconvention.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'callingconvention.cpp') 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 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 CallingConvention::GetCallerSavedRegisters() } +vector CallingConvention::GetCalleeSavedRegisters() +{ + return vector(); +} + + vector CallingConvention::GetIntegerArgumentRegisters() { return vector(); @@ -336,6 +356,17 @@ vector CoreCallingConvention::GetCallerSavedRegisters() } +vector CoreCallingConvention::GetCalleeSavedRegisters() +{ + size_t count; + uint32_t* regs = BNGetCalleeSavedRegisters(m_object, &count); + vector result; + result.insert(result.end(), regs, ®s[count]); + BNFreeRegisterList(regs); + return result; +} + + vector CoreCallingConvention::GetIntegerArgumentRegisters() { size_t count; -- cgit v1.3.1