summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-12-26 17:10:07 -0500
committerPeter LaFosse <peter@vector35.com>2018-03-23 17:10:05 -0400
commit0dbe840fd4bb0b6f7beff6aad35ef8a83d4b5176 (patch)
treea4589f36a46e662cc16613db88f1c83c69512181 /function.cpp
parentf2e43b0fdcf5e24399917ffb25ff174c6921a484 (diff)
Adding return value registers to function type
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp40
1 files changed, 39 insertions, 1 deletions
diff --git a/function.cpp b/function.cpp
index 879c7156..ba2b419e 100644
--- a/function.cpp
+++ b/function.cpp
@@ -490,6 +490,18 @@ Confidence<Ref<Type>> Function::GetReturnType() const
}
+Confidence<vector<uint32_t>> Function::GetReturnRegisters() const
+{
+ BNRegisterSetWithConfidence regs = BNGetFunctionReturnRegisters(m_object);
+ vector<uint32_t> regList;
+ for (size_t i = 0; i < regs.count; i++)
+ regList.push_back(regs.regs[i]);
+ Confidence<vector<uint32_t>> result(regList, regs.confidence);
+ BNFreeRegisterSet(&regs);
+ return result;
+}
+
+
Confidence<Ref<CallingConvention>> Function::GetCallingConvention() const
{
BNCallingConventionWithConfidence cc = BNGetFunctionCallingConvention(m_object);
@@ -549,7 +561,7 @@ Confidence<set<uint32_t>> Function::GetClobberedRegisters() const
for (size_t i = 0; i < regs.count; i++)
regSet.insert(regs.regs[i]);
Confidence<set<uint32_t>> result(regSet, regs.confidence);
- BNFreeClobberedRegisters(&regs);
+ BNFreeRegisterSet(&regs);
return result;
}
@@ -569,6 +581,19 @@ void Function::SetAutoReturnType(const Confidence<Ref<Type>>& type)
}
+void Function::SetAutoReturnRegisters(const Confidence<std::vector<uint32_t>>& 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, &regs);
+ delete[] regs.regs;
+}
+
+
void Function::SetAutoCallingConvention(const Confidence<Ref<CallingConvention>>& convention)
{
BNCallingConventionWithConfidence cc;
@@ -668,6 +693,19 @@ void Function::SetReturnType(const Confidence<Ref<Type>>& type)
}
+void Function::SetReturnRegisters(const Confidence<std::vector<uint32_t>>& 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, &regs);
+ delete[] regs.regs;
+}
+
+
void Function::SetCallingConvention(const Confidence<Ref<CallingConvention>>& convention)
{
BNCallingConventionWithConfidence cc;