Files
revng-revng/lib/RemoveExceptionCalls/RemoveExceptionCallsPass.cpp
T
Andrea Gussoni 371dc7ea97 Remove exceptions before decompilation in pipeline
We now craft a new decompilation pipeline. We remove the exceptions
introduced as fallbacks to preserve the semantics, and we perform passes
of `dce` and `simplifycfg` to remove all the superfluos basic block
remaining after this change. To do this, we need an additional pass that
removes also the calls to the `llvm.assume` intrinsic, and another pass
of `dce` to remove all the dead uses.

In addition, we also remove dead stores to the `cpu_loop_exiting` global
variable in order to improve the decompiled code.

As a byproduct of this, we remove also the dependency from the
`-remove-pc-stores` pass, since its jobs is included by the changes
mentioned above.
2020-11-02 18:33:57 +01:00

46 lines
1.2 KiB
C++

//
// This file is distributed under the MIT License. See LICENSE.md for details.
//
// LLVM includes
#include <llvm/ADT/SmallVector.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Module.h>
// revng includes
#include <revng/Support/IRHelpers.h>
// Local libraries includes
#include "revng-c/RemoveExceptionCalls/RemoveExceptionCallsPass.h"
using namespace llvm;
char RemoveExceptionCallsPass::ID = 0;
using Reg = RegisterPass<RemoveExceptionCallsPass>;
static Reg X("remove-exception-calls",
"Removes calls to raise_exception_helper",
true,
true);
bool RemoveExceptionCallsPass::runOnFunction(Function &F) {
// Skip non translated functions.
if (not F.hasMetadata("revng.func.entry"))
return false;
// Remove calls to `raise_exception_helper` in the current function.
SmallVector<Instruction *, 8> ToErase;
for (BasicBlock &BB : F) {
for (Instruction &I : BB)
if (auto *C = dyn_cast<CallInst>(&I))
if (getCallee(C)->getName() == "raise_exception_helper")
ToErase.push_back(C);
}
bool Changed = not ToErase.empty();
for (Instruction *I : ToErase)
I->eraseFromParent();
return Changed;
}