diff options
Diffstat (limited to 'lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp')
| -rw-r--r-- | lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp b/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp index 07a6dbfe569b0..1013d3ddaef34 100644 --- a/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp +++ b/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp @@ -30,6 +30,7 @@ #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Twine.h" #include "llvm/Object/MachO.h" #include "llvm/Support/Casting.h" @@ -169,9 +170,8 @@ bool isThinObjectFile(StringRef path, MachOLinkingContext::Arch &arch) { return true; } - -bool sliceFromFatFile(const MemoryBuffer &mb, MachOLinkingContext::Arch arch, - uint32_t &offset, uint32_t &size) { +bool sliceFromFatFile(MemoryBufferRef mb, MachOLinkingContext::Arch arch, + uint32_t &offset, uint32_t &size) { const char *start = mb.getBufferStart(); const llvm::MachO::fat_header *fh = reinterpret_cast<const llvm::MachO::fat_header *>(start); @@ -211,7 +211,7 @@ readBinary(std::unique_ptr<MemoryBuffer> &mb, uint32_t sliceOffset; uint32_t sliceSize; - if (sliceFromFatFile(*mb, arch, sliceOffset, sliceSize)) { + if (sliceFromFatFile(mb->getMemBufferRef(), arch, sliceOffset, sliceSize)) { start = &start[sliceOffset]; objSize = sliceSize; mh = reinterpret_cast<const mach_header *>(start); @@ -297,7 +297,7 @@ readBinary(std::unique_ptr<MemoryBuffer> &mb, section.type = (SectionType)(read32(§->flags, isBig) & SECTION_TYPE); section.attributes = read32(§->flags, isBig) & SECTION_ATTRIBUTES; - section.alignment = read32(§->align, isBig); + section.alignment = 1 << read32(§->align, isBig); section.address = read64(§->addr, isBig); const uint8_t *content = (const uint8_t *)start + read32(§->offset, isBig); @@ -341,7 +341,7 @@ readBinary(std::unique_ptr<MemoryBuffer> &mb, SECTION_TYPE); section.attributes = read32((const uint8_t *)§->flags, isBig) & SECTION_ATTRIBUTES; - section.alignment = read32(§->align, isBig); + section.alignment = 1 << read32(§->align, isBig); section.address = read32(§->addr, isBig); const uint8_t *content = (const uint8_t *)start + read32(§->offset, isBig); @@ -516,22 +516,17 @@ class MachOObjectReader : public Reader { public: MachOObjectReader(MachOLinkingContext &ctx) : _ctx(ctx) {} - bool canParse(file_magic magic, StringRef ext, - const MemoryBuffer &mb) const override { - switch (magic) { - case llvm::sys::fs::file_magic::macho_object: - return (mb.getBufferSize() > 32); - default: - return false; - } + bool canParse(file_magic magic, MemoryBufferRef mb) const override { + return (magic == llvm::sys::fs::file_magic::macho_object && + mb.getBufferSize() > 32); } - std::error_code - loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry, - std::vector<std::unique_ptr<File>> &result) const override { - auto *file = new MachOFile(std::move(mb), &_ctx); - result.push_back(std::unique_ptr<MachOFile>(file)); - return std::error_code(); + ErrorOr<std::unique_ptr<File>> + loadFile(std::unique_ptr<MemoryBuffer> mb, + const Registry ®istry) const override { + std::unique_ptr<File> ret = + llvm::make_unique<MachOFile>(std::move(mb), &_ctx); + return std::move(ret); } private: @@ -542,23 +537,22 @@ class MachODylibReader : public Reader { public: MachODylibReader(MachOLinkingContext &ctx) : _ctx(ctx) {} - bool canParse(file_magic magic, StringRef ext, - const MemoryBuffer &mb) const override { + bool canParse(file_magic magic, MemoryBufferRef mb) const override { switch (magic) { case llvm::sys::fs::file_magic::macho_dynamically_linked_shared_lib: case llvm::sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: - return (mb.getBufferSize() > 32); + return mb.getBufferSize() > 32; default: return false; } } - std::error_code - loadFile(std::unique_ptr<MemoryBuffer> mb, const Registry ®istry, - std::vector<std::unique_ptr<File>> &result) const override { - auto *file = new MachODylibFile(std::move(mb), &_ctx); - result.push_back(std::unique_ptr<MachODylibFile>(file)); - return std::error_code(); + ErrorOr<std::unique_ptr<File>> + loadFile(std::unique_ptr<MemoryBuffer> mb, + const Registry ®istry) const override { + std::unique_ptr<File> ret = + llvm::make_unique<MachODylibFile>(std::move(mb), &_ctx); + return std::move(ret); } private: |
