diff options
author | Chris Lattner <sabre@nondot.org> | 2005-09-23 06:22:58 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-09-23 06:22:58 +0000 |
commit | 7c439929bcdc7e64705da5cea8fa41c6ac7a07f7 (patch) | |
tree | 1d368e363f6fe5fe1372865532b7d65835010c31 /lib/Archive | |
parent | 7b5634d2135ca0bfb02767d872573f90a7d73128 (diff) | |
download | external_llvm-7c439929bcdc7e64705da5cea8fa41c6ac7a07f7.zip external_llvm-7c439929bcdc7e64705da5cea8fa41c6ac7a07f7.tar.gz external_llvm-7c439929bcdc7e64705da5cea8fa41c6ac7a07f7.tar.bz2 |
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
Diffstat (limited to 'lib/Archive')
-rw-r--r-- | lib/Archive/ArchiveReader.cpp | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/lib/Archive/ArchiveReader.cpp b/lib/Archive/ArchiveReader.cpp index 8d87a67..ff8c9bc 100644 --- a/lib/Archive/ArchiveReader.cpp +++ b/lib/Archive/ArchiveReader.cpp @@ -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; } |