[PATCH] D63122: [llvm-strip] Error when using stdin twice

Alex Brachet via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 10 23:22:32 PDT 2019


abrachet created this revision.
abrachet added reviewers: jhenderson, rupprecht.
Herald added subscribers: llvm-commits, MaskRay, jakehehrlich, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a reviewer: alexshap.
Herald added a project: LLVM.

Implements bug 42204 <https://bugs.llvm.org/show_bug.cgi?id=42204>. llvm-strip now warns when the same input file is used more than once, and errors when stdin is used more than once.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D63122

Files:
  llvm/test/tools/llvm-objcopy/ELF/same-file-strip.test
  llvm/tools/llvm-objcopy/CopyConfig.cpp
  llvm/tools/llvm-objcopy/llvm-objcopy.cpp
  llvm/tools/llvm-objcopy/llvm-objcopy.h


Index: llvm/tools/llvm-objcopy/llvm-objcopy.h
===================================================================
--- llvm/tools/llvm-objcopy/llvm-objcopy.h
+++ llvm/tools/llvm-objcopy/llvm-objcopy.h
@@ -23,6 +23,7 @@
 LLVM_ATTRIBUTE_NORETURN extern void reportError(StringRef File, Error E);
 LLVM_ATTRIBUTE_NORETURN extern void reportError(StringRef File,
                                                 std::error_code EC);
+extern void reportWarning(Twine Message);
 
 // This is taken from llvm-readobj.
 // [see here](llvm/tools/llvm-readobj/llvm-readobj.h:38)
Index: llvm/tools/llvm-objcopy/llvm-objcopy.cpp
===================================================================
--- llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -83,6 +83,11 @@
   exit(1);
 }
 
+void reportWarning(Twine Message) {
+  WithColor::warning(errs(), ToolName) << Message << "\n";
+  errs().flush();
+}
+
 } // end namespace objcopy
 } // end namespace llvm
 
Index: llvm/tools/llvm-objcopy/CopyConfig.cpp
===================================================================
--- llvm/tools/llvm-objcopy/CopyConfig.cpp
+++ llvm/tools/llvm-objcopy/CopyConfig.cpp
@@ -7,10 +7,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "CopyConfig.h"
+#include "llvm-objcopy.h"
 
 #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"
@@ -735,7 +737,7 @@
     exit(0);
   }
 
-  SmallVector<const char *, 2> Positional;
+  SmallVector<StringRef, 2> Positional;
   for (auto Arg : InputArgs.filtered(STRIP_UNKNOWN))
     return createStringError(errc::invalid_argument, "unknown argument '%s'",
                              Arg->getAsString(InputArgs).c_str());
@@ -800,7 +802,14 @@
         InputArgs.getLastArgValue(STRIP_output, Positional[0]);
     DC.CopyConfigs.push_back(std::move(Config));
   } else {
-    for (const char *Filename : Positional) {
+    StringSet<> InputFiles;
+    for (StringRef Filename : Positional) {
+      if (InputFiles.find(Filename) != InputFiles.end()) {
+        if (Filename == "-")
+          return createStringError(errc::invalid_argument, "cannot specify '-' as an input file more than once");
+        reportWarning("'" + Filename + "' was already specified");
+      }
+      InputFiles.insert(Filename);
       Config.InputFilename = Filename;
       Config.OutputFilename = Filename;
       DC.CopyConfigs.push_back(Config);
Index: llvm/test/tools/llvm-objcopy/ELF/same-file-strip.test
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-objcopy/ELF/same-file-strip.test
@@ -0,0 +1,10 @@
+# RUN: not llvm-strip - - < %p/Inputs/dynrel.elf 2>&1 | FileCheck -check-prefix=ERR %s
+# RUN: not llvm-strip - %p/Inputs/dynrel.elf - < %p/Inputs/dynrel.elf 2>&1 \
+# RUN:     | FileCheck -check-prefix=ERR %s
+# ERR: error: cannot specify '-' as an input file more than once
+
+# RUN: cp %p/Inputs/dynrel.elf dynrel.elf
+# RUN: llvm-strip dynrel.elf dynrel.elf 2>&1 \
+# RUN:      | FileCheck -check-prefix=WARN %s
+# WARN: warning: 'dynrel.elf' was already specified
+# RUN: rm dynrel.elf


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63122.203980.patch
Type: text/x-patch
Size: 3324 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190611/d37c19e9/attachment-0001.bin>


More information about the llvm-commits mailing list