From 6e20245be09675fcd45a2bf36b9dd3106065e278 Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Wed, 2 Jul 2014 23:23:58 +0000 Subject: [PATCH] =?UTF-8?q?Add=20the=20-reverse-sort=20flag=20(aka=20-r)?= =?UTF-8?q?=20to=20llvm-nm=20which=20exists=20in=20other=20Unix=20nm(1)?= =?UTF-8?q?=E2=80=99s.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit llvm-svn: 212235 --- test/Object/nm-trivial-object.test | 8 +++ tools/llvm-nm/llvm-nm.cpp | 85 +++++++++++++++++++++--------- 2 files changed, 69 insertions(+), 24 deletions(-) diff --git a/test/Object/nm-trivial-object.test b/test/Object/nm-trivial-object.test index 5e6416c6c98..a1b8a30df25 100644 --- a/test/Object/nm-trivial-object.test +++ b/test/Object/nm-trivial-object.test @@ -16,6 +16,8 @@ RUN: llvm-nm %p/Inputs/trivial-object-test.macho-x86-64 \ RUN: | FileCheck %s -check-prefix macho64 RUN: llvm-nm %p/Inputs/macho-text-data-bss.macho-x86_64 \ RUN: | FileCheck %s -check-prefix macho-tdb +RUN: llvm-nm -r %p/Inputs/macho-text-data-bss.macho-x86_64 \ +RUN: | FileCheck %s -check-prefix macho-r RUN: llvm-nm %p/Inputs/common.coff-i386 \ RUN: | FileCheck %s -check-prefix COFF-COMMON RUN: llvm-nm %p/Inputs/relocatable-with-section-address.elf-x86-64 \ @@ -77,6 +79,12 @@ macho-tdb: 000000000000000c D _d macho-tdb: 0000000000000000 T _t macho-tdb: 0000000000000048 S _t.eh +macho-r: 0000000000000048 S _t.eh +macho-r-NEXT: 0000000000000000 T _t +macho-r-NEXT: 000000000000000c D _d +macho-r-NEXT: 0000000000000070 b _b +macho-r-NEXT: 0000000000000030 s EH_frame0 + Test that nm uses addresses even with ELF .o files. ELF-SEC-ADDR64: 0000000000000058 D a ELF-SEC-ADDR64-NEXT: 000000000000005c D b diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index bd1c01ce485..64aae5e0c34 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -111,6 +111,10 @@ cl::alias NumericSortv("v", cl::desc("Alias for --numeric-sort"), cl::opt NoSort("no-sort", cl::desc("Show symbols in order encountered")); cl::alias NoSortp("p", cl::desc("Alias for --no-sort"), cl::aliasopt(NoSort)); +cl::opt ReverseSort("reverse-sort", cl::desc("Sort in reverse order")); +cl::alias ReverseSortr("r", cl::desc("Alias for --reverse-sort"), + cl::aliasopt(ReverseSort)); + cl::opt PrintSize("print-size", cl::desc("Show symbol size instead of address")); cl::alias PrintSizeS("S", cl::desc("Alias for --print-size"), @@ -157,36 +161,69 @@ struct NMSymbol { } static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) { - if (A.Address < B.Address) - return true; - else if (A.Address == B.Address && A.Name < B.Name) - return true; - else if (A.Address == B.Address && A.Name == B.Name && A.Size < B.Size) - return true; - else - return false; + if (!ReverseSort) { + if (A.Address < B.Address) + return true; + else if (A.Address == B.Address && A.Name < B.Name) + return true; + else if (A.Address == B.Address && A.Name == B.Name && A.Size < B.Size) + return true; + else + return false; + } else { + if (A.Address > B.Address) + return true; + else if (A.Address == B.Address && A.Name > B.Name) + return true; + else if (A.Address == B.Address && A.Name == B.Name && A.Size > B.Size) + return true; + else + return false; + } } static bool compareSymbolSize(const NMSymbol &A, const NMSymbol &B) { - if (A.Size < B.Size) - return true; - else if (A.Size == B.Size && A.Name < B.Name) - return true; - else if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address) - return true; - else - return false; + if (!ReverseSort) { + if (A.Size < B.Size) + return true; + else if (A.Size == B.Size && A.Name < B.Name) + return true; + else if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address) + return true; + else + return false; + } else { + if (A.Size > B.Size) + return true; + else if (A.Size == B.Size && A.Name > B.Name) + return true; + else if (A.Size == B.Size && A.Name == B.Name && A.Address > B.Address) + return true; + else + return false; + } } static bool compareSymbolName(const NMSymbol &A, const NMSymbol &B) { - if (A.Name < B.Name) - return true; - else if (A.Name == B.Name && A.Size < B.Size) - return true; - else if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address) - return true; - else - return false; + if (!ReverseSort) { + if (A.Name < B.Name) + return true; + else if (A.Name == B.Name && A.Size < B.Size) + return true; + else if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address) + return true; + else + return false; + } else { + if (A.Name > B.Name) + return true; + else if (A.Name == B.Name && A.Size > B.Size) + return true; + else if (A.Name == B.Name && A.Size == B.Size && A.Address > B.Address) + return true; + else + return false; + } } static char isSymbolList64Bit(SymbolicFile *Obj) {