diff options
Diffstat (limited to 'COFF/Driver.cpp')
| -rw-r--r-- | COFF/Driver.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/COFF/Driver.cpp b/COFF/Driver.cpp index 0e7db7b6ae349..1aaec355c7a53 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()) { @@ -245,6 +245,13 @@ void LinkerDriver::parseDirectives(StringRef S) { Config->Entry = addUndefined(mangle(Arg->getValue())); break; case OPT_export: { + // If a common header file contains dllexported function + // declarations, many object files may end up with having the + // same /EXPORT options. In order to save cost of parsing them, + // we dedup them first. + if (!DirectivesExports.insert(Arg->getValue()).second) + break; + Export E = parseExport(Arg->getValue()); if (Config->Machine == I386 && Config->MinGW) { if (!isDecorated(E.Name)) @@ -795,6 +802,13 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) { SearchPaths.push_back(Arg->getValue()); addLibSearchPaths(); + // Handle /ignore + for (auto *Arg : Args.filtered(OPT_ignore)) { + if (StringRef(Arg->getValue()) == "4217") + Config->WarnLocallyDefinedImported = false; + // Other warning numbers are ignored. + } + // Handle /out if (auto *Arg = Args.getLastArg(OPT_out)) Config->OutputFile = Arg->getValue(); |
