diff options
| author | Rusty Wagner <rusty@vector35.com> | 2017-02-17 23:22:17 -0500 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2017-02-17 23:23:12 -0500 |
| commit | c46c3a9540f4d15eff8aa9660df69e374f7fd2f5 (patch) | |
| tree | 5ca970d051db42fb40061273e7ccfc1ae14e1c01 /basicblock.cpp | |
| parent | 431dad36edd8c55a0c32759c7b939a5d017d5c46 (diff) | |
Add dominator APIs
Diffstat (limited to 'basicblock.cpp')
| -rw-r--r-- | basicblock.cpp | 37 |
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); |
