summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/basicblock.py51
1 files changed, 46 insertions, 5 deletions
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))