aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
diff options
context:
space:
mode:
authorNico Weber <thakis@chromium.org>2022-04-11 11:01:34 -0400
committerNico Weber <thakis@chromium.org>2022-04-11 13:15:30 -0400
commit75196b99fbd3397ccb7960b6e7ad7c40efef2315 (patch)
tree84bc615963d72218e674cd5fa46ade8c490a2fbc /llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
parent76192182d0ca8e0c82c6d7aa9c11de07328b4c62 (diff)
downloadllvm-75196b99fbd3397ccb7960b6e7ad7c40efef2315.zip
llvm-75196b99fbd3397ccb7960b6e7ad7c40efef2315.tar.gz
llvm-75196b99fbd3397ccb7960b6e7ad7c40efef2315.tar.bz2
[llvm-lib] Add /WX, warn by default on empty inputs, add opt-out
lib.exe by default exits successfully without writing an output file when no inputs are passed. llvm-lib has the same behavior, for compatibility. This behavior interacts poorly with build systems: If a static library target had no inputs, llvm-lib would not produce an output file, causing ninja (or make, or a similar system) to successfully run that step, but then re-run it on the next build. After this patch, llvm-lib emits a warning in this case, that with /WX can be turned into an error. That way, ninja (or make, or...) will mark the initial build as failed. People who don't like the warning can use /ignore:emptyoutput to suppress it. The warning also points out the existing flag /llvmlibempty which forces creation of an empty .lib file (this is an extension to lib.exe). Differential Revision: https://reviews.llvm.org/D123517
Diffstat (limited to 'llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp')
-rw-r--r--llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp26
1 files changed, 21 insertions, 5 deletions
diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
index 8f69282..7ecde3c 100644
--- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
+++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
@@ -229,10 +229,11 @@ static void appendFile(std::vector<NewArchiveMember> &Members,
(Magic == file_magic::coff_object) ? getCOFFFileMachine(MB)
: getBitcodeFileMachine(MB);
if (!MaybeFileMachine) {
- handleAllErrors(MaybeFileMachine.takeError(), [&](const ErrorInfoBase &EIB) {
- llvm::errs() << MB.getBufferIdentifier() << ": " << EIB.message()
- << "\n";
- });
+ handleAllErrors(MaybeFileMachine.takeError(),
+ [&](const ErrorInfoBase &EIB) {
+ llvm::errs() << MB.getBufferIdentifier() << ": "
+ << EIB.message() << "\n";
+ });
exit(1);
}
COFF::MachineTypes FileMachine = *MaybeFileMachine;
@@ -291,10 +292,25 @@ int llvm::libDriverMain(ArrayRef<const char *> ArgsArr) {
return 0;
}
+ // Parse /ignore:
+ llvm::StringSet<> IgnoredWarnings;
+ for (auto *Arg : Args.filtered(OPT_ignore))
+ IgnoredWarnings.insert(Arg->getValue());
+
// If no input files and not told otherwise, silently do nothing to match
// lib.exe
- if (!Args.hasArgNoClaim(OPT_INPUT) && !Args.hasArg(OPT_llvmlibempty))
+ if (!Args.hasArgNoClaim(OPT_INPUT) && !Args.hasArg(OPT_llvmlibempty)) {
+ if (!IgnoredWarnings.contains("emptyoutput")) {
+ llvm::errs() << "warning: no input files, not writing output file\n";
+ llvm::errs() << " pass /llvmlibempty to write empty .lib file,\n";
+ llvm::errs() << " pass /ignore:emptyoutput to suppress warning\n";
+ if (Args.hasFlag(OPT_WX, OPT_WX_no, false)) {
+ llvm::errs() << "treating warning as error due to /WX\n";
+ return 1;
+ }
+ }
return 0;
+ }
if (Args.hasArg(OPT_lst)) {
doList(Args);