[llvm-nm] Add --format=just-symbols and make --just-symbol-name its alias
authorFangrui Song <i@maskray.me>
Tue, 16 Mar 2021 17:07:01 +0000 (10:07 -0700)
committerFangrui Song <i@maskray.me>
Tue, 16 Mar 2021 17:07:01 +0000 (10:07 -0700)
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
llvm/test/tools/llvm-nm/just-symbol-name.test [deleted file]
llvm/test/tools/llvm-nm/just-symbols.test [new file with mode: 0644]
llvm/tools/llvm-nm/llvm-nm.cpp

index 747192a..20779b1 100644 (file)
@@ -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
@@ -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 (file)
index 85be79a..0000000
+++ /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 (file)
index 0000000..53bd2e2
--- /dev/null
@@ -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
index b978eaf..6438b78 100644 (file)
@@ -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<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));
@@ -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>
@@ -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