mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
First Prototype of EnforceCFGCombingPass
This commit is contained in:
@@ -8,19 +8,26 @@ using namespace llvm;
|
||||
|
||||
namespace BasicBlockViewAnalysis {
|
||||
|
||||
Analysis::InterruptType Analysis::transfer(BasicBlockNode *InputBB) {
|
||||
BasicBlockViewMap VisibleBB = State[InputBB].copy();
|
||||
BasicBlockNode *BB = InputBB;
|
||||
while (BB->isDummy()) {
|
||||
revng_assert(BB->basicBlock() == nullptr);
|
||||
revng_assert(BB->successor_size() == 1);
|
||||
BB = *BB->successors().begin();
|
||||
Analysis::InterruptType Analysis::transfer(BasicBlockNode *InputBBNode) {
|
||||
BasicBlockViewMap VisibleBB = State[InputBBNode].copy();
|
||||
BasicBlock *EnforcedBB = EnforcedBBMap.at(InputBBNode);
|
||||
|
||||
if (InputBBNode->isDummy()) {
|
||||
while (InputBBNode->isDummy()) {
|
||||
revng_assert(InputBBNode->basicBlock() == nullptr);
|
||||
revng_assert(InputBBNode->successor_size() == 1);
|
||||
InputBBNode = *InputBBNode->successors().begin();
|
||||
}
|
||||
BasicBlock *OriginalBB = InputBBNode->basicBlock();
|
||||
revng_assert(OriginalBB != nullptr);
|
||||
VisibleBB.at(OriginalBB) = EnforcedBB;
|
||||
} else {
|
||||
BasicBlock *OriginalBB = InputBBNode->basicBlock();
|
||||
revng_assert(OriginalBB != nullptr);
|
||||
bool New = VisibleBB.insert(std::make_pair(OriginalBB, EnforcedBB)).second;
|
||||
revng_assert(New);
|
||||
ViewMap[EnforcedBB] = VisibleBB.copyMap();
|
||||
}
|
||||
BasicBlock *OriginalBB = BB->basicBlock();
|
||||
revng_assert(OriginalBB);
|
||||
bool New = VisibleBB.insert(std::make_pair(OriginalBB, InputBB)).second;
|
||||
revng_assert(New);
|
||||
BBViewMap[InputBB] = VisibleBB.copy();
|
||||
return InterruptType::createInterrupt(std::move(VisibleBB));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user