<div dir="ltr">+davide<div><br></div><div>I thought that you needed someone to commit this, since you didn't commit the patch after it was approved, but I see now that you do have commit access. My bad. Anyway I only made some tab/spaces adjustments and implemented Ruiu's minor observations. Thanks for the patch!</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 31, 2015 at 8:42 PM, Rafael Auler <span dir="ltr"><<a href="mailto:rafaelauler@gmail.com" target="_blank">rafaelauler@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafauler<br>
Date: Sat Jan 31 16:42:19 2015<br>
New Revision: 227694<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=227694&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=227694&view=rev</a><br>
Log:<br>
Implement semantic action for SEARCH_DIR linker script command<br>
<br>
This is needed, among others by the FreeBSD kernel linker script.<br>
<br>
Patch by Davide Italiano!<br>
<br>
Reviewers: ruiu, rafaelauler<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D7220" target="_blank">http://reviews.llvm.org/D7220</a><br>
<br>
<br>
Modified:<br>
    lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h<br>
    lld/trunk/lib/Driver/GnuLdDriver.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=227694&r1=227693&r2=227694&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=227694&r1=227693&r2=227694&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)<br>
+++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Sat Jan 31 16:42:19 2015<br>
@@ -268,6 +268,9 @@ public:<br>
     return true;<br>
   }<br>
<br>
+  // Retrieve search path list.<br>
+  StringRefVector getSearchPaths() { return _inputSearchPaths; };<br>
+<br>
   // By default, the linker would merge sections that are read only with<br>
   // segments that have read and execute permissions. When the user specifies a<br>
   // flag --rosegment, a separate segment needs to be created.<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=227694&r1=227693&r2=227694&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=227694&r1=227693&r2=227694&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)<br>
+++ lld/trunk/lib/Driver/GnuLdDriver.cpp Sat Jan 31 16:42:19 2015<br>
@@ -280,11 +280,16 @@ GnuLdDriver::evalLinkerScript(ELFLinking<br>
   if (!script)<br>
     return LinkerScriptReaderError::parse_error;<br>
   // Evaluate script commands.<br>
-  // Currently we only recognize GROUP() command.<br>
-  for (const script::Command *c : script->_commands)<br>
+  // Currently we only recognize this subset of linker script commands:<br>
+  // - GROUP()<br>
+  // - SEARCH_DIR()<br>
+  for (const script::Command *c : script->_commands) {<br>
     if (auto *group = dyn_cast<script::Group>(c))<br>
       if (std::error_code ec = evaluateLinkerScriptGroup(ctx, path, group, diag))<br>
         return ec;<br>
+    if (auto *searchDir = dyn_cast<script::SearchDir>(c))<br>
+      ctx.addSearchPath(searchDir->getSearchPath());<br>
+  }<br>
   return std::error_code();<br>
 }<br>
<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=227694&r1=227693&r2=227694&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp?rev=227694&r1=227693&r2=227694&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp (original)<br>
+++ lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp Sat Jan 31 16:42:19 2015<br>
@@ -177,3 +177,17 @@ TEST_F(GnuLdParserTest, LinkerScriptGrou<br>
   EXPECT_EQ("/y", cast<FileNode>(nodes[2].get())->getFile()->path());<br>
   EXPECT_EQ(2, cast<GroupEnd>(nodes[3].get())->getSize());<br>
 }<br>
+<br>
+TEST_F(GnuLdParserTest, LinkerScriptSearchDir) {<br>
+  parse("ld", "a.o", nullptr);<br>
+  std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(<br>
+    "SEARCH_DIR(\"/foo/bar\")", "foo.so");<br>
+  std::string s;<br>
+  raw_string_ostream out(s);<br>
+  std::error_code ec = GnuLdDriver::evalLinkerScript(<br>
+    *_context, std::move(mb), out);<br>
+  EXPECT_FALSE(ec);<br>
+  std::vector<StringRef> searchPaths = _context->getSearchPaths();<br>
+  EXPECT_EQ((size_t)2, searchPaths.size());<br>
+  EXPECT_EQ("/foo/bar", searchPaths[1]);<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>