Index: include/lld/Driver/Driver.h =================================================================== --- include/lld/Driver/Driver.h +++ include/lld/Driver/Driver.h @@ -101,11 +101,6 @@ static bool parse(int argc, const char *argv[], MachOLinkingContext &info, raw_ostream &diagnostics = llvm::errs()); - // Reads a file from disk to memory. Returns only a needed chunk - // if a fat binary. - static ErrorOr> - getMemoryBuffer(MachOLinkingContext &ctx, StringRef path); - private: DarwinLdDriver() LLVM_DELETED_FUNCTION; }; Index: include/lld/ReaderWriter/MachOLinkingContext.h =================================================================== --- include/lld/ReaderWriter/MachOLinkingContext.h +++ include/lld/ReaderWriter/MachOLinkingContext.h @@ -253,6 +253,10 @@ /// Used to keep track of direct and indirect dylibs. void registerDylib(mach_o::MachODylibFile *dylib, bool upward) const; + // Reads a file from disk to memory. Returns only a needed chunk + // if a fat binary. + ErrorOr> getMemoryBuffer(StringRef path); + /// Used to find indirect dylibs. Instantiates a MachODylibFile if one /// has not already been made for the requested dylib. Uses -L and -F /// search paths to allow indirect dylibs to be overridden. Index: lib/Driver/DarwinLdDriver.cpp =================================================================== --- lib/Driver/DarwinLdDriver.cpp +++ lib/Driver/DarwinLdDriver.cpp @@ -77,8 +77,7 @@ if (ctx.logInputFiles()) diag << path << "\n"; - ErrorOr> mbOrErr = - DarwinLdDriver::getMemoryBuffer(ctx, path); + ErrorOr> mbOrErr = ctx.getMemoryBuffer(path); if (std::error_code ec = mbOrErr.getError()) return makeErrorFile(path, ec); std::vector> files; @@ -264,25 +263,6 @@ namespace lld { -ErrorOr> -DarwinLdDriver::getMemoryBuffer(MachOLinkingContext &ctx, StringRef path) { - ctx.addInputFileDependency(path); - - ErrorOr> mbOrErr = - MemoryBuffer::getFileOrSTDIN(path); - if (std::error_code ec = mbOrErr.getError()) - return ec; - std::unique_ptr mb = std::move(mbOrErr.get()); - - // If buffer contains a fat file, find required arch in fat buffer - // and switch buffer to point to just that required slice. - uint32_t offset; - uint32_t size; - if (ctx.sliceFromFatFile(*mb, offset, size)) - return MemoryBuffer::getFileSlice(path, size, offset); - return std::move(mb); -} - bool DarwinLdDriver::linkMachO(int argc, const char *argv[], raw_ostream &diagnostics) { MachOLinkingContext ctx; Index: lib/ReaderWriter/MachO/MachOLinkingContext.cpp =================================================================== --- lib/ReaderWriter/MachO/MachOLinkingContext.cpp +++ lib/ReaderWriter/MachO/MachOLinkingContext.cpp @@ -605,9 +605,27 @@ return *_writer; } -MachODylibFile* MachOLinkingContext::loadIndirectDylib(StringRef path) { +ErrorOr> +MachOLinkingContext::getMemoryBuffer(StringRef path) { + addInputFileDependency(path); + ErrorOr> mbOrErr = - DarwinLdDriver::getMemoryBuffer(*this, path); + MemoryBuffer::getFileOrSTDIN(path); + if (std::error_code ec = mbOrErr.getError()) + return ec; + std::unique_ptr mb = std::move(mbOrErr.get()); + + // If buffer contains a fat file, find required arch in fat buffer + // and switch buffer to point to just that required slice. + uint32_t offset; + uint32_t size; + if (sliceFromFatFile(*mb, offset, size)) + return MemoryBuffer::getFileSlice(path, size, offset); + return std::move(mb); +} + +MachODylibFile* MachOLinkingContext::loadIndirectDylib(StringRef path) { + ErrorOr> mbOrErr = getMemoryBuffer(path); if (mbOrErr.getError()) return nullptr;