[COFF] Don't let /def override /out filename

Summary:
This also delays setting the output filename based on the first input
argument until after processing /def.

Fixes PR32354

Reviewers: ruiu, pcc

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D31152

llvm-svn: 298327
This commit is contained in:
Reid Kleckner 2017-03-21 00:12:51 +00:00
parent 5821a3bf36
commit 7668182e44
3 changed files with 49 additions and 10 deletions

View File

@ -137,9 +137,6 @@ void LinkerDriver::enqueuePath(StringRef Path) {
fatal(MBOrErr.second, "could not open " + PathStr);
Driver->addBuffer(std::move(MBOrErr.first));
});
if (Config->OutputFile == "")
Config->OutputFile = getOutputPath(Path);
}
void LinkerDriver::addArchiveBuffer(MemoryBufferRef MB, StringRef SymName,
@ -887,6 +884,12 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
}
}
// Set default image name if neither /out or /def set it.
if (Config->OutputFile.empty()) {
Config->OutputFile =
getOutputPath((*Args.filtered_begin(OPT_INPUT))->getValue());
}
// Set default image base if /base is not given.
if (Config->ImageBase == uint64_t(-1))
Config->ImageBase = getDefaultImageBase();

View File

@ -163,17 +163,25 @@ private:
case KwHeapsize:
parseNumbers(&Config->HeapReserve, &Config->HeapCommit);
return;
case KwLibrary:
parseName(&Config->OutputFile, &Config->ImageBase);
if (!StringRef(Config->OutputFile).endswith_lower(".dll"))
Config->OutputFile += ".dll";
return;
case KwStacksize:
parseNumbers(&Config->StackReserve, &Config->StackCommit);
return;
case KwName:
parseName(&Config->OutputFile, &Config->ImageBase);
case KwLibrary:
case KwName: {
bool IsDll = Tok.K == KwLibrary; // Check before parseName.
std::string Name;
parseName(&Name, &Config->ImageBase);
// Append the appropriate file extension if not already present.
StringRef Ext = IsDll ? ".dll" : ".exe";
if (!StringRef(Name).endswith_lower(Ext))
Name += Ext;
// Set the output file, but don't override /out if it was already passed.
if (Config->OutputFile.empty())
Config->OutputFile = Name;
return;
}
case KwVersion:
parseVersion(&Config->MajorImageVersion, &Config->MinorImageVersion);
return;

View File

@ -0,0 +1,28 @@
# REQUIRES: winres
# RUN: rm -rf %t
# RUN: mkdir -p %t
# RUN: cd %t
# RUN: yaml2obj < %p/Inputs/ret42.yaml > in.obj
# RUN: lld-link /entry:main in.obj
# RUN: lld-link /entry:main /dll in.obj
# RUN: echo -e "NAME foo\n" > fooexe.def
# RUN: echo -e "LIBRARY foo\n" > foodll.def
# RUN: lld-link /entry:main /def:fooexe.def in.obj
# RUN: lld-link /entry:main /def:foodll.def /dll in.obj
# RUN: lld-link /entry:main /out:bar.exe /def:fooexe.def in.obj
# RUN: lld-link /entry:main /out:bar.dll /def:foodll.def /dll in.obj
# RUN: llvm-readobj in.exe | FileCheck %s
# RUN: llvm-readobj in.dll | FileCheck %s
# RUN: llvm-readobj foo.exe | FileCheck %s
# RUN: llvm-readobj foo.dll | FileCheck %s
# RUN: llvm-readobj bar.exe | FileCheck %s
# RUN: llvm-readobj bar.dll | FileCheck %s
CHECK: File: