<div dir="ltr">I think there's a better way to do the this kind of thing.<div><br></div><div>Linker scripts are now parsed in the driver, so if some information produced by the driver is consumed only by linker scripts, that information doesn't have to be propagated to the linking context object.</div><div><br></div><div>You added two public member functions, ELFLinkingContext::nostdlib and ELFLinkingContext::setNoStdLib (btw the inconsistency in camel case made me a bit unconfortable), but we actually don't need them. We can instead just add a local variable to the Driver, which holds whether -nostdlib is given or not, and pass that variable to evalLinkerScript.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 5, 2015 at 8:15 PM, Shankar Easwaran <span dir="ltr"><<a href="mailto:shankare@codeaurora.org" target="_blank">shankare@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: shankare<br>
Date: Thu Feb  5 22:15:00 2015<br>
New Revision: 228375<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=228375&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=228375&view=rev</a><br>
Log:<br>
[ELF] Fix -nostdlib option.<br>
<br>
Only search library directories explicitly specified<br>
on the command line. Library directories specified in linker<br>
scripts (including linker scripts specified on the command<br>
line) are ignored.<br>
<br>
Modified:<br>
    lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h<br>
    lld/trunk/lib/Driver/GnuLdDriver.cpp<br>
    lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp<br>
    lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp<br>
<br>
Modified: lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=228375&r1=228374&r2=228375&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=228375&r1=228374&r2=228375&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Thu Feb  5 22:15:00 2015<br>
@@ -303,6 +303,10 @@ public:<br>
     _scripts.push_back(std::move(script));<br>
   }<br>
<br>
+  /// \brief nostdlib support.<br>
+  bool nostdlib() const { return _nostdlib; }<br>
+  void setNoStdLib(bool nostdlib) { _nostdlib = nostdlib; }<br>
+<br>
 private:<br>
   ELFLinkingContext() LLVM_DELETED_FUNCTION;<br>
<br>
@@ -328,6 +332,7 @@ protected:<br>
   bool _mergeRODataToTextSegment;<br>
   bool _demangle;<br>
   bool _alignSegments;<br>
+  bool _nostdlib;<br>
   llvm::Optional<uint64_t> _maxPageSize;<br>
<br>
   OutputMagic _outputMagic;<br>
<br>
Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=228375&r1=228374&r2=228375&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=228375&r1=228374&r2=228375&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)<br>
+++ lld/trunk/lib/Driver/GnuLdDriver.cpp Thu Feb  5 22:15:00 2015<br>
@@ -293,7 +293,8 @@ GnuLdDriver::evalLinkerScript(ELFLinking<br>
       ctx.getNodes().push_back(llvm::make_unique<GroupEnd>(groupSize));<br>
     }<br>
     if (auto *searchDir = dyn_cast<script::SearchDir>(c))<br>
-      ctx.addSearchPath(searchDir->getSearchPath());<br>
+      if (!ctx.nostdlib())<br>
+        ctx.addSearchPath(searchDir->getSearchPath());<br>
     if (auto *entry = dyn_cast<script::Entry>(c))<br>
       ctx.setEntrySymbolName(entry->getEntryName());<br>
     if (auto *output = dyn_cast<script::Output>(c))<br>
@@ -386,6 +387,8 @@ bool GnuLdDriver::parse(int argc, const<br>
<br>
   bool _outputOptionSet = false;<br>
<br>
+  bool hasNoStdLib = false;<br>
+<br>
   // Ignore unknown arguments.<br>
   for (auto unknownArg : parsedArgs->filtered(OPT_UNKNOWN))<br>
     diag << "warning: ignoring unknown argument: "<br>
@@ -400,9 +403,12 @@ bool GnuLdDriver::parse(int argc, const<br>
     ctx->addSearchPath(libDir->getValue());<br>
<br>
   // Add the default search directory specific to the target.<br>
-  if (!parsedArgs->hasArg(OPT_nostdlib))<br>
+  if (!(hasNoStdLib = parsedArgs->hasArg(OPT_nostdlib)))<br>
     ctx->addDefaultSearchDirs(baseTriple);<br>
<br>
+  // -nostdlib support.<br>
+  ctx->setNoStdLib(hasNoStdLib);<br>
+<br>
   // Handle --demangle option(For compatibility)<br>
   if (parsedArgs->getLastArg(OPT_demangle))<br>
     ctx->setDemangleSymbols(true);<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp?rev=228375&r1=228374&r2=228375&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp?rev=228375&r1=228374&r2=228375&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp Thu Feb  5 22:15:00 2015<br>
@@ -61,8 +61,8 @@ ELFLinkingContext::ELFLinkingContext(<br>
       _mergeCommonStrings(false), _useShlibUndefines(true),<br>
       _dynamicLinkerArg(false), _noAllowDynamicLibraries(false),<br>
       _mergeRODataToTextSegment(true), _demangle(true), _alignSegments(true),<br>
-      _outputMagic(OutputMagic::DEFAULT), _initFunction("_init"),<br>
-      _finiFunction("_fini"), _sysrootPath("") {}<br>
+      _nostdlib(false), _outputMagic(OutputMagic::DEFAULT),<br>
+      _initFunction("_init"), _finiFunction("_fini"), _sysrootPath("") {}<br>
<br>
 void ELFLinkingContext::addPasses(PassManager &pm) {<br>
   pm.add(std::unique_ptr<Pass>(new elf::OrderPass()));<br>
<br>
Modified: lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp?rev=228375&r1=228374&r2=228375&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp?rev=228375&r1=228374&r2=228375&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp (original)<br>
+++ lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp Thu Feb  5 22:15:00 2015<br>
@@ -29,9 +29,12 @@ protected:<br>
<br>
 class LinkerScriptTest : public testing::Test {<br>
 protected:<br>
-  void parse(StringRef script) {<br>
+  virtual void SetUp() {<br>
     llvm::Triple triple(llvm::sys::getDefaultTargetTriple());<br>
     _ctx = std::move(GnuLdDriver::createELFLinkingContext(triple));<br>
+  }<br>
+<br>
+  void parse(StringRef script) {<br>
     std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(<br>
       script, "foo.so");<br>
     std::string s;<br>
@@ -214,3 +217,11 @@ TEST_F(LinkerScriptTest, Output) {<br>
   parse("OUTPUT(\"/path/to/output\")");<br>
   EXPECT_EQ("/path/to/output", _ctx->outputPath());<br>
 }<br>
+<br>
+// Test that search paths are ignored when nostdlib is set.<br>
+TEST_F(LinkerScriptTest, IgnoreSearchDirNoStdLib) {<br>
+  _ctx->setNoStdLib(true);<br>
+  parse("SEARCH_DIR(\"/foo/bar\")");<br>
+  std::vector<StringRef> paths = _ctx->getSearchPaths();<br>
+  EXPECT_EQ((size_t)0, paths.size());<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>