From 8fbedb6b908f20b9972cb064dfe7b6d7ea3782ef Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Tue, 16 Mar 2021 10:07:01 -0700 Subject: [PATCH] [llvm-nm] Add --format=just-symbols and make --just-symbol-name its alias 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 --- llvm/docs/CommandGuide/llvm-nm.rst | 5 +- llvm/test/tools/llvm-nm/just-symbol-name.test | 38 ------------- llvm/test/tools/llvm-nm/just-symbols.test | 53 +++++++++++++++++++ llvm/tools/llvm-nm/llvm-nm.cpp | 20 ++++--- 4 files changed, 68 insertions(+), 48 deletions(-) delete mode 100644 llvm/test/tools/llvm-nm/just-symbol-name.test create mode 100644 llvm/test/tools/llvm-nm/just-symbols.test diff --git a/llvm/docs/CommandGuide/llvm-nm.rst b/llvm/docs/CommandGuide/llvm-nm.rst index 747192a9d924dc..20779b17fddec5 100644 --- a/llvm/docs/CommandGuide/llvm-nm.rst +++ b/llvm/docs/CommandGuide/llvm-nm.rst @@ -149,7 +149,8 @@ OPTIONS .. option:: --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 @@ -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 diff --git a/llvm/test/tools/llvm-nm/just-symbol-name.test b/llvm/test/tools/llvm-nm/just-symbol-name.test deleted file mode 100644 index 85be79a6a24092..00000000000000 --- a/llvm/test/tools/llvm-nm/just-symbol-name.test +++ /dev/null @@ -1,38 +0,0 @@ -## Show that the -j/--just-symbol-name prints only the the symbol name (except -## in posix output). - -# RUN: yaml2obj %s -o %t.o - -# RUN: llvm-nm --just-symbol-name %t.o > %t.bsd.txt -# RUN: llvm-nm -j %t.o > %t.j.txt -# RUN: cmp %t.bsd.txt %t.j.txt - -# RUN: FileCheck %s --input-file=%t.bsd.txt --implicit-check-not={{.}} --check-prefix=COMMON -# RUN: llvm-nm -j %t.o --format=sysv | \ -# RUN: FileCheck %s --implicit-check-not={{.}} --check-prefixes=COMMON,SYSV -DFILE=%t.o -# RUN: llvm-nm -j %t.o --format=posix | FileCheck %s --implicit-check-not={{.}} --check-prefix=POSIX - -# SYSV: Symbols from [[FILE]]: -# SYSV-EMPTY: -# SYSV-NEXT: Name Value Class Type Size Line Section -# COMMON: {{^}}defined{{$}} -# COMMON-NEXT: {{^}}undefined{{$}} - -# POSIX: defined T 0 0 -# POSIX-NEXT: undefined U 0 0 - ---- !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 diff --git a/llvm/test/tools/llvm-nm/just-symbols.test b/llvm/test/tools/llvm-nm/just-symbols.test new file mode 100644 index 00000000000000..53bd2e25a62ef3 --- /dev/null +++ b/llvm/test/tools/llvm-nm/just-symbols.test @@ -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 diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index b978eafcbda777..6438b7867dbd80 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -47,7 +47,7 @@ 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"); @@ -55,7 +55,9 @@ cl::opt 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)); @@ -180,9 +182,9 @@ cl::alias RadixAlias("t", cl::desc("Alias for --radix"), cl::aliasopt(AddressRadix)); cl::opt 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 @@ -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)) @@ -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"; @@ -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