Skip to content

Commit

Permalink
[llvm-strip] Error when using stdin twice
Browse files Browse the repository at this point in the history
Summary: Implements bug [[ https://bugs.llvm.org/show_bug.cgi?id=42204 | 42204 ]]. llvm-strip now warns when the same input file is used more than once, and errors when stdin is used more than once.

Reviewers: jhenderson, rupprecht, espindola, alexshap

Reviewed By: jhenderson, rupprecht

Subscribers: emaste, arichardson, jakehehrlich, MaskRay, llvm-commits

Tags: #llvm

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

llvm-svn: 363638
  • Loading branch information
abrachet committed Jun 18, 2019
1 parent 5a321b8 commit 7747700
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 4 deletions.
26 changes: 26 additions & 0 deletions llvm/test/tools/llvm-objcopy/ELF/same-file-strip.test
@@ -0,0 +1,26 @@
## Test llvm-strip using the same input file more than once.
## When using stdin ('-') more than once llvm-strip should give an error
## while a file more than once should be simply a warning.

# RUN: yaml2obj %s -o %t

# RUN: not llvm-strip - - < %t 2>&1 | FileCheck -check-prefix=ERR %s
# RUN: not llvm-strip - %t - < %t 2>&1 | FileCheck -check-prefix=ERR %s

# ERR: error: cannot specify '-' as an input file more than once

# RUN: llvm-strip %t %t 2>&1 | FileCheck -check-prefix=WARN %s -DFILE=%t
# RUN: llvm-strip %t %t %t 2>&1 | FileCheck -check-prefix=WARN %s -DFILE=%t

# WARN: warning: '[[FILE]]' was already specified

--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_X86_64
Sections:
- Name: .alloc
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC ]
16 changes: 15 additions & 1 deletion llvm/tools/llvm-objcopy/CopyConfig.cpp
Expand Up @@ -11,6 +11,7 @@
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Support/CommandLine.h"
Expand Down Expand Up @@ -722,7 +723,9 @@ Expected<DriverConfig> parseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
// ParseStripOptions returns the config and sets the input arguments. If a
// help flag is set then ParseStripOptions will print the help messege and
// exit.
Expected<DriverConfig> parseStripOptions(ArrayRef<const char *> ArgsArr) {
Expected<DriverConfig>
parseStripOptions(ArrayRef<const char *> ArgsArr,
std::function<Error(Error)> ErrorCallback) {
StripOptTable T;
unsigned MissingArgumentIndex, MissingArgumentCount;
llvm::opt::InputArgList InputArgs =
Expand Down Expand Up @@ -809,7 +812,18 @@ Expected<DriverConfig> parseStripOptions(ArrayRef<const char *> ArgsArr) {
InputArgs.getLastArgValue(STRIP_output, Positional[0]);
DC.CopyConfigs.push_back(std::move(Config));
} else {
StringMap<unsigned> InputFiles;
for (StringRef Filename : Positional) {
if (InputFiles[Filename]++ == 1) {
if (Filename == "-")
return createStringError(
errc::invalid_argument,
"cannot specify '-' as an input file more than once");
if (Error E = ErrorCallback(createStringError(
errc::invalid_argument, "'%s' was already specified",
Filename.str().c_str())))
return std::move(E);
}
Config.InputFilename = Filename;
Config.OutputFilename = Filename;
DC.CopyConfigs.push_back(Config);
Expand Down
7 changes: 5 additions & 2 deletions llvm/tools/llvm-objcopy/CopyConfig.h
Expand Up @@ -188,8 +188,11 @@ Expected<DriverConfig> parseObjcopyOptions(ArrayRef<const char *> ArgsArr);

// ParseStripOptions returns the config and sets the input arguments. If a
// help flag is set then ParseStripOptions will print the help messege and
// exit.
Expected<DriverConfig> parseStripOptions(ArrayRef<const char *> ArgsArr);
// exit. ErrorCallback is used to handle recoverable errors. An Error returned
// by the callback aborts the parsing and is then returned by this function.
Expected<DriverConfig>
parseStripOptions(ArrayRef<const char *> ArgsArr,
std::function<Error(Error)> ErrorCallback);

} // namespace objcopy
} // namespace llvm
Expand Down
8 changes: 7 additions & 1 deletion llvm/tools/llvm-objcopy/llvm-objcopy.cpp
Expand Up @@ -82,6 +82,12 @@ LLVM_ATTRIBUTE_NORETURN void reportError(StringRef File, Error E) {
exit(1);
}

ErrorSuccess reportWarning(Error E) {
assert(E);
WithColor::warning(errs(), ToolName) << toString(std::move(E));
return Error::success();
}

} // end namespace objcopy
} // end namespace llvm

Expand Down Expand Up @@ -263,7 +269,7 @@ int main(int argc, char **argv) {
ToolName = argv[0];
bool IsStrip = sys::path::stem(ToolName).contains("strip");
Expected<DriverConfig> DriverConfig =
IsStrip ? parseStripOptions(makeArrayRef(argv + 1, argc))
IsStrip ? parseStripOptions(makeArrayRef(argv + 1, argc), reportWarning)
: parseObjcopyOptions(makeArrayRef(argv + 1, argc));
if (!DriverConfig) {
logAllUnhandledErrors(DriverConfig.takeError(),
Expand Down

0 comments on commit 7747700

Please sign in to comment.