COFF: /OPT should accept comma-separated multiple arguments.

/OPT:foo,bar is equivalent to /OPT:foo /OPT:bar.

Reported by alexchandel. https://llvm.org/bugs/show_bug.cgi?id=25228

llvm-svn: 250728
This commit is contained in:
Rui Ueyama 2015-10-19 19:40:43 +00:00
parent 45ca5dada1
commit 75656eebb8
2 changed files with 35 additions and 28 deletions

View File

@ -361,7 +361,10 @@ void LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
// Handle /opt // Handle /opt
for (auto *Arg : Args.filtered(OPT_opt)) { for (auto *Arg : Args.filtered(OPT_opt)) {
std::string S = StringRef(Arg->getValue()).lower(); std::string Str = StringRef(Arg->getValue()).lower();
SmallVector<StringRef, 1> Vec;
StringRef(Str).split(Vec, ',');
for (StringRef S : Vec) {
if (S == "noref") { if (S == "noref") {
Config->DoGC = false; Config->DoGC = false;
Config->DoICF = false; Config->DoICF = false;
@ -391,6 +394,7 @@ void LinkerDriver::link(llvm::ArrayRef<const char *> ArgsArr) {
if (S != "ref" && S != "lbr" && S != "nolbr") if (S != "ref" && S != "lbr" && S != "nolbr")
error(Twine("/opt: unknown option: ") + S); error(Twine("/opt: unknown option: ") + S);
} }
}
// Handle /failifmismatch // Handle /failifmismatch
for (auto *Arg : Args.filtered(OPT_failifmismatch)) for (auto *Arg : Args.filtered(OPT_failifmismatch))

View File

@ -9,6 +9,9 @@
# RUN: lld-link /entry:foo /out:%t.exe /subsystem:console /include:bar \ # RUN: lld-link /entry:foo /out:%t.exe /subsystem:console /include:bar \
# RUN: /verbose /opt:noicf %t.obj > %t.log 2>&1 # RUN: /verbose /opt:noicf %t.obj > %t.log 2>&1
# RUN: FileCheck -check-prefix=NOICF %s < %t.log # RUN: FileCheck -check-prefix=NOICF %s < %t.log
# RUN: lld-link /entry:foo /out:%t.exe /subsystem:console /include:bar \
# RUN: /verbose /opt:noref,noicf %t.obj > %t.log 2>&1
# RUN: FileCheck -check-prefix=NOICF %s < %t.log
# NOICF-NOT: Removed foo # NOICF-NOT: Removed foo
# NOICF-NOT: Removed bar # NOICF-NOT: Removed bar