summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2018-02-07 17:18:27 -0500
committerRusty Wagner <rusty@vector35.com>2018-02-07 17:18:27 -0500
commit83c9c2bceeb354dcf53e338e9411c6636f418123 (patch)
tree2d16cf9e46a08590f27cc59b5f9fcb9631b6a007 /function.cpp
parent331bfd4e4a648de8aba4fefd8301703a6a3440c9 (diff)
Add APIs for overriding stack adjustments on calls
Diffstat (limited to 'function.cpp')
-rw-r--r--function.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/function.cpp b/function.cpp
index ba2b419e..cd9be4d5 100644
--- a/function.cpp
+++ b/function.cpp
@@ -1018,6 +1018,96 @@ vector<IndirectBranchInfo> Function::GetIndirectBranchesAt(Architecture* arch, u
}
+void Function::SetAutoCallStackAdjustment(Architecture* arch, uint64_t addr, const Confidence<size_t>& adjust)
+{
+ BNSetAutoCallStackAdjustment(m_object, arch->GetObject(), addr, adjust.GetValue(), adjust.GetConfidence());
+}
+
+
+void Function::SetAutoCallRegisterStackAdjustment(Architecture* arch, uint64_t addr,
+ const map<uint32_t, Confidence<int32_t>>& adjust)
+{
+ BNRegisterStackAdjustment* values = new BNRegisterStackAdjustment[adjust.size()];
+ size_t i = 0;
+ for (auto& j : adjust)
+ {
+ values[i].regStack = j.first;
+ values[i].adjustment = j.second.GetValue();
+ values[i].confidence = j.second.GetConfidence();
+ i++;
+ }
+ BNSetAutoCallRegisterStackAdjustment(m_object, arch->GetObject(), addr, values, adjust.size());
+ delete[] values;
+}
+
+
+void Function::SetAutoCallRegisterStackAdjustment(Architecture* arch, uint64_t addr, uint32_t regStack,
+ const Confidence<int32_t>& adjust)
+{
+ BNSetAutoCallRegisterStackAdjustmentForRegisterStack(m_object, arch->GetObject(), addr, regStack,
+ adjust.GetValue(), adjust.GetConfidence());
+}
+
+
+void Function::SetUserCallStackAdjustment(Architecture* arch, uint64_t addr, const Confidence<size_t>& adjust)
+{
+ BNSetUserCallStackAdjustment(m_object, arch->GetObject(), addr, adjust.GetValue(), adjust.GetConfidence());
+}
+
+
+void Function::SetUserCallRegisterStackAdjustment(Architecture* arch, uint64_t addr,
+ const map<uint32_t, Confidence<int32_t>>& adjust)
+{
+ BNRegisterStackAdjustment* values = new BNRegisterStackAdjustment[adjust.size()];
+ size_t i = 0;
+ for (auto& j : adjust)
+ {
+ values[i].regStack = j.first;
+ values[i].adjustment = j.second.GetValue();
+ values[i].confidence = j.second.GetConfidence();
+ i++;
+ }
+ BNSetUserCallRegisterStackAdjustment(m_object, arch->GetObject(), addr, values, adjust.size());
+ delete[] values;
+}
+
+
+void Function::SetUserCallRegisterStackAdjustment(Architecture* arch, uint64_t addr, uint32_t regStack,
+ const Confidence<int32_t>& adjust)
+{
+ BNSetUserCallRegisterStackAdjustmentForRegisterStack(m_object, arch->GetObject(), addr, regStack,
+ adjust.GetValue(), adjust.GetConfidence());
+}
+
+
+Confidence<size_t> Function::GetCallStackAdjustment(Architecture* arch, uint64_t addr)
+{
+ BNSizeWithConfidence result = BNGetCallStackAdjustment(m_object, arch->GetObject(), addr);
+ return Confidence<size_t>(result.value, result.confidence);
+}
+
+
+map<uint32_t, Confidence<int32_t>> Function::GetCallRegisterStackAdjustment(Architecture* arch, uint64_t addr)
+{
+ size_t count;
+ BNRegisterStackAdjustment* adjust = BNGetCallRegisterStackAdjustment(m_object, arch->GetObject(), addr, &count);
+
+ map<uint32_t, Confidence<int32_t>> result;
+ for (size_t i = 0; i < count; i++)
+ result[adjust[i].regStack] = Confidence<int32_t>(adjust[i].adjustment, adjust[i].confidence);
+ BNFreeRegisterStackAdjustments(adjust);
+ return result;
+}
+
+
+Confidence<int32_t> Function::GetCallRegisterStackAdjustment(Architecture* arch, uint64_t addr, uint32_t regStack)
+{
+ BNRegisterStackAdjustment result = BNGetCallRegisterStackAdjustmentForRegisterStack(m_object,
+ arch->GetObject(), addr, regStack);
+ return Confidence<int32_t>(result.adjustment, result.confidence);
+}
+
+
vector<vector<InstructionTextToken>> Function::GetBlockAnnotations(Architecture* arch, uint64_t addr)
{
size_t count;