diff options
Diffstat (limited to 'COFF')
-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. |