summaryrefslogtreecommitdiff
path: root/lowlevelil.cpp
diff options
context:
space:
mode:
authorXusheng <xusheng@vector35.com>2022-08-17 18:01:47 +0800
committerXusheng <xusheng@vector35.com>2022-08-20 12:09:01 +0800
commit09f2b5f1254aeaa7dc6b54500a71dfe86f783d84 (patch)
treedbd05c920707073fee1ace4a441ff91f01a88631 /lowlevelil.cpp
parent03d08ab28700c95527f275d009501b0815e436ac (diff)
Improve Python/C++ APIs to get registers, register stacks, and flags for LLIL
Diffstat (limited to 'lowlevelil.cpp')
-rw-r--r--lowlevelil.cpp70
1 files changed, 62 insertions, 8 deletions
diff --git a/lowlevelil.cpp b/lowlevelil.cpp
index 9d23d70c..6724e9c2 100644
--- a/lowlevelil.cpp
+++ b/lowlevelil.cpp
@@ -176,13 +176,67 @@ std::vector<uint32_t> LowLevelILFunction::GetFlags()
}
+std::vector<SSARegister> LowLevelILFunction::GetSSARegistersWithoutVersions()
+{
+ std::vector<SSARegister> result;
+ size_t count;
+
+ auto regs = BNGetLowLevelSSARegistersWithoutVersions(m_object, &count);
+ if (!regs)
+ return result;
+
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.emplace_back(regs[i], 0);
+
+ BNFreeLLILVariablesList(regs);
+ return result;
+}
+
+
+std::vector<SSARegisterStack> LowLevelILFunction::GetSSARegisterStacksWithoutVersions()
+{
+ std::vector<SSARegisterStack> result;
+ size_t count;
+
+ auto regs = BNGetLowLevelSSARegisterStacksWithoutVersions(m_object, &count);
+ if (!regs)
+ return result;
+
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.emplace_back(regs[i], 0);
+
+ BNFreeLLILVariablesList(regs);
+ return result;
+}
+
+
+std::vector<SSAFlag> LowLevelILFunction::GetSSAFlagsWithoutVersions()
+{
+ std::vector<SSAFlag> result;
+ size_t count;
+
+ auto regs = BNGetLowLevelSSAFlagsWithoutVersions(m_object, &count);
+ if (!regs)
+ return result;
+
+ result.reserve(count);
+ for (size_t i = 0; i < count; i++)
+ result.emplace_back(regs[i], 0);
+
+ BNFreeLLILVariablesList(regs);
+ return result;
+}
+
+
std::vector<SSARegister> LowLevelILFunction::GetSSARegisters()
{
std::vector<SSARegister> result;
size_t count;
- auto regs = GetRegisters();
- for (const auto reg: regs)
+ auto regs = GetSSARegistersWithoutVersions();
+ for (const auto& [reg, _]: regs)
{
size_t* versions = BNGetLowLevelRegisterSSAVersions(m_object, reg, &count);
if (versions == nullptr)
@@ -198,13 +252,13 @@ std::vector<SSARegister> LowLevelILFunction::GetSSARegisters()
}
-std::vector<SSARegisterStack> LowLevelILFunction::GetRegisterStackSSAVersions()
+std::vector<SSARegisterStack> LowLevelILFunction::GetSSARegisterStacks()
{
std::vector<SSARegisterStack> result;
size_t count;
- auto regs = GetRegisterStacks();
- for (const auto reg: regs)
+ auto regs = GetSSARegisterStacksWithoutVersions();
+ for (const auto& [reg, _]: regs)
{
size_t* versions = BNGetLowLevelRegisterStackSSAVersions(m_object, reg, &count);
if (versions == nullptr)
@@ -220,13 +274,13 @@ std::vector<SSARegisterStack> LowLevelILFunction::GetRegisterStackSSAVersions()
}
-std::vector<SSAFlag> LowLevelILFunction::GetFlagSSAVersions()
+std::vector<SSAFlag> LowLevelILFunction::GetSSAFlags()
{
std::vector<SSAFlag> result;
size_t count;
- auto flags = GetFlags();
- for (const auto flag: flags)
+ auto flags = GetSSAFlagsWithoutVersions();
+ for (const auto& [flag, _]: flags)
{
size_t* versions = BNGetLowLevelFlagSSAVersions(m_object, flag, &count);
if (versions == nullptr)