Change IRObjectFile to parse the bitcode lazily.

The main point of this class is to provide a cheap object interface to a bitcode
file, so it has to be as lazy as possible.

llvm-svn: 211207
This commit is contained in:
Rafael Espindola 2014-06-18 19:05:24 +00:00
parent 0608be5c6e
commit a33412cebf

View File

@ -23,7 +23,8 @@ using namespace object;
IRObjectFile::IRObjectFile(MemoryBuffer *Object, std::error_code &EC,
LLVMContext &Context, bool BufferOwned)
: SymbolicFile(Binary::ID_IR, Object, BufferOwned) {
ErrorOr<Module*> MOrErr = parseBitcodeFile(Object, Context);
ErrorOr<Module *> MOrErr =
getLazyBitcodeModule(Object, Context, /*BufferOwned*/ false);
if ((EC = MOrErr.getError()))
return;
@ -104,11 +105,21 @@ std::error_code IRObjectFile::printSymbolName(raw_ostream &OS,
return object_error::success;
}
static bool isDeclaration(const GlobalValue &V) {
if (V.hasAvailableExternallyLinkage())
return true;
if (V.isMaterializable())
return false;
return V.isDeclaration();
}
uint32_t IRObjectFile::getSymbolFlags(DataRefImpl Symb) const {
const GlobalValue &GV = getGV(Symb);
uint32_t Res = BasicSymbolRef::SF_None;
if (GV.isDeclaration() || GV.hasAvailableExternallyLinkage())
if (isDeclaration(GV))
Res |= BasicSymbolRef::SF_Undefined;
if (GV.hasPrivateLinkage())
Res |= BasicSymbolRef::SF_FormatSpecific;