summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basicblock.cpp20
-rw-r--r--binaryninjaapi.h10
-rw-r--r--binaryninjacore.h10
-rw-r--r--python/basicblock.py51
4 files changed, 66 insertions, 25 deletions
diff --git a/basicblock.cpp b/basicblock.cpp
index e03180b5..c34a4bb7 100644
--- a/basicblock.cpp
+++ b/basicblock.cpp
@@ -185,10 +185,10 @@ bool BasicBlock::CanExit() const
}
-set<Ref<BasicBlock>> BasicBlock::GetDominators() const
+set<Ref<BasicBlock>> BasicBlock::GetDominators(bool post) const
{
size_t count;
- BNBasicBlock** blocks = BNGetBasicBlockDominators(m_object, &count);
+ BNBasicBlock** blocks = BNGetBasicBlockDominators(m_object, &count, post);
set<Ref<BasicBlock>> result;
for (size_t i = 0; i < count; i++)
@@ -199,10 +199,10 @@ set<Ref<BasicBlock>> BasicBlock::GetDominators() const
}
-set<Ref<BasicBlock>> BasicBlock::GetStrictDominators() const
+set<Ref<BasicBlock>> BasicBlock::GetStrictDominators(bool post) const
{
size_t count;
- BNBasicBlock** blocks = BNGetBasicBlockStrictDominators(m_object, &count);
+ BNBasicBlock** blocks = BNGetBasicBlockStrictDominators(m_object, &count, post);
set<Ref<BasicBlock>> result;
for (size_t i = 0; i < count; i++)
@@ -213,19 +213,19 @@ set<Ref<BasicBlock>> BasicBlock::GetStrictDominators() const
}
-Ref<BasicBlock> BasicBlock::GetImmediateDominator() const
+Ref<BasicBlock> BasicBlock::GetImmediateDominator(bool post) const
{
- BNBasicBlock* result = BNGetBasicBlockImmediateDominator(m_object);
+ BNBasicBlock* result = BNGetBasicBlockImmediateDominator(m_object, post);
if (!result)
return nullptr;
return new BasicBlock(result);
}
-set<Ref<BasicBlock>> BasicBlock::GetDominatorTreeChildren() const
+set<Ref<BasicBlock>> BasicBlock::GetDominatorTreeChildren(bool post) const
{
size_t count;
- BNBasicBlock** blocks = BNGetBasicBlockDominatorTreeChildren(m_object, &count);
+ BNBasicBlock** blocks = BNGetBasicBlockDominatorTreeChildren(m_object, &count, post);
set<Ref<BasicBlock>> result;
for (size_t i = 0; i < count; i++)
@@ -236,10 +236,10 @@ set<Ref<BasicBlock>> BasicBlock::GetDominatorTreeChildren() const
}
-set<Ref<BasicBlock>> BasicBlock::GetDominanceFrontier() const
+set<Ref<BasicBlock>> BasicBlock::GetDominanceFrontier(bool post) const
{
size_t count;
- BNBasicBlock** blocks = BNGetBasicBlockDominanceFrontier(m_object, &count);
+ BNBasicBlock** blocks = BNGetBasicBlockDominanceFrontier(m_object, &count, post);
set<Ref<BasicBlock>> result;
for (size_t i = 0; i < count; i++)
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index dc3ca449..65cba272 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -2412,11 +2412,11 @@ namespace BinaryNinja
bool HasUndeterminedOutgoingEdges() const;
bool CanExit() const;
- std::set<Ref<BasicBlock>> GetDominators() const;
- std::set<Ref<BasicBlock>> GetStrictDominators() const;
- Ref<BasicBlock> GetImmediateDominator() const;
- std::set<Ref<BasicBlock>> GetDominatorTreeChildren() const;
- std::set<Ref<BasicBlock>> GetDominanceFrontier() const;
+ std::set<Ref<BasicBlock>> GetDominators(bool post = false) const;
+ std::set<Ref<BasicBlock>> GetStrictDominators(bool post = false) const;
+ Ref<BasicBlock> GetImmediateDominator(bool post = false) const;
+ std::set<Ref<BasicBlock>> GetDominatorTreeChildren(bool post = false) const;
+ std::set<Ref<BasicBlock>> GetDominanceFrontier(bool post = false) const;
static std::set<Ref<BasicBlock>> GetIteratedDominanceFrontier(const std::set<Ref<BasicBlock>>& blocks);
void MarkRecentUse();
diff --git a/binaryninjacore.h b/binaryninjacore.h
index 9eb74713..eadc4b2e 100644
--- a/binaryninjacore.h
+++ b/binaryninjacore.h
@@ -2619,11 +2619,11 @@ extern "C"
BINARYNINJACOREAPI bool BNBasicBlockHasUndeterminedOutgoingEdges(BNBasicBlock* block);
BINARYNINJACOREAPI bool BNBasicBlockCanExit(BNBasicBlock* block);
BINARYNINJACOREAPI size_t BNGetBasicBlockIndex(BNBasicBlock* block);
- BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockDominators(BNBasicBlock* block, size_t* count);
- BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockStrictDominators(BNBasicBlock* block, size_t* count);
- BINARYNINJACOREAPI BNBasicBlock* BNGetBasicBlockImmediateDominator(BNBasicBlock* block);
- BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockDominatorTreeChildren(BNBasicBlock* block, size_t* count);
- BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockDominanceFrontier(BNBasicBlock* block, size_t* count);
+ BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockDominators(BNBasicBlock* block, size_t* count, bool post);
+ BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockStrictDominators(BNBasicBlock* block, size_t* count, bool post);
+ BINARYNINJACOREAPI BNBasicBlock* BNGetBasicBlockImmediateDominator(BNBasicBlock* block, bool post);
+ BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockDominatorTreeChildren(BNBasicBlock* block, size_t* count, bool post);
+ BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockDominanceFrontier(BNBasicBlock* block, size_t* count, bool post);
BINARYNINJACOREAPI BNBasicBlock** BNGetBasicBlockIteratedDominanceFrontier(BNBasicBlock** blocks,
size_t incomingCount, size_t* outputCount);
BINARYNINJACOREAPI bool BNIsILBasicBlock(BNBasicBlock* block);
diff --git a/python/basicblock.py b/python/basicblock.py
index 661eefd5..5730bab5 100644
--- a/python/basicblock.py
+++ b/python/basicblock.py
@@ -249,7 +249,18 @@ class BasicBlock(object):
def dominators(self):
"""List of dominators for this basic block (read-only)"""
count = ctypes.c_ulonglong()
- blocks = core.BNGetBasicBlockDominators(self.handle, count)
+ blocks = core.BNGetBasicBlockDominators(self.handle, count, False)
+ result = []
+ for i in range(0, count.value):
+ result.append(self._create_instance(core.BNNewBasicBlockReference(blocks[i]), self.view))
+ core.BNFreeBasicBlockList(blocks, count.value)
+ return result
+
+ @property
+ def post_dominators(self):
+ """List of dominators for this basic block (read-only)"""
+ count = ctypes.c_ulonglong()
+ blocks = core.BNGetBasicBlockDominators(self.handle, count, True)
result = []
for i in range(0, count.value):
result.append(self._create_instance(core.BNNewBasicBlockReference(blocks[i]), self.view))
@@ -260,7 +271,7 @@ class BasicBlock(object):
def strict_dominators(self):
"""List of strict dominators for this basic block (read-only)"""
count = ctypes.c_ulonglong()
- blocks = core.BNGetBasicBlockStrictDominators(self.handle, count)
+ blocks = core.BNGetBasicBlockStrictDominators(self.handle, count, False)
result = []
for i in range(0, count.value):
result.append(self._create_instance(core.BNNewBasicBlockReference(blocks[i]), self.view))
@@ -270,7 +281,15 @@ class BasicBlock(object):
@property
def immediate_dominator(self):
"""Immediate dominator of this basic block (read-only)"""
- result = core.BNGetBasicBlockImmediateDominator(self.handle)
+ result = core.BNGetBasicBlockImmediateDominator(self.handle, False)
+ if not result:
+ return None
+ return self._create_instance(result, self.view)
+
+ @property
+ def immediate_post_dominator(self):
+ """Immediate dominator of this basic block (read-only)"""
+ result = core.BNGetBasicBlockImmediateDominator(self.handle, True)
if not result:
return None
return self._create_instance(result, self.view)
@@ -279,7 +298,18 @@ class BasicBlock(object):
def dominator_tree_children(self):
"""List of child blocks in the dominator tree for this basic block (read-only)"""
count = ctypes.c_ulonglong()
- blocks = core.BNGetBasicBlockDominatorTreeChildren(self.handle, count)
+ blocks = core.BNGetBasicBlockDominatorTreeChildren(self.handle, count, False)
+ result = []
+ for i in range(0, count.value):
+ result.append(self._create_instance(core.BNNewBasicBlockReference(blocks[i]), self.view))
+ core.BNFreeBasicBlockList(blocks, count.value)
+ return result
+
+ @property
+ def post_dominator_tree_children(self):
+ """List of child blocks in the post dominator tree for this basic block (read-only)"""
+ count = ctypes.c_ulonglong()
+ blocks = core.BNGetBasicBlockDominatorTreeChildren(self.handle, count, True)
result = []
for i in range(0, count.value):
result.append(self._create_instance(core.BNNewBasicBlockReference(blocks[i]), self.view))
@@ -290,7 +320,18 @@ class BasicBlock(object):
def dominance_frontier(self):
"""Dominance frontier for this basic block (read-only)"""
count = ctypes.c_ulonglong()
- blocks = core.BNGetBasicBlockDominanceFrontier(self.handle, count)
+ blocks = core.BNGetBasicBlockDominanceFrontier(self.handle, count, False)
+ result = []
+ for i in range(0, count.value):
+ result.append(self._create_instance(core.BNNewBasicBlockReference(blocks[i]), self.view))
+ core.BNFreeBasicBlockList(blocks, count.value)
+ return result
+
+ @property
+ def post_dominance_frontier(self):
+ """Post dominance frontier for this basic block (read-only)"""
+ count = ctypes.c_ulonglong()
+ blocks = core.BNGetBasicBlockDominanceFrontier(self.handle, count, True)
result = []
for i in range(0, count.value):
result.append(self._create_instance(core.BNNewBasicBlockReference(blocks[i]), self.view))