Skip to content

Commit

Permalink
[tools] [llvm-nm] Default to reading from stdin not a.out
Browse files Browse the repository at this point in the history
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

llvm-svn: 365889
  • Loading branch information
abrachet committed Jul 12, 2019
1 parent 0f7146d commit 60c8135
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 4 deletions.
5 changes: 2 additions & 3 deletions llvm/docs/CommandGuide/llvm-nm.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
33 changes: 33 additions & 0 deletions llvm/test/tools/llvm-nm/stdin.test
Original file line number Diff line number Diff line change
@@ -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
9 changes: 8 additions & 1 deletion llvm/tools/llvm-nm/llvm-nm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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))
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 60c8135

Please sign in to comment.