Skip to content

Commit

Permalink
[COFF] Don't let /def override /out filename
Browse files Browse the repository at this point in the history
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
  • Loading branch information
rnk committed Mar 21, 2017
1 parent 5821a3b commit 7668182
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 10 deletions.
9 changes: 6 additions & 3 deletions lld/COFF/Driver.cpp
Expand Up @@ -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,
Expand Down Expand Up @@ -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();
Expand Down
22 changes: 15 additions & 7 deletions lld/COFF/ModuleDef.cpp
Expand Up @@ -163,17 +163,25 @@ class Parser {
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;
Expand Down
28 changes: 28 additions & 0 deletions lld/test/COFF/def-name.test
@@ -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:

0 comments on commit 7668182

Please sign in to comment.