diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:17:27 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:17:27 +0000 | 
| commit | 67c32a98315f785a9ec9d531c1f571a0196c7463 (patch) | |
| tree | 4abb9cbeecc7901726dd0b4a37369596c852e9ef /lib/Object/SymbolicFile.cpp | |
| parent | 9f61947910e6ab40de38e6b4034751ef1513200f (diff) | |
Notes
Diffstat (limited to 'lib/Object/SymbolicFile.cpp')
| -rw-r--r-- | lib/Object/SymbolicFile.cpp | 37 | 
1 files changed, 25 insertions, 12 deletions
diff --git a/lib/Object/SymbolicFile.cpp b/lib/Object/SymbolicFile.cpp index 30cf1a03f415..de98a1228cd4 100644 --- a/lib/Object/SymbolicFile.cpp +++ b/lib/Object/SymbolicFile.cpp @@ -19,34 +19,31 @@  using namespace llvm;  using namespace object; -SymbolicFile::SymbolicFile(unsigned int Type, -                           std::unique_ptr<MemoryBuffer> Source) -    : Binary(Type, std::move(Source)) {} +SymbolicFile::SymbolicFile(unsigned int Type, MemoryBufferRef Source) +    : Binary(Type, Source) {}  SymbolicFile::~SymbolicFile() {} -ErrorOr<SymbolicFile *> -SymbolicFile::createSymbolicFile(std::unique_ptr<MemoryBuffer> &Object, -                                 sys::fs::file_magic Type, -                                 LLVMContext *Context) { +ErrorOr<std::unique_ptr<SymbolicFile>> SymbolicFile::createSymbolicFile( +    MemoryBufferRef Object, sys::fs::file_magic Type, LLVMContext *Context) { +  StringRef Data = Object.getBuffer();    if (Type == sys::fs::file_magic::unknown) -    Type = sys::fs::identify_magic(Object->getBuffer()); +    Type = sys::fs::identify_magic(Data);    switch (Type) {    case sys::fs::file_magic::bitcode:      if (Context) -      return IRObjectFile::createIRObjectFile(std::move(Object), *Context); +      return IRObjectFile::create(Object, *Context);    // Fallthrough    case sys::fs::file_magic::unknown:    case sys::fs::file_magic::archive:    case sys::fs::file_magic::macho_universal_binary:    case sys::fs::file_magic::windows_resource:      return object_error::invalid_file_type; -  case sys::fs::file_magic::elf_relocatable: +  case sys::fs::file_magic::elf:    case sys::fs::file_magic::elf_executable:    case sys::fs::file_magic::elf_shared_object:    case sys::fs::file_magic::elf_core: -  case sys::fs::file_magic::macho_object:    case sys::fs::file_magic::macho_executable:    case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:    case sys::fs::file_magic::macho_core: @@ -56,10 +53,26 @@ SymbolicFile::createSymbolicFile(std::unique_ptr<MemoryBuffer> &Object,    case sys::fs::file_magic::macho_bundle:    case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:    case sys::fs::file_magic::macho_dsym_companion: -  case sys::fs::file_magic::coff_object:    case sys::fs::file_magic::coff_import_library:    case sys::fs::file_magic::pecoff_executable:      return ObjectFile::createObjectFile(Object, Type); +  case sys::fs::file_magic::elf_relocatable: +  case sys::fs::file_magic::macho_object: +  case sys::fs::file_magic::coff_object: { +    ErrorOr<std::unique_ptr<ObjectFile>> Obj = +        ObjectFile::createObjectFile(Object, Type); +    if (!Obj || !Context) +      return std::move(Obj); + +    ErrorOr<MemoryBufferRef> BCData = +        IRObjectFile::findBitcodeInObject(*Obj->get()); +    if (!BCData) +      return std::move(Obj); + +    return IRObjectFile::create( +        MemoryBufferRef(BCData->getBuffer(), Object.getBufferIdentifier()), +        *Context); +  }    }    llvm_unreachable("Unexpected Binary File Type");  }  | 
