[lld] r227694 - Implement semantic action for SEARCH_DIR linker script command

Rafael Auler rafaelauler at gmail.com
Sat Jan 31 14:53:52 PST 2015


+davide

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!

On Sat, Jan 31, 2015 at 8:42 PM, Rafael Auler <rafaelauler at gmail.com> wrote:

> Author: rafauler
> Date: Sat Jan 31 16:42:19 2015
> New Revision: 227694
>
> URL: http://llvm.org/viewvc/llvm-project?rev=227694&view=rev
> Log:
> Implement semantic action for SEARCH_DIR linker script command
>
> This is needed, among others by the FreeBSD kernel linker script.
>
> Patch by Davide Italiano!
>
> Reviewers: ruiu, rafaelauler
>
> Differential Revision: http://reviews.llvm.org/D7220
>
>
> Modified:
>     lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
>     lld/trunk/lib/Driver/GnuLdDriver.cpp
>     lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp
>
> Modified: lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=227694&r1=227693&r2=227694&view=diff
>
> ==============================================================================
> --- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)
> +++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Sat Jan 31
> 16:42:19 2015
> @@ -268,6 +268,9 @@ public:
>      return true;
>    }
>
> +  // Retrieve search path list.
> +  StringRefVector getSearchPaths() { return _inputSearchPaths; };
> +
>    // By default, the linker would merge sections that are read only with
>    // segments that have read and execute permissions. When the user
> specifies a
>    // flag --rosegment, a separate segment needs to be created.
>
> Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=227694&r1=227693&r2=227694&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)
> +++ lld/trunk/lib/Driver/GnuLdDriver.cpp Sat Jan 31 16:42:19 2015
> @@ -280,11 +280,16 @@ GnuLdDriver::evalLinkerScript(ELFLinking
>    if (!script)
>      return LinkerScriptReaderError::parse_error;
>    // Evaluate script commands.
> -  // Currently we only recognize GROUP() command.
> -  for (const script::Command *c : script->_commands)
> +  // Currently we only recognize this subset of linker script commands:
> +  // - GROUP()
> +  // - SEARCH_DIR()
> +  for (const script::Command *c : script->_commands) {
>      if (auto *group = dyn_cast<script::Group>(c))
>        if (std::error_code ec = evaluateLinkerScriptGroup(ctx, path,
> group, diag))
>          return ec;
> +    if (auto *searchDir = dyn_cast<script::SearchDir>(c))
> +      ctx.addSearchPath(searchDir->getSearchPath());
> +  }
>    return std::error_code();
>  }
>
>
> Modified: lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp?rev=227694&r1=227693&r2=227694&view=diff
>
> ==============================================================================
> --- lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp (original)
> +++ lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp Sat Jan 31
> 16:42:19 2015
> @@ -177,3 +177,17 @@ TEST_F(GnuLdParserTest, LinkerScriptGrou
>    EXPECT_EQ("/y", cast<FileNode>(nodes[2].get())->getFile()->path());
>    EXPECT_EQ(2, cast<GroupEnd>(nodes[3].get())->getSize());
>  }
> +
> +TEST_F(GnuLdParserTest, LinkerScriptSearchDir) {
> +  parse("ld", "a.o", nullptr);
> +  std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(
> +    "SEARCH_DIR(\"/foo/bar\")", "foo.so");
> +  std::string s;
> +  raw_string_ostream out(s);
> +  std::error_code ec = GnuLdDriver::evalLinkerScript(
> +    *_context, std::move(mb), out);
> +  EXPECT_FALSE(ec);
> +  std::vector<StringRef> searchPaths = _context->getSearchPaths();
> +  EXPECT_EQ((size_t)2, searchPaths.size());
> +  EXPECT_EQ("/foo/bar", searchPaths[1]);
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150131/bb0567df/attachment.html>


More information about the llvm-commits mailing list