[lld] r228375 - [ELF] Fix -nostdlib option.

Rui Ueyama ruiu at google.com
Thu Feb 5 20:42:14 PST 2015


I think there's a better way to do the this kind of thing.

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.

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.

On Thu, Feb 5, 2015 at 8:15 PM, Shankar Easwaran <shankare at codeaurora.org>
wrote:

> Author: shankare
> Date: Thu Feb  5 22:15:00 2015
> New Revision: 228375
>
> URL: http://llvm.org/viewvc/llvm-project?rev=228375&view=rev
> Log:
> [ELF] Fix -nostdlib option.
>
> Only search library directories explicitly specified
> on the command line. Library directories specified in linker
> scripts (including linker scripts specified on the command
> line) are ignored.
>
> Modified:
>     lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
>     lld/trunk/lib/Driver/GnuLdDriver.cpp
>     lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.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=228375&r1=228374&r2=228375&view=diff
>
> ==============================================================================
> --- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)
> +++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Thu Feb  5
> 22:15:00 2015
> @@ -303,6 +303,10 @@ public:
>      _scripts.push_back(std::move(script));
>    }
>
> +  /// \brief nostdlib support.
> +  bool nostdlib() const { return _nostdlib; }
> +  void setNoStdLib(bool nostdlib) { _nostdlib = nostdlib; }
> +
>  private:
>    ELFLinkingContext() LLVM_DELETED_FUNCTION;
>
> @@ -328,6 +332,7 @@ protected:
>    bool _mergeRODataToTextSegment;
>    bool _demangle;
>    bool _alignSegments;
> +  bool _nostdlib;
>    llvm::Optional<uint64_t> _maxPageSize;
>
>    OutputMagic _outputMagic;
>
> Modified: lld/trunk/lib/Driver/GnuLdDriver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/GnuLdDriver.cpp?rev=228375&r1=228374&r2=228375&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/Driver/GnuLdDriver.cpp (original)
> +++ lld/trunk/lib/Driver/GnuLdDriver.cpp Thu Feb  5 22:15:00 2015
> @@ -293,7 +293,8 @@ GnuLdDriver::evalLinkerScript(ELFLinking
>        ctx.getNodes().push_back(llvm::make_unique<GroupEnd>(groupSize));
>      }
>      if (auto *searchDir = dyn_cast<script::SearchDir>(c))
> -      ctx.addSearchPath(searchDir->getSearchPath());
> +      if (!ctx.nostdlib())
> +        ctx.addSearchPath(searchDir->getSearchPath());
>      if (auto *entry = dyn_cast<script::Entry>(c))
>        ctx.setEntrySymbolName(entry->getEntryName());
>      if (auto *output = dyn_cast<script::Output>(c))
> @@ -386,6 +387,8 @@ bool GnuLdDriver::parse(int argc, const
>
>    bool _outputOptionSet = false;
>
> +  bool hasNoStdLib = false;
> +
>    // Ignore unknown arguments.
>    for (auto unknownArg : parsedArgs->filtered(OPT_UNKNOWN))
>      diag << "warning: ignoring unknown argument: "
> @@ -400,9 +403,12 @@ bool GnuLdDriver::parse(int argc, const
>      ctx->addSearchPath(libDir->getValue());
>
>    // Add the default search directory specific to the target.
> -  if (!parsedArgs->hasArg(OPT_nostdlib))
> +  if (!(hasNoStdLib = parsedArgs->hasArg(OPT_nostdlib)))
>      ctx->addDefaultSearchDirs(baseTriple);
>
> +  // -nostdlib support.
> +  ctx->setNoStdLib(hasNoStdLib);
> +
>    // Handle --demangle option(For compatibility)
>    if (parsedArgs->getLastArg(OPT_demangle))
>      ctx->setDemangleSymbols(true);
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp?rev=228375&r1=228374&r2=228375&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/ELFLinkingContext.cpp Thu Feb  5
> 22:15:00 2015
> @@ -61,8 +61,8 @@ ELFLinkingContext::ELFLinkingContext(
>        _mergeCommonStrings(false), _useShlibUndefines(true),
>        _dynamicLinkerArg(false), _noAllowDynamicLibraries(false),
>        _mergeRODataToTextSegment(true), _demangle(true),
> _alignSegments(true),
> -      _outputMagic(OutputMagic::DEFAULT), _initFunction("_init"),
> -      _finiFunction("_fini"), _sysrootPath("") {}
> +      _nostdlib(false), _outputMagic(OutputMagic::DEFAULT),
> +      _initFunction("_init"), _finiFunction("_fini"), _sysrootPath("") {}
>
>  void ELFLinkingContext::addPasses(PassManager &pm) {
>    pm.add(std::unique_ptr<Pass>(new elf::OrderPass()));
>
> Modified: lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp?rev=228375&r1=228374&r2=228375&view=diff
>
> ==============================================================================
> --- lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp (original)
> +++ lld/trunk/unittests/DriverTests/GnuLdDriverTest.cpp Thu Feb  5
> 22:15:00 2015
> @@ -29,9 +29,12 @@ protected:
>
>  class LinkerScriptTest : public testing::Test {
>  protected:
> -  void parse(StringRef script) {
> +  virtual void SetUp() {
>      llvm::Triple triple(llvm::sys::getDefaultTargetTriple());
>      _ctx = std::move(GnuLdDriver::createELFLinkingContext(triple));
> +  }
> +
> +  void parse(StringRef script) {
>      std::unique_ptr<MemoryBuffer> mb = MemoryBuffer::getMemBuffer(
>        script, "foo.so");
>      std::string s;
> @@ -214,3 +217,11 @@ TEST_F(LinkerScriptTest, Output) {
>    parse("OUTPUT(\"/path/to/output\")");
>    EXPECT_EQ("/path/to/output", _ctx->outputPath());
>  }
> +
> +// Test that search paths are ignored when nostdlib is set.
> +TEST_F(LinkerScriptTest, IgnoreSearchDirNoStdLib) {
> +  _ctx->setNoStdLib(true);
> +  parse("SEARCH_DIR(\"/foo/bar\")");
> +  std::vector<StringRef> paths = _ctx->getSearchPaths();
> +  EXPECT_EQ((size_t)0, paths.size());
> +}
>
>
> _______________________________________________
> 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/20150205/600bee18/attachment.html>


More information about the llvm-commits mailing list