forked from OSchip/llvm-project
[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:
parent
5821a3bf36
commit
7668182e44
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
Loading…
Reference in New Issue