summaryrefslogtreecommitdiff
path: root/basicblock.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2017-02-17 23:22:17 -0500
committerRusty Wagner <rusty@vector35.com>2017-02-17 23:23:12 -0500
commitc46c3a9540f4d15eff8aa9660df69e374f7fd2f5 (patch)
tree5ca970d051db42fb40061273e7ccfc1ae14e1c01 /basicblock.cpp
parent431dad36edd8c55a0c32759c7b939a5d017d5c46 (diff)
Add dominator APIs
Diffstat (limited to 'basicblock.cpp')
-rw-r--r--basicblock.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/basicblock.cpp b/basicblock.cpp
index 153a7768..58fcb4aa 100644
--- a/basicblock.cpp
+++ b/basicblock.cpp
@@ -158,6 +158,43 @@ bool BasicBlock::HasUndeterminedOutgoingEdges() const
}
+set<Ref<BasicBlock>> BasicBlock::GetDominators() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetBasicBlockDominators(m_object, &count);
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}
+
+
+set<Ref<BasicBlock>> BasicBlock::GetStrictDominators() const
+{
+ size_t count;
+ BNBasicBlock** blocks = BNGetBasicBlockStrictDominators(m_object, &count);
+
+ set<Ref<BasicBlock>> result;
+ for (size_t i = 0; i < count; i++)
+ result.insert(new BasicBlock(BNNewBasicBlockReference(blocks[i])));
+
+ BNFreeBasicBlockList(blocks, count);
+ return result;
+}
+
+
+Ref<BasicBlock> BasicBlock::GetImmediateDominator() const
+{
+ BNBasicBlock* result = BNGetBasicBlockImmediateDominator(m_object);
+ if (!result)
+ return nullptr;
+ return new BasicBlock(result);
+}
+
+
void BasicBlock::MarkRecentUse()
{
BNMarkBasicBlockAsRecentlyUsed(m_object);