mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-19 08:35:45 +00:00
Return a std::unique_ptr from parseInputFile and propagate. NFC.
The memory management in BugPoint is fairly convoluted, so this just unwraps one layer by changing the return type of functions that always return owned Modules. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216464 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -82,13 +82,9 @@ namespace {
|
||||
}
|
||||
} // end anonymous namespace
|
||||
|
||||
/// deleteInstructionFromProgram - This method clones the current Program and
|
||||
/// deletes the specified instruction from the cloned module. It then runs a
|
||||
/// series of cleanup passes (ADCE and SimplifyCFG) to eliminate any code which
|
||||
/// depends on the value. The modified module is then returned.
|
||||
///
|
||||
Module *BugDriver::deleteInstructionFromProgram(const Instruction *I,
|
||||
unsigned Simplification) {
|
||||
std::unique_ptr<Module>
|
||||
BugDriver::deleteInstructionFromProgram(const Instruction *I,
|
||||
unsigned Simplification) {
|
||||
// FIXME, use vmap?
|
||||
Module *Clone = CloneModule(Program);
|
||||
|
||||
@@ -123,7 +119,7 @@ Module *BugDriver::deleteInstructionFromProgram(const Instruction *I,
|
||||
Passes.push_back("simplifycfg"); // Delete dead control flow
|
||||
|
||||
Passes.push_back("verify");
|
||||
Module *New = runPassesOn(Clone, Passes);
|
||||
std::unique_ptr<Module> New = runPassesOn(Clone, Passes);
|
||||
delete Clone;
|
||||
if (!New) {
|
||||
errs() << "Instruction removal failed. Sorry. :( Please report a bug!\n";
|
||||
@@ -132,11 +128,8 @@ Module *BugDriver::deleteInstructionFromProgram(const Instruction *I,
|
||||
return New;
|
||||
}
|
||||
|
||||
/// performFinalCleanups - This method clones the current Program and performs
|
||||
/// a series of cleanups intended to get rid of extra cruft on the module
|
||||
/// before handing it to the user.
|
||||
///
|
||||
Module *BugDriver::performFinalCleanups(Module *M, bool MayModifySemantics) {
|
||||
std::unique_ptr<Module>
|
||||
BugDriver::performFinalCleanups(Module *M, bool MayModifySemantics) {
|
||||
// Make all functions external, so GlobalDCE doesn't delete them...
|
||||
for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
|
||||
I->setLinkage(GlobalValue::ExternalLinkage);
|
||||
@@ -149,24 +142,20 @@ Module *BugDriver::performFinalCleanups(Module *M, bool MayModifySemantics) {
|
||||
else
|
||||
CleanupPasses.push_back("deadargelim");
|
||||
|
||||
Module *New = runPassesOn(M, CleanupPasses);
|
||||
std::unique_ptr<Module> New = runPassesOn(M, CleanupPasses);
|
||||
if (!New) {
|
||||
errs() << "Final cleanups failed. Sorry. :( Please report a bug!\n";
|
||||
return M;
|
||||
return nullptr;
|
||||
}
|
||||
delete M;
|
||||
return New;
|
||||
}
|
||||
|
||||
|
||||
/// ExtractLoop - Given a module, extract up to one loop from it into a new
|
||||
/// function. This returns null if there are no extractable loops in the
|
||||
/// program or if the loop extractor crashes.
|
||||
Module *BugDriver::ExtractLoop(Module *M) {
|
||||
std::unique_ptr<Module> BugDriver::extractLoop(Module *M) {
|
||||
std::vector<std::string> LoopExtractPasses;
|
||||
LoopExtractPasses.push_back("loop-extract-single");
|
||||
|
||||
Module *NewM = runPassesOn(M, LoopExtractPasses);
|
||||
std::unique_ptr<Module> NewM = runPassesOn(M, LoopExtractPasses);
|
||||
if (!NewM) {
|
||||
outs() << "*** Loop extraction failed: ";
|
||||
EmitProgressBitcode(M, "loopextraction", true);
|
||||
@@ -179,7 +168,6 @@ Module *BugDriver::ExtractLoop(Module *M) {
|
||||
// to avoid taking forever.
|
||||
static unsigned NumExtracted = 32;
|
||||
if (M->size() == NewM->size() || --NumExtracted == 0) {
|
||||
delete NewM;
|
||||
return nullptr;
|
||||
} else {
|
||||
assert(M->size() < NewM->size() && "Loop extract removed functions?");
|
||||
@@ -356,14 +344,9 @@ llvm::SplitFunctionsOutOfModule(Module *M,
|
||||
// Basic Block Extraction Code
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// ExtractMappedBlocksFromModule - Extract all but the specified basic blocks
|
||||
/// into their own functions. The only detail is that M is actually a module
|
||||
/// cloned from the one the BBs are in, so some mapping needs to be performed.
|
||||
/// If this operation fails for some reason (ie the implementation is buggy),
|
||||
/// this function should return null, otherwise it returns a new Module.
|
||||
Module *BugDriver::ExtractMappedBlocksFromModule(const
|
||||
std::vector<BasicBlock*> &BBs,
|
||||
Module *M) {
|
||||
std::unique_ptr<Module>
|
||||
BugDriver::extractMappedBlocksFromModule(const std::vector<BasicBlock *> &BBs,
|
||||
Module *M) {
|
||||
SmallString<128> Filename;
|
||||
int FD;
|
||||
std::error_code EC = sys::fs::createUniqueFile(
|
||||
@@ -401,7 +384,7 @@ Module *BugDriver::ExtractMappedBlocksFromModule(const
|
||||
|
||||
std::vector<std::string> PI;
|
||||
PI.push_back("extract-blocks");
|
||||
Module *Ret = runPassesOn(M, PI, false, 1, &ExtraArg);
|
||||
std::unique_ptr<Module> Ret = runPassesOn(M, PI, false, 1, &ExtraArg);
|
||||
|
||||
sys::fs::remove(Filename.c_str());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user