forked from OSchip/llvm-project
parent
623c90455f
commit
85ae66bf48
|
@ -323,24 +323,6 @@ class Archive {
|
|||
/// @brief Get the offset to the first "real" file member in the archive.
|
||||
unsigned getFirstFileOffset() { return firstFileOffset; }
|
||||
|
||||
/// This method will scan the archive for bitcode modules, interpret them
|
||||
/// and return a vector of the instantiated modules in \p Modules. If an
|
||||
/// error occurs, this method will return true. If \p ErrMessage is not null
|
||||
/// and an error occurs, \p *ErrMessage will be set to a string explaining
|
||||
/// the error that occurred.
|
||||
/// @returns true if an error occurred
|
||||
/// @brief Instantiate all the bitcode modules located in the archive
|
||||
bool getAllModules(std::vector<Module*>& Modules, std::string* ErrMessage);
|
||||
|
||||
/// This method determines whether the archive is a properly formed llvm
|
||||
/// bitcode archive. It first makes sure the symbol table has been loaded
|
||||
/// and has a non-zero size. If it does, then it is an archive. If not,
|
||||
/// then it tries to load all the bitcode modules of the archive. Finally,
|
||||
/// it returns whether it was successful.
|
||||
/// @returns true if the archive is a proper llvm bitcode archive
|
||||
/// @brief Determine whether the archive is a proper llvm bitcode archive.
|
||||
bool isBitcodeArchive();
|
||||
|
||||
/// @}
|
||||
/// @name Mutators
|
||||
/// @{
|
||||
|
|
|
@ -275,29 +275,6 @@ Archive::OpenAndLoad(StringRef File, LLVMContext& C,
|
|||
return result.take();
|
||||
}
|
||||
|
||||
// Get all the bitcode modules from the archive
|
||||
bool
|
||||
Archive::getAllModules(std::vector<Module*>& Modules,
|
||||
std::string* ErrMessage) {
|
||||
|
||||
for (iterator I=begin(), E=end(); I != E; ++I) {
|
||||
if (I->isBitcode()) {
|
||||
std::string FullMemberName = archPath + "(" + I->getPath().str() + ")";
|
||||
MemoryBuffer *Buffer =
|
||||
MemoryBuffer::getMemBufferCopy(StringRef(I->getData(), I->getSize()),
|
||||
FullMemberName.c_str());
|
||||
|
||||
Module *M = ParseBitcodeFile(Buffer, Context, ErrMessage);
|
||||
delete Buffer;
|
||||
if (!M)
|
||||
return true;
|
||||
|
||||
Modules.push_back(M);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Load just the symbol table from the archive file
|
||||
bool
|
||||
Archive::loadSymbolTable(std::string* ErrorMsg) {
|
||||
|
@ -361,43 +338,3 @@ Archive::loadSymbolTable(std::string* ErrorMsg) {
|
|||
firstFileOffset = FirstFile - base;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Archive::isBitcodeArchive() {
|
||||
// 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.empty())
|
||||
if (!loadSymbolTable(0))
|
||||
return false;
|
||||
|
||||
// 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 bitcode archive
|
||||
if (!loadArchive(0))
|
||||
return false;
|
||||
|
||||
std::vector<Module *> Modules;
|
||||
std::string ErrorMessage;
|
||||
|
||||
// Scan the archive, trying to load a bitcode member. We only load one to
|
||||
// see if this works.
|
||||
for (iterator I = begin(), E = end(); I != E; ++I) {
|
||||
if (!I->isBitcode())
|
||||
continue;
|
||||
|
||||
std::string FullMemberName = archPath + "(" + I->getPath().str() + ")";
|
||||
|
||||
MemoryBuffer *Buffer =
|
||||
MemoryBuffer::getMemBufferCopy(StringRef(I->getData(), I->getSize()),
|
||||
FullMemberName.c_str());
|
||||
Module *M = ParseBitcodeFile(Buffer, Context);
|
||||
delete Buffer;
|
||||
if (!M)
|
||||
return false; // Couldn't parse bitcode, not a bitcode archive.
|
||||
delete M;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue