mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-02 07:11:49 +00:00
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:
parent
7b5634d213
commit
7c439929bc
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user