summaryrefslogtreecommitdiff
path: root/function.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2018-02-07 17:18:27 -0500
committerPeter LaFosse <peter@vector35.com>2018-03-23 17:10:06 -0400
commiteb2a6a07df889537e25c647d9b3c71c30c836961 (patch)
tree07854f577cadc9df169c4cfd52cde12a97108436 /function.cpp
parent2f6d0dbc9fa98f44468791d81d72ffe300879775 (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 40dcf16f..ab5f0ea3 100644
--- a/function.cpp
+++ b/function.cpp
@@ -1020,6 +1020,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;