diff options
Diffstat (limited to 'lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp')
-rw-r--r-- | lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp index a05fa750326..0b3f76c19cb 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileBinaryReader.cpp @@ -505,16 +505,14 @@ readBinary(std::unique_ptr<MemoryBuffer> &mb, return std::move(f); } -class MachOReader : public Reader { +class MachOObjectReader : public Reader { public: - MachOReader(MachOLinkingContext &ctx) : _ctx(ctx) {} + 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: - 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); default: return false; @@ -524,30 +522,49 @@ public: std::error_code parseFile(std::unique_ptr<MemoryBuffer> &mb, const Registry ®istry, std::vector<std::unique_ptr<File>> &result) const override { - // Convert binary file to normalized mach-o. - auto normFile = readBinary(mb, _ctx.arch()); - if (std::error_code ec = normFile.getError()) - return ec; - // Convert normalized mach-o to atoms. - auto file = normalizedToAtoms(**normFile, mb->getBufferIdentifier(), false); - if (std::error_code ec = file.getError()) - return ec; + auto *file = new MachOFile(mb.get(), &_ctx); + result.push_back(std::unique_ptr<MachOFile>(file)); + return std::error_code(); + } - result.push_back(std::move(*file)); +private: + MachOLinkingContext &_ctx; +}; +class MachODylibReader : public Reader { +public: + MachODylibReader(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_dynamically_linked_shared_lib: + case llvm::sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: + return (mb.getBufferSize() > 32); + default: + return false; + } + } + + std::error_code + parseFile(std::unique_ptr<MemoryBuffer> &mb, const Registry ®istry, + std::vector<std::unique_ptr<File>> &result) const override { + auto *file = new MachODylibFile(mb.get(), &_ctx); + result.push_back(std::unique_ptr<MachODylibFile>(file)); return std::error_code(); } + private: MachOLinkingContext &_ctx; }; - } // namespace normalized } // namespace mach_o void Registry::addSupportMachOObjects(MachOLinkingContext &ctx) { MachOLinkingContext::Arch arch = ctx.arch(); - add(std::unique_ptr<Reader>(new mach_o::normalized::MachOReader(ctx))); + add(std::unique_ptr<Reader>(new mach_o::normalized::MachOObjectReader(ctx))); + add(std::unique_ptr<Reader>(new mach_o::normalized::MachODylibReader(ctx))); addKindTable(Reference::KindNamespace::mach_o, ctx.archHandler().kindArch(), ctx.archHandler().kindStrings()); add(std::unique_ptr<YamlIOTaggedDocumentHandler>( |