forked from OSchip/llvm-project
[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:
parent
94976f70af
commit
b4eb64ef6a
|
@ -101,11 +101,6 @@ public:
|
||||||
static bool parse(int argc, const char *argv[], MachOLinkingContext &info,
|
static bool parse(int argc, const char *argv[], MachOLinkingContext &info,
|
||||||
raw_ostream &diagnostics = llvm::errs());
|
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:
|
private:
|
||||||
DarwinLdDriver() LLVM_DELETED_FUNCTION;
|
DarwinLdDriver() LLVM_DELETED_FUNCTION;
|
||||||
};
|
};
|
||||||
|
|
|
@ -253,6 +253,10 @@ public:
|
||||||
/// Used to keep track of direct and indirect dylibs.
|
/// Used to keep track of direct and indirect dylibs.
|
||||||
void registerDylib(mach_o::MachODylibFile *dylib, bool upward) const;
|
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
|
/// Used to find indirect dylibs. Instantiates a MachODylibFile if one
|
||||||
/// has not already been made for the requested dylib. Uses -L and -F
|
/// has not already been made for the requested dylib. Uses -L and -F
|
||||||
/// search paths to allow indirect dylibs to be overridden.
|
/// search paths to allow indirect dylibs to be overridden.
|
||||||
|
|
|
@ -77,8 +77,7 @@ loadFile(MachOLinkingContext &ctx, StringRef path,
|
||||||
if (ctx.logInputFiles())
|
if (ctx.logInputFiles())
|
||||||
diag << path << "\n";
|
diag << path << "\n";
|
||||||
|
|
||||||
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr =
|
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr = ctx.getMemoryBuffer(path);
|
||||||
DarwinLdDriver::getMemoryBuffer(ctx, path);
|
|
||||||
if (std::error_code ec = mbOrErr.getError())
|
if (std::error_code ec = mbOrErr.getError())
|
||||||
return makeErrorFile(path, ec);
|
return makeErrorFile(path, ec);
|
||||||
std::vector<std::unique_ptr<File>> files;
|
std::vector<std::unique_ptr<File>> files;
|
||||||
|
@ -264,25 +263,6 @@ static bool parseNumberBase16(StringRef numStr, uint64_t &baseAddress) {
|
||||||
|
|
||||||
namespace lld {
|
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[],
|
bool DarwinLdDriver::linkMachO(int argc, const char *argv[],
|
||||||
raw_ostream &diagnostics) {
|
raw_ostream &diagnostics) {
|
||||||
MachOLinkingContext ctx;
|
MachOLinkingContext ctx;
|
||||||
|
|
|
@ -605,9 +605,27 @@ Writer &MachOLinkingContext::writer() const {
|
||||||
return *_writer;
|
return *_writer;
|
||||||
}
|
}
|
||||||
|
|
||||||
MachODylibFile* MachOLinkingContext::loadIndirectDylib(StringRef path) {
|
ErrorOr<std::unique_ptr<MemoryBuffer>>
|
||||||
|
MachOLinkingContext::getMemoryBuffer(StringRef path) {
|
||||||
|
addInputFileDependency(path);
|
||||||
|
|
||||||
ErrorOr<std::unique_ptr<MemoryBuffer>> mbOrErr =
|
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())
|
if (mbOrErr.getError())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue