aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2017-12-27 06:08:10 +0000
committerRui Ueyama <ruiu@google.com>2017-12-27 06:08:10 +0000
commitb6f00e19ef679189675daca9dde4a9b2c18b6df6 (patch)
tree37fbbcaf7102dd0272478f961ae14c7cc13c60a6
parent565a3b23e1ba7917eb04934902ee59bba73f112f (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.cpp2
-rw-r--r--COFF/Driver.h4
-rw-r--r--COFF/DriverUtils.cpp16
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.