diff options
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; } |