Skip to content

Commit

Permalink
[llvm-nm] Add --format=just-symbols and make --just-symbol-name its a…
Browse files Browse the repository at this point in the history
…lias

https://sourceware.org/bugzilla/show_bug.cgi?id=27487 binutils will have
--format=just-symbols/-j as well.

Arbitrarily prefer `-j` to `--format=sysv`. Previously `--format=sysv -j` prints
in the sysv format while `-j` takes precedence over other formats.

Differential Revision: https://reviews.llvm.org/D98569
  • Loading branch information
MaskRay committed Mar 16, 2021
1 parent c3a18bb commit 8fbedb6
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 48 deletions.
5 changes: 3 additions & 2 deletions llvm/docs/CommandGuide/llvm-nm.rst
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,8 @@ OPTIONS

.. option:: --format=<format>, -f

Select an output format; *format* may be *sysv*, *posix*, *darwin*, or *bsd*.
Select an output format; *format* may be *sysv*, *posix*, *darwin*, *bsd* or
*just-symbols*.
The default is *bsd*.

.. option:: --help, -h
Expand All @@ -162,7 +163,7 @@ OPTIONS

.. option:: --just-symbol-name, -j

Print just the symbol names.
Print just the symbol names. Alias for `--format=just-symbols``.

.. option:: -m

Expand Down
38 changes: 0 additions & 38 deletions llvm/test/tools/llvm-nm/just-symbol-name.test

This file was deleted.

53 changes: 53 additions & 0 deletions llvm/test/tools/llvm-nm/just-symbols.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
## Show that the -j/--just-symbol-name/--format=just-symbols prints only the the
## symbol name.

# RUN: yaml2obj %s -o %t.o

# RUN: llvm-nm -j %t.o > %t.txt
# RUN: llvm-nm --just-symbol-name %t.o | diff %t.txt -
# RUN: llvm-nm --format=just-symbols %t.o | diff %t.txt -
# RUN: llvm-nm --format=sysv -j %t.o | diff %t.txt -
# RUN: llvm-nm -j --format=posix %t.o | diff %t.txt -

# RUN: FileCheck %s --input-file=%t.txt --implicit-check-not={{.}} --check-prefix=COMMON

# COMMON: {{^}}defined{{$}}
# COMMON-NEXT: {{^}}undefined{{$}}

# RUN: llvm-nm -j %t.o %t.o | FileCheck %s --check-prefix=MULTI1 -DFILE=%t.o

# MULTI1-NOT: {{.}}
# MULTI1: {{^$}}
# MULTI1-NEXT: [[FILE]]:
# MULTI1-NEXT: defined
# MULTI1-NEXT: undefined
# MULTI1-EMPTY:
# MULTI1-NEXT: [[FILE]]:
# MULTI1-NEXT: defined
# MULTI1-NEXT: undefined
# MULTI1-NOT: {{.}}

# RUN: llvm-nm -j --print-file-name %t.o %t.o | FileCheck %s --check-prefix=MULTI2 -DFILE=%t.o

# MULTI2-NOT: {{.}}
# MULTI2: [[FILE]]: defined
# MULTI2-NEXT: [[FILE]]: undefined
# MULTI2-NEXT: [[FILE]]: defined
# MULTI2-NEXT: [[FILE]]: undefined
# MULTI2-NOT: {{.}}

--- !ELF
FileHeader:
Class: ELFCLASS64
Data: ELFDATA2LSB
Type: ET_REL
Sections:
- Name: .text
Type: SHT_PROGBITS
Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
Symbols:
- Name: defined
Section: .text
Binding: STB_GLOBAL
- Name: undefined
Binding: STB_GLOBAL
20 changes: 12 additions & 8 deletions llvm/tools/llvm-nm/llvm-nm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,17 @@ using namespace llvm;
using namespace object;

namespace {
enum OutputFormatTy { bsd, sysv, posix, darwin };
enum OutputFormatTy { bsd, sysv, posix, darwin, just_symbols };

cl::OptionCategory NMCat("llvm-nm Options");

cl::opt<OutputFormatTy> OutputFormat(
"format", cl::desc("Specify output format"),
cl::values(clEnumVal(bsd, "BSD format"), clEnumVal(sysv, "System V format"),
clEnumVal(posix, "POSIX.2 format"),
clEnumVal(darwin, "Darwin -m format")),
clEnumVal(darwin, "Darwin -m format"),
cl::OptionEnumValue{"just-symbols", int(just_symbols),
"just symbol names"}),
cl::init(bsd), cl::cat(NMCat));
cl::alias OutputFormat2("f", cl::desc("Alias for --format"),
cl::aliasopt(OutputFormat));
Expand Down Expand Up @@ -180,9 +182,9 @@ cl::alias RadixAlias("t", cl::desc("Alias for --radix"),
cl::aliasopt(AddressRadix));

cl::opt<bool> JustSymbolName("just-symbol-name",
cl::desc("Print just the symbol's name"),
cl::desc("Alias for --format=just-symbols"),
cl::cat(NMCat));
cl::alias JustSymbolNames("j", cl::desc("Alias for --just-symbol-name"),
cl::alias JustSymbolNames("j", cl::desc("Alias for --format-just-symbols"),
cl::aliasopt(JustSymbolName), cl::Grouping);

cl::opt<bool>
Expand Down Expand Up @@ -772,10 +774,10 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName,
}

if (!PrintFileName) {
if (OutputFormat == posix && MultipleFiles && printName) {
if ((OutputFormat == bsd || OutputFormat == posix ||
OutputFormat == just_symbols) &&
MultipleFiles && printName) {
outs() << '\n' << CurrentFilename << ":\n";
} else if (OutputFormat == bsd && MultipleFiles && printName) {
outs() << "\n" << CurrentFilename << ":\n";
} else if (OutputFormat == sysv) {
outs() << "\n\nSymbols from " << CurrentFilename << ":\n\n";
if (isSymbolList64Bit(Obj))
Expand Down Expand Up @@ -844,7 +846,7 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName,
continue;
if (PrintFileName)
writeFileName(outs(), ArchiveName, ArchitectureName);
if ((JustSymbolName ||
if ((OutputFormat == just_symbols ||
(UndefinedOnly && MachO && OutputFormat != darwin)) &&
OutputFormat != posix) {
outs() << Name << "\n";
Expand Down Expand Up @@ -2251,6 +2253,8 @@ int main(int argc, char **argv) {
OutputFormat = posix;
if (DarwinFormat)
OutputFormat = darwin;
if (JustSymbolName)
OutputFormat = just_symbols;

// The relative order of these is important. If you pass --size-sort it should
// only print out the size. However, if you pass -S --size-sort, it should
Expand Down

0 comments on commit 8fbedb6

Please sign in to comment.