mirror of
https://github.com/revng/revng
synced 2026-06-21 14:07:57 +00:00
26cf42eb12
Introduce the Enforce Single Exit pass, whose task is to normalize a generic `ScopeGraph`, which may have multiple exit blocks (and/or infinite loop regions), in order to have a single `sink_block` as exit block. This is done by adding a new entry block, a `sink_block`, and some `scope_closer` edges (which are visible only on the `ScopeGraph`) that enforce the property. This is done taking inspiration from how the internally the `PostDominatorTree` pass construct the temporary graph on which the post dominance information is computed on. Some unit tests are added in order to verify that the pass works as expected.
21 lines
400 B
C++
21 lines
400 B
C++
#pragma once
|
|
|
|
//
|
|
// Copyright rev.ng Labs Srl. See LICENSE.md for details.
|
|
//
|
|
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/Pass.h"
|
|
|
|
class EnforceSingleExitPass : public llvm::FunctionPass {
|
|
public:
|
|
static char ID;
|
|
|
|
public:
|
|
EnforceSingleExitPass() : llvm::FunctionPass(ID) {}
|
|
|
|
bool runOnFunction(llvm::Function &F) override;
|
|
|
|
void getAnalysisUsage(llvm::AnalysisUsage &AU) const override;
|
|
};
|