speed up Archive::isBytecodeArchive in the case when the archive doesn't have

an llvm-ranlib symtab.  This speeds up gccld -native on an almost empty .o file
from 1.63s to 0.18s.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23406 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2005-09-23 06:22:58 +00:00
parent 7b5634d213
commit 7c439929bc
2 changed files with 48 additions and 36 deletions

View File

@ -504,19 +504,15 @@ Archive::findModulesDefiningSymbols(std::set<std::string>& symbols,
}
}
bool
Archive::isBytecodeArchive()
{
//Make sure the symTab has been loaded...
//in most cases this should have been done
//when the archive was constructed, but still,
//this is just in case.
if ( !symTab.size() )
bool Archive::isBytecodeArchive() {
// Make sure the symTab has been loaded. In most cases this should have been
// done when the archive was constructed, but still, this is just in case.
if (!symTab.size())
loadSymbolTable();
//Now that we know it's been loaded, return true
//if it has a size
if ( symTab.size() ) return true;
// Now that we know it's been loaded, return true
// if it has a size
if (symTab.size()) return true;
//We still can't be sure it isn't a bytecode archive
loadArchive();
@ -524,11 +520,21 @@ Archive::isBytecodeArchive()
std::vector<Module *> Modules;
std::string ErrorMessage;
//If getAllModules gives an error then this isn't a proper
//bytecode archive
if ( getAllModules( Modules, &ErrorMessage ) ) return false;
//Finally, if we find any bytecode modules then this is a proper
//bytecode archive
return Modules.size();
// Scan the archive, trying to load a bytecode member. We only load one to
// see if this works.
for (iterator I = begin(), E = end(); I != E; ++I) {
if (!I->isBytecode() && !I->isCompressedBytecode())
continue;
std::string FullMemberName =
archPath.toString() + "(" + I->getPath().toString() + ")";
Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(),
I->getSize(), FullMemberName);
if (!M)
return false; // Couldn't parse bytecode, not a bytecode archive.
delete M;
return true;
}
return false;
}

View File

@ -504,19 +504,15 @@ Archive::findModulesDefiningSymbols(std::set<std::string>& symbols,
}
}
bool
Archive::isBytecodeArchive()
{
//Make sure the symTab has been loaded...
//in most cases this should have been done
//when the archive was constructed, but still,
//this is just in case.
if ( !symTab.size() )
bool Archive::isBytecodeArchive() {
// Make sure the symTab has been loaded. In most cases this should have been
// done when the archive was constructed, but still, this is just in case.
if (!symTab.size())
loadSymbolTable();
//Now that we know it's been loaded, return true
//if it has a size
if ( symTab.size() ) return true;
// Now that we know it's been loaded, return true
// if it has a size
if (symTab.size()) return true;
//We still can't be sure it isn't a bytecode archive
loadArchive();
@ -524,11 +520,21 @@ Archive::isBytecodeArchive()
std::vector<Module *> Modules;
std::string ErrorMessage;
//If getAllModules gives an error then this isn't a proper
//bytecode archive
if ( getAllModules( Modules, &ErrorMessage ) ) return false;
//Finally, if we find any bytecode modules then this is a proper
//bytecode archive
return Modules.size();
// Scan the archive, trying to load a bytecode member. We only load one to
// see if this works.
for (iterator I = begin(), E = end(); I != E; ++I) {
if (!I->isBytecode() && !I->isCompressedBytecode())
continue;
std::string FullMemberName =
archPath.toString() + "(" + I->getPath().toString() + ")";
Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(),
I->getSize(), FullMemberName);
if (!M)
return false; // Couldn't parse bytecode, not a bytecode archive.
delete M;
return true;
}
return false;
}