Change createObjectFile to return an ErrorOr.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199776 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2014-01-22 00:14:49 +00:00
parent 6220c8f960
commit 825fc31bd3
8 changed files with 31 additions and 27 deletions

View File

@ -376,8 +376,8 @@ public:
/// @param ObjectPath The path to the object file. ObjectPath.isObject must /// @param ObjectPath The path to the object file. ObjectPath.isObject must
/// return true. /// return true.
/// @brief Create ObjectFile from path. /// @brief Create ObjectFile from path.
static ObjectFile *createObjectFile(StringRef ObjectPath); static ErrorOr<ObjectFile *> createObjectFile(StringRef ObjectPath);
static ObjectFile *createObjectFile(MemoryBuffer *Object); static ErrorOr<ObjectFile *> createObjectFile(MemoryBuffer *Object);
static inline bool classof(const Binary *v) { static inline bool classof(const Binary *v) {
return v->isObject(); return v->isObject();

View File

@ -263,12 +263,12 @@ bool DWARFUnit::parseDWO() {
sys::path::append(AbsolutePath, CompilationDir); sys::path::append(AbsolutePath, CompilationDir);
} }
sys::path::append(AbsolutePath, DWOFileName); sys::path::append(AbsolutePath, DWOFileName);
object::ObjectFile *DWOFile = ErrorOr<object::ObjectFile *> DWOFile =
object::ObjectFile::createObjectFile(AbsolutePath); object::ObjectFile::createObjectFile(AbsolutePath);
if (!DWOFile) if (!DWOFile)
return false; return false;
// Reset DWOHolder. // Reset DWOHolder.
DWO.reset(new DWOHolder(DWOFile)); DWO.reset(new DWOHolder(DWOFile.get()));
DWARFUnit *DWOCU = DWO->getUnit(); DWARFUnit *DWOCU = DWO->getUnit();
// Verify that compile unit in .dwo file is valid. // Verify that compile unit in .dwo file is valid.
if (DWOCU == 0 || DWOCU->getDWOId() != getDWOId()) { if (DWOCU == 0 || DWOCU->getDWOId() != getDWOId()) {

View File

@ -44,7 +44,8 @@ public:
ObjectImageCommon(ObjectBuffer* Input) ObjectImageCommon(ObjectBuffer* Input)
: ObjectImage(Input) // saves Input as Buffer and takes ownership : ObjectImage(Input) // saves Input as Buffer and takes ownership
{ {
ObjFile = object::ObjectFile::createObjectFile(Buffer->getMemBuffer()); ObjFile =
object::ObjectFile::createObjectFile(Buffer->getMemBuffer()).get();
} }
ObjectImageCommon(object::ObjectFile* Input) ObjectImageCommon(object::ObjectFile* Input)
: ObjectImage(NULL), ObjFile(Input) {} : ObjectImage(NULL), ObjFile(Input) {}

View File

@ -59,7 +59,9 @@ wrap(const relocation_iterator *SI) {
// ObjectFile creation // ObjectFile creation
LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) { LLVMObjectFileRef LLVMCreateObjectFile(LLVMMemoryBufferRef MemBuf) {
return wrap(ObjectFile::createObjectFile(unwrap(MemBuf))); ErrorOr<ObjectFile*> ObjOrErr(ObjectFile::createObjectFile(unwrap(MemBuf)));
ObjectFile *Obj = ObjOrErr ? ObjOrErr.get() : 0;
return wrap(Obj);
} }
void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) { void LLVMDisposeObjectFile(LLVMObjectFileRef ObjectFile) {

View File

@ -37,26 +37,22 @@ section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const {
return section_iterator(SectionRef(Sec, this)); return section_iterator(SectionRef(Sec, this));
} }
ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { ErrorOr<ObjectFile *> ObjectFile::createObjectFile(MemoryBuffer *Object) {
if (Object->getBufferSize() < 64) { OwningPtr<MemoryBuffer> ScopedObj(Object);
delete Object;
return 0;
}
sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer()); sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer());
switch (Type) { switch (Type) {
case sys::fs::file_magic::unknown: case sys::fs::file_magic::unknown:
case sys::fs::file_magic::bitcode: case sys::fs::file_magic::bitcode:
case sys::fs::file_magic::archive: case sys::fs::file_magic::archive:
case sys::fs::file_magic::macho_universal_binary: case sys::fs::file_magic::macho_universal_binary:
case sys::fs::file_magic::windows_resource: case sys::fs::file_magic::windows_resource:
delete Object; return object_error::invalid_file_type;
return 0;
case sys::fs::file_magic::elf_relocatable: case sys::fs::file_magic::elf_relocatable:
case sys::fs::file_magic::elf_executable: case sys::fs::file_magic::elf_executable:
case sys::fs::file_magic::elf_shared_object: case sys::fs::file_magic::elf_shared_object:
case sys::fs::file_magic::elf_core: case sys::fs::file_magic::elf_core:
return createELFObjectFile(Object).get(); return createELFObjectFile(ScopedObj.take());
case sys::fs::file_magic::macho_object: case sys::fs::file_magic::macho_object:
case sys::fs::file_magic::macho_executable: case sys::fs::file_magic::macho_executable:
case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib: case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
@ -67,18 +63,18 @@ ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) {
case sys::fs::file_magic::macho_bundle: case sys::fs::file_magic::macho_bundle:
case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
case sys::fs::file_magic::macho_dsym_companion: case sys::fs::file_magic::macho_dsym_companion:
return createMachOObjectFile(Object).get(); return createMachOObjectFile(ScopedObj.take());
case sys::fs::file_magic::coff_object: case sys::fs::file_magic::coff_object:
case sys::fs::file_magic::coff_import_library: case sys::fs::file_magic::coff_import_library:
case sys::fs::file_magic::pecoff_executable: case sys::fs::file_magic::pecoff_executable:
return createCOFFObjectFile(Object).get(); return createCOFFObjectFile(ScopedObj.take());
} }
llvm_unreachable("Unexpected Object File Type"); llvm_unreachable("Unexpected Object File Type");
} }
ObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) { ErrorOr<ObjectFile *> ObjectFile::createObjectFile(StringRef ObjectPath) {
OwningPtr<MemoryBuffer> File; OwningPtr<MemoryBuffer> File;
if (MemoryBuffer::getFile(ObjectPath, File)) if (error_code EC = MemoryBuffer::getFile(ObjectPath, File))
return NULL; return EC;
return createObjectFile(File.take()); return createObjectFile(File.take());
} }

