[MachO] Remove dependency on lldDriver

Moved getMemoryBuffer from DarwnLdDriver to MachOLinkingContext.
lldMachO shared library target now builds.

Differential Review: http://reviews.llvm.org/D7155

llvm-svn: 226963
This commit is contained in:
Greg Fitzgerald 2015-01-23 23:26:13 +00:00
parent 94976f70af
commit b4eb64ef6a
4 changed files with 25 additions and 28 deletions

View File

@ -101,11 +101,6 @@ public:
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<std::unique_ptr<MemoryBuffer>>
getMemoryBuffer(MachOLinkingContext &ctx, StringRef path);
private:
DarwinLdDriver() LLVM_DELETED_FUNCTION;
};

View File

@ -253,6 +253,10 @@ public:
/// 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<std::unique_ptr<MemoryBuffer>> 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.

View File

@ -77,8 +77,7 @@ loadFile(MachOLinkingContext &ctx, StringRef path,
if (ctx.logInputFiles())
diag << path << "\n";
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr =
DarwinLdDriver::getMemoryBuffer(ctx, path);
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr = ctx.getMemoryBuffer(path);
if (std::error_code ec = mbOrErr.getError())
return makeErrorFile(path, ec);
std::vector<std::unique_ptr<File>> files;
@ -264,25 +263,6 @@ static bool parseNumberBase16(StringRef numStr, uint64_t &baseAddress) {
namespace lld {
ErrorOr<std::unique_ptr<MemoryBuffer>>
DarwinLdDriver::getMemoryBuffer(MachOLinkingContext &ctx, StringRef path) {
ctx.addInputFileDependency(path);
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr =
MemoryBuffer::getFileOrSTDIN(path);
if (std::error_code ec = mbOrErr.getError())
return ec;
std::unique_ptr<MemoryBuffer> 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;

View File

@ -605,9 +605,27 @@ Writer &MachOLinkingContext::writer() const {
return *_writer;
}
MachODylibFile* MachOLinkingContext::loadIndirectDylib(StringRef path) {
ErrorOr<std::unique_ptr<MemoryBuffer>>
MachOLinkingContext::getMemoryBuffer(StringRef path) {
addInputFileDependency(path);
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr =
DarwinLdDriver::getMemoryBuffer(*this, path);
MemoryBuffer::getFileOrSTDIN(path);
if (std::error_code ec = mbOrErr.getError())
return ec;
std::unique_ptr<MemoryBuffer> 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<std::unique_ptr<MemoryBuffer>> mbOrErr = getMemoryBuffer(path);
if (mbOrErr.getError())
return nullptr;