[lld] r195295 - [PECOFF] Move files with ".lib" extension to the end of the input file list.

Shankar Easwaran shankare at codeaurora.org
Wed Nov 20 18:54:19 PST 2013


Hi Rui,

The InputGraph postProcess could be used to reorder input files. It does 
use a stable_sort now, and uses ordinals to rearrange them.

Currently the implementation is not complete, but I think that could be 
improved.

Any thoughts ?

Thanks

Shankar Easwaran
On 11/20/2013 7:08 PM, Rui Ueyama wrote:
> Author: ruiu
> Date: Wed Nov 20 19:08:53 2013
> New Revision: 195295
>
> URL: http://llvm.org/viewvc/llvm-project?rev=195295&view=rev
> Log:
> [PECOFF] Move files with ".lib" extension to the end of the input file list.
>
> It's allowed to specify library files *before* object files in the command
> line. Object files seems to be processed first, and then their undefined
> symbols are resolved from the libraries. This patch implements the compatible
> behavior.
>
> Modified:
>      lld/trunk/lib/Driver/WinLinkDriver.cpp
>      lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
>
> Modified: lld/trunk/lib/Driver/WinLinkDriver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Driver/WinLinkDriver.cpp?rev=195295&r1=195294&r2=195295&view=diff
> ==============================================================================
> --- lld/trunk/lib/Driver/WinLinkDriver.cpp (original)
> +++ lld/trunk/lib/Driver/WinLinkDriver.cpp Wed Nov 20 19:08:53 2013
> @@ -13,6 +13,7 @@
>   ///
>   //===----------------------------------------------------------------------===//
>   
> +#include <algorithm>
>   #include <cctype>
>   #include <sstream>
>   #include <map>
> @@ -600,6 +601,8 @@ WinLinkDriver::parse(int argc, const cha
>       defaultLibs.push_back((*it)->getValue());
>     }
>   
> +  std::vector<StringRef> inputFiles;
> +
>     // Process all the arguments and create Input Elements
>     for (auto inputArg : *parsedArgs) {
>       switch (inputArg->getOption().getID()) {
> @@ -850,8 +853,7 @@ WinLinkDriver::parse(int argc, const cha
>         break;
>   
>       case OPT_INPUT:
> -      inputElements.push_back(std::unique_ptr<InputElement>(
> -          new PECOFFFileNode(ctx, ctx.allocate(inputArg->getValue()))));
> +      inputFiles.push_back(ctx.allocate(inputArg->getValue()));
>         break;
>   
>   #define DEFINE_BOOLEAN_FLAG(name, setter)       \
> @@ -877,6 +879,17 @@ WinLinkDriver::parse(int argc, const cha
>       }
>     }
>   
> +  // Move files with ".lib" extension at the end of the input file list. Say
> +  // foo.obj depends on bar.lib. The linker needs to accept both "bar.lib
> +  // foo.obj" and "foo.obj bar.lib".
> +  auto compfn = [](StringRef a, StringRef b) {
> +    return !a.endswith_lower(".lib") && b.endswith_lower(".lib");
> +  };
> +  std::stable_sort(inputFiles.begin(), inputFiles.end(), compfn);
> +  for (StringRef path : inputFiles)
> +    inputElements.push_back(std::unique_ptr<InputElement>(
> +        new PECOFFFileNode(ctx, path)));
> +
>     // Use the default entry name if /entry option is not given.
>     if (ctx.entrySymbolName().empty())
>       ctx.setEntrySymbolName(getDefaultEntrySymbolName(ctx));
>
> Modified: lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp?rev=195295&r1=195294&r2=195295&view=diff
> ==============================================================================
> --- lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp (original)
> +++ lld/trunk/unittests/DriverTests/WinLinkDriverTest.cpp Wed Nov 20 19:08:53 2013
> @@ -131,6 +131,21 @@ TEST_F(WinLinkParserTest, Libpath) {
>   }
>   
>   //
> +// Tests for input file order
> +//
> +
> +TEST_F(WinLinkParserTest, InputOrder) {
> +  EXPECT_TRUE(parse("link.exe", "b.lib", "b.obj", "c.obj", "a.lib", "a.obj",
> +                    nullptr));
> +  EXPECT_EQ(5, inputFileCount());
> +  EXPECT_EQ("b.obj", inputFile(0));
> +  EXPECT_EQ("c.obj", inputFile(1));
> +  EXPECT_EQ("a.obj", inputFile(2));
> +  EXPECT_EQ("b.lib", inputFile(3));
> +  EXPECT_EQ("a.lib", inputFile(4));
> +}
> +
> +//
>   // Tests for command line options that take values.
>   //
>   
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-commits mailing list