diff options
author | Rui Ueyama <ruiu@google.com> | 2017-12-27 06:08:10 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2017-12-27 06:08:10 +0000 |
commit | b6f00e19ef679189675daca9dde4a9b2c18b6df6 (patch) | |
tree | 37fbbcaf7102dd0272478f961ae14c7cc13c60a6 | |
parent | 565a3b23e1ba7917eb04934902ee59bba73f112f (diff) |
[COFF] Do not parse args twice if no rsp files exists
Patch by Takuto Ikuta.
This patch reduces link time of chromium's blink_core.dll in component
build. Total size of input argument in .directives become nearly 300MB
in the build and no rsp file is used. Speedup link by skipping duplicate
parsing.
On my desktop machine, 4 times stats are like below. Improved around 15%.
This patch
TotalSeconds : 18.408538
TotalSeconds : 17.2996744
TotalSeconds : 17.1053862
TotalSeconds : 17.809777
avg: 17.6558439
master
TotalSeconds : 20.9290504
TotalSeconds : 19.9158213
TotalSeconds : 21.0643515
TotalSeconds : 20.8775831
avg: 20.696701575
Differential Revision: https://reviews.llvm.org/D41581
git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@321470 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | COFF/Driver.cpp | 2 | ||||
-rw-r--r-- | COFF/Driver.h | 4 | ||||
-rw-r--r-- | COFF/DriverUtils.cpp | 16 |
3 files changed, 21 insertions, 1 deletions
diff --git a/COFF/Driver.cpp b/COFF/Driver.cpp index 0e7db7b6a..8be44cf2c 100644 --- a/COFF/Driver.cpp +++ b/COFF/Driver.cpp @@ -227,7 +227,7 @@ static bool isDecorated(StringRef Sym) { void LinkerDriver::parseDirectives(StringRef S) { ArgParser Parser; // .drectve is always tokenized using Windows shell rules. - opt::InputArgList Args = Parser.parse(S); + opt::InputArgList Args = Parser.parseDirectives(S); for (auto *Arg : Args) { switch (Arg->getOption().getUnaliasedOption().getID()) { diff --git a/COFF/Driver.h b/COFF/Driver.h index 63d41cf69..6a8518060 100644 --- a/COFF/Driver.h +++ b/COFF/Driver.h @@ -54,6 +54,10 @@ public: // Tokenizes a given string and then parses as command line options. llvm::opt::InputArgList parse(StringRef S) { return parse(tokenize(S)); } + // Tokenizes a given string and then parses as command line options in + // .drectve section. + llvm::opt::InputArgList parseDirectives(StringRef S); + private: // Parses command line options. llvm::opt::InputArgList parse(llvm::ArrayRef<const char *> Args); diff --git a/COFF/DriverUtils.cpp b/COFF/DriverUtils.cpp index 07783b51c..e0641e04a 100644 --- a/COFF/DriverUtils.cpp +++ b/COFF/DriverUtils.cpp @@ -750,6 +750,22 @@ opt::InputArgList ArgParser::parse(ArrayRef<const char *> Argv) { return Args; } +// Tokenizes and parses a given string as command line in .drective section. +opt::InputArgList ArgParser::parseDirectives(StringRef S) { + // Make InputArgList from string vectors. + unsigned MissingIndex; + unsigned MissingCount; + + opt::InputArgList Args = + Table.ParseArgs(tokenize(S), MissingIndex, MissingCount); + + if (MissingCount) + fatal(Twine(Args.getArgString(MissingIndex)) + ": missing argument"); + for (auto *Arg : Args.filtered(OPT_UNKNOWN)) + warn("ignoring unknown argument: " + Arg->getSpelling()); + return Args; +} + // link.exe has an interesting feature. If LINK or _LINK_ environment // variables exist, their contents are handled as command line strings. // So you can pass extra arguments using them. |