diff options
| -rw-r--r-- | basicblock.cpp | 20 | ||||
| -rw-r--r-- | binaryninjaapi.h | 10 | ||||
| -rw-r--r-- | binaryninjacore.h | 10 | ||||
| -rw-r--r-- | python/basicblock.py | 51 |
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)) |
