diff --git a/docs/CommandGuide/llvm-nm.rst b/docs/CommandGuide/llvm-nm.rst index e3b3658ef1e..3b7ea93a0d2 100644 --- a/docs/CommandGuide/llvm-nm.rst +++ b/docs/CommandGuide/llvm-nm.rst @@ -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 index 00000000000..352ee23a30a --- /dev/null +++ b/test/tools/llvm-nm/stdin.test @@ -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 diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index aa62e6f0209..c45c8716f18 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -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> 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;