summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyleMiles <krm504@nyu.edu>2021-11-01 23:32:36 -0400
committerKyleMiles <krm504@nyu.edu>2021-11-11 16:16:38 -0500
commitcf762601b42ae4365d271c3825d59720718047a2 (patch)
tree8876abd90dd1303d843327766edf83daa3361ae6
parent2c75c418ea472fca237df5b8f80e47c9cbe35467 (diff)
Add Function::GetMediumLevelILSSAVariables and Function::GetHighLevelILSSAVariables to the C++ API
-rw-r--r--binaryninjaapi.h2
-rw-r--r--function.cpp54
2 files changed, 53 insertions, 3 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 2d567bba..dd443c80 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -3547,8 +3547,10 @@ __attribute__ ((format (printf, 1, 2)))
std::map<Variable, VariableNameAndType> GetVariables();
std::set<Variable> GetMediumLevelILVariables();
std::set<Variable> GetMediumLevelILAliasedVariables();
+ std::set<SSAVariable> GetMediumLevelILSSAVariables();
std::set<Variable> GetHighLevelILVariables();
std::set<Variable> GetHighLevelILAliasedVariables();
+ std::set<SSAVariable> GetHighLevelILSSAVariables();
void CreateAutoVariable(const Variable& var, const Confidence<Ref<Type>>& type, const std::string& name,
bool ignoreDisjointUses = false);
diff --git a/function.cpp b/function.cpp
index 20c978ac..1f649191 100644
--- a/function.cpp
+++ b/function.cpp
@@ -1098,7 +1098,7 @@ map<Variable, VariableNameAndType> Function::GetVariables()
BNVariableNameAndType* vars = BNGetFunctionVariables(m_object, &count);
map<Variable, VariableNameAndType> result;
- for (size_t i = 0; i < count; i++)
+ for (size_t i = 0; i < count; ++i)
{
VariableNameAndType var;
var.name = vars[i].name;
@@ -1115,7 +1115,7 @@ map<Variable, VariableNameAndType> Function::GetVariables()
set<Variable> Function::GetMediumLevelILVariables()
{
- auto mlil = this->GetMediumLevelIL();
+ Ref<MediumLevelILFunction> mlil = this->GetMediumLevelIL();
if (!mlil)
return {};
@@ -1149,9 +1149,33 @@ set<Variable> Function::GetMediumLevelILAliasedVariables()
}
+set<SSAVariable> Function::GetMediumLevelILSSAVariables()
+{
+ Ref<MediumLevelILFunction> mlil = this->GetMediumLevelIL();
+ if (!mlil)
+ return {};
+
+ size_t count;
+ BNVariable* vars = BNGetMediumLevelILVariables(mlil->GetObject(), &count);
+
+ set<SSAVariable> result;
+ for (size_t i = 0; i < count; ++i)
+ {
+ size_t versionCount;
+ size_t* versions = BNGetMediumLevelILVariableSSAVersions(mlil->GetObject(), &vars[i], &versionCount);
+ for (size_t j = 0; j < versionCount; ++j)
+ result.emplace(vars[i], versions[j]);
+ BNFreeILInstructionList(versions);
+ }
+
+ BNFreeVariableList(vars);
+ return result;
+}
+
+
set<Variable> Function::GetHighLevelILVariables()
{
- auto hlil = this->GetHighLevelIL();
+ Ref<HighLevelILFunction> hlil = this->GetHighLevelIL();
if (!hlil)
return {};
@@ -1185,6 +1209,30 @@ set<Variable> Function::GetHighLevelILAliasedVariables()
}
+set<SSAVariable> Function::GetHighLevelILSSAVariables()
+{
+ Ref<HighLevelILFunction> hlil = this->GetHighLevelIL();
+ if (!hlil)
+ return {};
+
+ size_t count;
+ BNVariable* vars = BNGetHighLevelILVariables(hlil->GetObject(), &count);
+
+ set<SSAVariable> result;
+ for (size_t i = 0; i < count; ++i)
+ {
+ size_t versionCount;
+ size_t* versions = BNGetHighLevelILVariableSSAVersions(hlil->GetObject(), &vars[i], &versionCount);
+ for (size_t j = 0; j < versionCount; ++j)
+ result.emplace(vars[i], versions[j]);
+ BNFreeILInstructionList(versions);
+ }
+
+ BNFreeVariableList(vars);
+ return result;
+}
+
+
void Function::CreateAutoVariable(const Variable& var, const Confidence<Ref<Type>>& type,
const string& name, bool ignoreDisjointUses)
{