First Prototype of EnforceCFGCombingPass

This commit is contained in:
Pietro Fezzardi
2019-01-18 17:39:28 +01:00
parent 05a5660de2
commit d5f2bc7750
9 changed files with 193 additions and 153 deletions
@@ -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));
}