[MachO] Remove dependency on lldDriver
authorGreg Fitzgerald <garious@gmail.com>
Fri, 23 Jan 2015 23:26:13 +0000 (23:26 +0000)
committerGreg Fitzgerald <garious@gmail.com>
Fri, 23 Jan 2015 23:26:13 +0000 (23:26 +0000)
Moved getMemoryBuffer from DarwnLdDriver to MachOLinkingContext.
lldMachO shared library target now builds.

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

llvm-svn: 226963

lld/include/lld/Driver/Driver.h
lld/include/lld/ReaderWriter/MachOLinkingContext.h
lld/lib/Driver/DarwinLdDriver.cpp
lld/lib/ReaderWriter/MachO/MachOLinkingContext.cpp

index 75717553e48482fd3a59719677998452f4d5bf48..627eb179af7aa80034a225a75f17002c51b404d1 100644 (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;
 };
index c5093c469002b79dfacc3d032f122f77c6a5573f..bdbd91aff50f3dd8cf32f44058370992e3ff4a51 100644 (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.
index 8831fb3960903e3268bfc8348ab5d06173f4a181..2c64aeee38a588f397cd8c75fbf55268166a298d 100644 (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;
index 9fe16108a56896a73af817a3893ab2a31b10d0f8..41da4e7d126f4d5d77c57fa09f9c358aaeae1190 100644 (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;