diff options
| author | Xusheng <xusheng@vector35.com> | 2022-08-17 18:01:47 +0800 |
|---|---|---|
| committer | Xusheng <xusheng@vector35.com> | 2022-08-20 12:09:01 +0800 |
| commit | 09f2b5f1254aeaa7dc6b54500a71dfe86f783d84 (patch) | |
| tree | dbd05c920707073fee1ace4a441ff91f01a88631 /lowlevelil.cpp | |
| parent | 03d08ab28700c95527f275d009501b0815e436ac (diff) | |
Improve Python/C++ APIs to get registers, register stacks, and flags for LLIL
Diffstat (limited to 'lowlevelil.cpp')
| -rw-r--r-- | lowlevelil.cpp | 70 |
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) |
