]> granicus.if.org Git - llvm/commitdiff
[tools] [llvm-nm] Default to reading from stdin not a.out
authorAlex Brachet <alexbrachetmialot@gmail.com>
Fri, 12 Jul 2019 10:20:01 +0000 (10:20 +0000)
committerAlex Brachet <alexbrachetmialot@gmail.com>
Fri, 12 Jul 2019 10:20:01 +0000 (10:20 +0000)
Summary: This moves away from defaulting to a.out and uses stdin only if stdin has a file redirected to it. This has been discussed on the llvm-dev mailing list [[ https://lists.llvm.org/pipermail/llvm-dev/2019-July/133642.html | here ]].

Reviewers: jhenderson, rupprecht, MaskRay, chrisjackson

Reviewed By: jhenderson, MaskRay

Subscribers: llvm-commits

Tags: #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365889 91177308-0d34-0410-b5e6-96231b3b80d8

docs/CommandGuide/llvm-nm.rst
test/tools/llvm-nm/stdin.test [new file with mode: 0644]
tools/llvm-nm/llvm-nm.cpp

index e3b3658ef1e1fef5ce6a6f6dd389e97c84fd918b..3b7ea93a0d26721ea5ad445f8fdd96f3de43ce44 100644 (file)
@@ -13,9 +13,8 @@ DESCRIPTION
 
 The :program:`llvm-nm` utility lists the names of symbols from LLVM bitcode
 files, object files, and archives. Each symbol is listed along with some simple
-information about its provenance. If no filename is specified, *a.out* is used
-as the input. If *-* is used as a filename, :program:`llvm-nm` will read a file
-from its standard input stream.
+information about its provenance. If no filename is specified, or *-* is used as
+a filename, :program:`llvm-nm` will read a file from its standard input stream.
 
 :program:`llvm-nm`'s default output format is the traditional BSD :program:`nm`
 output format. Each such output record consists of an (optional) 8-digit
diff --git a/test/tools/llvm-nm/stdin.test b/test/tools/llvm-nm/stdin.test
new file mode 100644 (file)
index 0000000..352ee23
--- /dev/null
@@ -0,0 +1,33 @@
+## Test llvm-nm when using stdin both explicitly (using '-' as a filename)
+## and implicitly (not specifying any filename).
+
+# RUN: yaml2obj %s -o %t.o
+
+## Pass an explicit filename to produce a baseline output. llvm-nm should
+## have the same behavior when opening a file itself and when reading that
+## file from its standard input stream.
+# RUN: llvm-nm %t.o > %t.base 2> %t.err
+
+## Make sure there is no warning message about no file redirected to stdin.
+# RUN: FileCheck %s --input-file=%t.err --allow-empty --implicit-check-not={{.}}
+
+# RUN: llvm-nm - < %t.o > %t.explicit 2> %t.err
+# RUN: FileCheck %s --input-file=%t.err --allow-empty --implicit-check-not={{.}}
+# RUN: cmp %t.base %t.explicit
+
+# RUN: llvm-nm < %t.o > %t.implicit 2> %t.err
+# RUN: FileCheck %s --input-file=%t.err --allow-empty --implicit-check-not={{.}}
+# RUN: cmp %t.base %t.implicit
+
+!ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_REL
+  Machine: EM_X86_64
+Sections:
+  - Name: .text
+    Type: SHT_PROGBITS
+Symbols:
+  - Name:    symbol_a
+    Section: .text
index aa62e6f0209b4facd6c1f9a9308f4f2a0a72bfec..c45c8716f18dc5b963debc4c3ae0af8052517e88 100644 (file)
@@ -34,6 +34,7 @@
 #include "llvm/Support/Format.h"
 #include "llvm/Support/InitLLVM.h"
 #include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Process.h"
 #include "llvm/Support/Program.h"
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/TargetSelect.h"
@@ -1751,6 +1752,12 @@ static bool checkMachOAndArchFlags(SymbolicFile *O, std::string &Filename) {
 }
 
 static void dumpSymbolNamesFromFile(std::string &Filename) {
+  if (Filename == "-" && sys::Process::StandardInIsUserInput()) {
+    WithColor::warning(errs(), ToolName) << "can't read from terminal\n";
+    cl::PrintHelpMessage();
+    HadError = true;
+    return;
+  }
   ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
       MemoryBuffer::getFileOrSTDIN(Filename);
   if (error(BufferOrErr.getError(), Filename))
@@ -2082,7 +2089,7 @@ int main(int argc, char **argv) {
   if (OutputFormat == sysv || SizeSort)
     PrintSize = true;
   if (InputFilenames.empty())
-    InputFilenames.push_back("a.out");
+    InputFilenames.push_back("-");
   if (InputFilenames.size() > 1)
     MultipleFiles = true;