From 0dbe840fd4bb0b6f7beff6aad35ef8a83d4b5176 Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Tue, 26 Dec 2017 17:10:07 -0500 Subject: Adding return value registers to function type --- function.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'function.cpp') diff --git a/function.cpp b/function.cpp index 879c7156..ba2b419e 100644 --- a/function.cpp +++ b/function.cpp @@ -490,6 +490,18 @@ Confidence> Function::GetReturnType() const } +Confidence> Function::GetReturnRegisters() const +{ + BNRegisterSetWithConfidence regs = BNGetFunctionReturnRegisters(m_object); + vector regList; + for (size_t i = 0; i < regs.count; i++) + regList.push_back(regs.regs[i]); + Confidence> result(regList, regs.confidence); + BNFreeRegisterSet(®s); + return result; +} + + Confidence> Function::GetCallingConvention() const { BNCallingConventionWithConfidence cc = BNGetFunctionCallingConvention(m_object); @@ -549,7 +561,7 @@ Confidence> Function::GetClobberedRegisters() const for (size_t i = 0; i < regs.count; i++) regSet.insert(regs.regs[i]); Confidence> result(regSet, regs.confidence); - BNFreeClobberedRegisters(®s); + BNFreeRegisterSet(®s); return result; } @@ -569,6 +581,19 @@ void Function::SetAutoReturnType(const Confidence>& type) } +void Function::SetAutoReturnRegisters(const Confidence>& returnRegs) +{ + BNRegisterSetWithConfidence regs; + regs.regs = new uint32_t[returnRegs.GetValue().size()]; + regs.count = returnRegs.GetValue().size(); + for (size_t i = 0; i < regs.count; i++) + regs.regs[i] = returnRegs.GetValue()[i]; + regs.confidence = returnRegs.GetConfidence(); + BNSetAutoFunctionReturnRegisters(m_object, ®s); + delete[] regs.regs; +} + + void Function::SetAutoCallingConvention(const Confidence>& convention) { BNCallingConventionWithConfidence cc; @@ -668,6 +693,19 @@ void Function::SetReturnType(const Confidence>& type) } +void Function::SetReturnRegisters(const Confidence>& returnRegs) +{ + BNRegisterSetWithConfidence regs; + regs.regs = new uint32_t[returnRegs.GetValue().size()]; + regs.count = returnRegs.GetValue().size(); + for (size_t i = 0; i < regs.count; i++) + regs.regs[i] = returnRegs.GetValue()[i]; + regs.confidence = returnRegs.GetConfidence(); + BNSetUserFunctionReturnRegisters(m_object, ®s); + delete[] regs.regs; +} + + void Function::SetCallingConvention(const Confidence>& convention) { BNCallingConventionWithConfidence cc; -- cgit v1.3.1