Fix shared library build
authorGreg Fitzgerald <garious@gmail.com>
Mon, 26 Jan 2015 20:46:47 +0000 (20:46 +0000)
committerGreg Fitzgerald <garious@gmail.com>
Mon, 26 Jan 2015 20:46:47 +0000 (20:46 +0000)
* Removed cyclic dependency between lldPECOFF and lldDriver
* Added missing dependencies in unit tests

Differential Revision: http://reviews.llvm.org/D7185

llvm-svn: 227134

lld/include/lld/Driver/Driver.h
lld/include/lld/ReaderWriter/PECOFFLinkingContext.h
lld/lib/Driver/WinLinkDriver.cpp
lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
lld/tools/lld/CMakeLists.txt
lld/unittests/DriverTests/CMakeLists.txt

index 627eb17..b42ea3a 100644 (file)
@@ -120,6 +120,14 @@ public:
                     bool isDirective = false,
                     std::set<StringRef> *undefinedSymbols = nullptr);
 
+  // Same as parse(), but restricted to the context of directives.
+  static bool parseDirectives(int argc, const char *argv[],
+                    PECOFFLinkingContext &info,
+                    raw_ostream &diagnostics = llvm::errs(),
+                    std::set<StringRef> *undefinedSymbols = nullptr) {
+    return parse(argc, argv, info, diagnostics, true, undefinedSymbols);
+  }
+
 private:
   WinLinkDriver() LLVM_DELETED_FUNCTION;
 };
index f3bb911..e2c5ea1 100644 (file)
@@ -47,7 +47,8 @@ public:
         _manifestUAC(true), _manifestLevel("'asInvoker'"),
         _manifestUiAccess("'false'"), _isDll(false), _highEntropyVA(true),
         _requireSEH(false), _noSEH(false), _implib(""), _debug(false),
-        _pdbFilePath(""), _dosStub(llvm::makeArrayRef(DEFAULT_DOS_STUB)) {
+        _pdbFilePath(""), _dosStub(llvm::makeArrayRef(DEFAULT_DOS_STUB)),
+        _parseDirectives(nullptr) {
     setDeadStripping(true);
   }
 
@@ -82,6 +83,9 @@ public:
     bool isPrivate;
   };
 
+  typedef bool (*ParseDirectives)(int, const char **, PECOFFLinkingContext &,
+                                  raw_ostream &, std::set<StringRef> *);
+
   /// \brief Casting support
   static inline bool classof(const LinkingContext *info) { return true; }
 
@@ -326,6 +330,14 @@ public:
 
   std::recursive_mutex &getMutex() { return _mutex; }
 
+  void setParseDirectives(ParseDirectives parseDirectives) {
+    _parseDirectives = parseDirectives;
+  }
+
+  ParseDirectives getParseDirectives() {
+    return _parseDirectives;
+  }
+
 protected:
   /// Method to create a internal file for the entry symbol
   std::unique_ptr<File> createEntrySymbolFile() const override;
@@ -440,6 +452,8 @@ private:
 
   std::set<std::string> _definedSyms;
   std::set<Node *> _seen;
+
+  ParseDirectives _parseDirectives;
 };
 
 } // end namespace lld
index 826bfe2..80524d3 100644 (file)
@@ -855,6 +855,7 @@ bool WinLinkDriver::linkPECOFF(int argc, const char **argv, raw_ostream &diag) {
     return true;
 
   PECOFFLinkingContext ctx;
+  ctx.setParseDirectives(parseDirectives);
   ctx.registry().addSupportCOFFObjects(ctx);
   ctx.registry().addSupportCOFFImportLibraries(ctx);
   ctx.registry().addSupportArchives(ctx.logInputFiles());
index 92dc528..f79a243 100644 (file)
@@ -910,9 +910,10 @@ FileCOFF::parseDirectiveSection(StringRef directives,
   const char **argv = &tokens[0];
   std::string errorMessage;
   llvm::raw_string_ostream stream(errorMessage);
-  bool parseFailed = !WinLinkDriver::parse(argc, argv, _ctx, stream,
-                                           /*isDirective*/ true,
-                                           undefinedSymbols);
+  PECOFFLinkingContext::ParseDirectives parseDirectives =
+    _ctx.getParseDirectives();
+  bool parseFailed = !parseDirectives(argc, argv, _ctx, stream,
+                                      undefinedSymbols);
   stream.flush();
   // Print error message if error.
   if (parseFailed) {
index c0c154a..47f26b5 100644 (file)
@@ -4,6 +4,7 @@ add_llvm_executable(lld
 
 target_link_libraries(lld
   lldDriver
+  LLVMSupport
   )
 
 install(TARGETS lld
index 11edf34..59d56d4 100644 (file)
@@ -8,4 +8,7 @@ add_lld_unittest(DriverTests
 
 target_link_libraries(DriverTests
   lldDriver
+  lldCore
+  lldPECOFF
+  lldMachO
   )