mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-17 06:33:21 +00:00
Big programs have tons of global variable initializers, and most passes don't care
about them. Try to delete them if it doesn't affect the passes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5918 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
16608b4c85
commit
5f73e38548
@ -245,6 +245,36 @@ bool BugDriver::debugCrash() {
|
|||||||
|
|
||||||
EmitProgressBytecode("passinput");
|
EmitProgressBytecode("passinput");
|
||||||
|
|
||||||
|
// See if we can get away with nuking all of the global variable initializers
|
||||||
|
// in the program...
|
||||||
|
if (Program->gbegin() != Program->gend()) {
|
||||||
|
Module *M = CloneModule(Program);
|
||||||
|
bool DeletedInit = false;
|
||||||
|
for (Module::giterator I = M->gbegin(), E = M->gend(); I != E; ++I)
|
||||||
|
if (I->hasInitializer()) {
|
||||||
|
I->setInitializer(0);
|
||||||
|
I->setLinkage(GlobalValue::ExternalLinkage);
|
||||||
|
DeletedInit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DeletedInit) {
|
||||||
|
delete M; // No change made...
|
||||||
|
} else {
|
||||||
|
// See if the program still causes a crash...
|
||||||
|
std::cout << "\nChecking to see if we can delete global inits: ";
|
||||||
|
std::swap(Program, M);
|
||||||
|
if (runPasses(PassesToRun)) { // Still crashes?
|
||||||
|
AnyReduction = true;
|
||||||
|
delete M;
|
||||||
|
std::cout << "\n*** Able to remove all global initializers!\n";
|
||||||
|
} else { // No longer crashes?
|
||||||
|
delete Program; // Restore program.
|
||||||
|
Program = M;
|
||||||
|
std::cout << " - Removing all global inits hides problem!\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Now try to reduce the number of functions in the module to something small.
|
// Now try to reduce the number of functions in the module to something small.
|
||||||
std::vector<Function*> Functions;
|
std::vector<Function*> Functions;
|
||||||
for (Module::iterator I = Program->begin(), E = Program->end(); I != E; ++I)
|
for (Module::iterator I = Program->begin(), E = Program->end(); I != E; ++I)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user