diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2014-11-24 09:08:18 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2014-11-24 09:08:18 +0000 | 
| commit | 5ca98fd98791947eba83a1ed3f2c8191ef7afa6c (patch) | |
| tree | f5944309621cee4fe0976be6f9ac619b7ebfc4c2 /lib/Object/ObjectFile.cpp | |
| parent | 68bcb7db193e4bc81430063148253d30a791023e (diff) | |
Notes
Diffstat (limited to 'lib/Object/ObjectFile.cpp')
| -rw-r--r-- | lib/Object/ObjectFile.cpp | 47 | 
1 files changed, 27 insertions, 20 deletions
diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index 0e626d650fbb..f5488c6d52db 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -12,23 +12,31 @@  //===----------------------------------------------------------------------===//  #include "llvm/Object/ObjectFile.h" -#include "llvm/ADT/OwningPtr.h"  #include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/FileSystem.h"  #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/system_error.h" +#include "llvm/Support/raw_ostream.h" +#include <system_error>  using namespace llvm;  using namespace object;  void ObjectFile::anchor() { } -ObjectFile::ObjectFile(unsigned int Type, MemoryBuffer *source) -  : Binary(Type, source) { +ObjectFile::ObjectFile(unsigned int Type, std::unique_ptr<MemoryBuffer> Source) +    : SymbolicFile(Type, std::move(Source)) {} + +std::error_code ObjectFile::printSymbolName(raw_ostream &OS, +                                            DataRefImpl Symb) const { +  StringRef Name; +  if (std::error_code EC = getSymbolName(Symb, Name)) +    return EC; +  OS << Name; +  return object_error::success;  } -error_code ObjectFile::getSymbolAlignment(DataRefImpl DRI, -                                          uint32_t &Result) const { +std::error_code ObjectFile::getSymbolAlignment(DataRefImpl DRI, +                                               uint32_t &Result) const {    Result = 0;    return object_error::success;  } @@ -37,21 +45,19 @@ section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const {    return section_iterator(SectionRef(Sec, this));  } -ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { -  if (Object->getBufferSize() < 64) { -    delete Object; -    return 0; -  } +ErrorOr<ObjectFile *> +ObjectFile::createObjectFile(std::unique_ptr<MemoryBuffer> &Object, +                             sys::fs::file_magic Type) { +  if (Type == sys::fs::file_magic::unknown) +    Type = sys::fs::identify_magic(Object->getBuffer()); -  sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer());    switch (Type) {    case sys::fs::file_magic::unknown:    case sys::fs::file_magic::bitcode:    case sys::fs::file_magic::archive:    case sys::fs::file_magic::macho_universal_binary:    case sys::fs::file_magic::windows_resource: -    delete Object; -    return 0; +    return object_error::invalid_file_type;    case sys::fs::file_magic::elf_relocatable:    case sys::fs::file_magic::elf_executable:    case sys::fs::file_magic::elf_shared_object: @@ -71,14 +77,15 @@ ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) {    case sys::fs::file_magic::coff_object:    case sys::fs::file_magic::coff_import_library:    case sys::fs::file_magic::pecoff_executable: -    return createCOFFObjectFile(Object); +    return createCOFFObjectFile(std::move(Object));    }    llvm_unreachable("Unexpected Object File Type");  } -ObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) { -  OwningPtr<MemoryBuffer> File; -  if (MemoryBuffer::getFile(ObjectPath, File)) -    return NULL; -  return createObjectFile(File.take()); +ErrorOr<ObjectFile *> ObjectFile::createObjectFile(StringRef ObjectPath) { +  ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr = +      MemoryBuffer::getFile(ObjectPath); +  if (std::error_code EC = FileOrErr.getError()) +    return EC; +  return createObjectFile(FileOrErr.get());  }  | 
