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.
|
/// @brief Get the offset to the first "real" file member in the archive.
|
||||||
unsigned getFirstFileOffset() { return firstFileOffset; }
|
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
|
/// @name Mutators
|
||||||
/// @{
|
/// @{
|
||||||
|
|
|
@ -275,29 +275,6 @@ Archive::OpenAndLoad(StringRef File, LLVMContext& C,
|
||||||
return result.take();
|
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
|
// Load just the symbol table from the archive file
|
||||||
bool
|
bool
|
||||||
Archive::loadSymbolTable(std::string* ErrorMsg) {
|
Archive::loadSymbolTable(std::string* ErrorMsg) {
|
||||||
|
@ -361,43 +338,3 @@ Archive::loadSymbolTable(std::string* ErrorMsg) {
|
||||||
firstFileOffset = FirstFile - base;
|
firstFileOffset = FirstFile - base;
|
||||||
return true;
|
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