View File

@ -527,13 +527,13 @@ int main(int argc, char **argv, char * const *envp) {
} }
for (unsigned i = 0, e = ExtraObjects.size(); i != e; ++i) { for (unsigned i = 0, e = ExtraObjects.size(); i != e; ++i) {
object::ObjectFile *Obj = object::ObjectFile::createObjectFile( ErrorOr<object::ObjectFile *> Obj =
ExtraObjects[i]); object::ObjectFile::createObjectFile(ExtraObjects[i]);
if (!Obj) { if (!Obj) {
Err.print(argv[0], errs()); Err.print(argv[0], errs());
return 1; return 1;
} }
EE->addObjectFile(Obj); EE->addObjectFile(Obj.get());
} }
for (unsigned i = 0, e = ExtraArchives.size(); i != e; ++i) { for (unsigned i = 0, e = ExtraArchives.size(); i != e; ++i) {

View File

@ -670,7 +670,11 @@ static void writeSymbolTable(
object::ObjectFile *Obj; object::ObjectFile *Obj;
if (I->isNewMember()) { if (I->isNewMember()) {
const char *Filename = I->getNew(); const char *Filename = I->getNew();
Obj = object::ObjectFile::createObjectFile(Filename); if (ErrorOr<object::ObjectFile *> ObjOrErr =
object::ObjectFile::createObjectFile(Filename))
Obj = ObjOrErr.get();
else
Obj = NULL;
} else { } else {
object::Archive::child_iterator OldMember = I->getOld(); object::Archive::child_iterator OldMember = I->getOld();
OwningPtr<object::Binary> Binary; OwningPtr<object::Binary> Binary;

View File

@ -93,11 +93,12 @@ static void DumpInput(const StringRef &Filename) {
return; return;
} }
OwningPtr<ObjectFile> Obj(ObjectFile::createObjectFile(Buff.take())); ErrorOr<ObjectFile*> ObjOrErr(ObjectFile::createObjectFile(Buff.take()));
if (!Obj) { if (error_code EC = ObjOrErr.getError()) {
errs() << Filename << ": Unknown object file format\n"; errs() << Filename << ": " << EC.message() << '\n';
return; return;
} }
OwningPtr<ObjectFile> Obj(ObjOrErr.get());
OwningPtr<DIContext> DICtx(DIContext::getDWARFContext(Obj.get())); OwningPtr<DIContext> DICtx(DIContext::getDWARFContext(Obj.get()));