[llvm] r374795 - [llvm-objdump] Adjust spacing and field width for --section-headers

Jordan Rupprecht via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 14 10:47:18 PDT 2019


Author: rupprecht
Date: Mon Oct 14 10:47:17 2019
New Revision: 374795

URL: http://llvm.org/viewvc/llvm-project?rev=374795&view=rev
Log:
[llvm-objdump] Adjust spacing and field width for --section-headers

Summary:
- Expand the "Name" column past 13 characters when any of the section names are longer. Current behavior is a staggard output instead of a nice table if a single name is longer.
- Only print the required number of hex chars for addresses (i.e. 8 characters for 32-bit, 16 characters for 64-bit)
- Fix trailing spaces

Reviewers: grimar, jhenderson, espindola

Reviewed By: grimar

Subscribers: emaste, sbc100, arichardson, aheejin, seiya, llvm-commits, MaskRay

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D68730

Added:
    llvm/trunk/test/tools/llvm-objdump/section-headers.test
Modified:
    llvm/trunk/test/tools/llvm-objdump/wasm.txt
    llvm/trunk/test/tools/llvm-objdump/xcoff-section-headers.test
    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp

Added: llvm/trunk/test/tools/llvm-objdump/section-headers.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/section-headers.test?rev=374795&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/section-headers.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/section-headers.test Mon Oct 14 10:47:17 2019
@@ -0,0 +1,155 @@
+## Test various details of llvm-objdump -h (--section-headers).
+
+## Check leading and trailing whitespace for full lines.
+
+# RUN: yaml2obj %s --docnum=1 -o %t-whitespace.o
+# RUN: llvm-objdump -h --show-lma %t-whitespace.o \
+# RUN:   | FileCheck %s --check-prefix=WHITESPACE --strict-whitespace
+# RUN: llvm-objdump -h %t-whitespace.o \
+# RUN:   | FileCheck %s --check-prefix=WHITESPACE-NO-LMA --strict-whitespace
+
+# WHITESPACE:      {{^}}Sections:{{$}}
+# WHITESPACE-NEXT: {{^}}Idx Name          Size     VMA              LMA              Type{{$}}
+# WHITESPACE-NEXT: {{^}}  0               00000000 0000000000000000 0000000000000000 {{$}}
+# WHITESPACE-NEXT: {{^}}  1 .text         00000000 0000000000000000 0000000000000000 TEXT{{$}}
+# WHITESPACE-NEXT: {{^}}  2 .data         00000000 0000000000000000 0000000000000000 DATA{{$}}
+# WHITESPACE-NEXT: {{^}}  3 .bss          00000000 0000000000000000 0000000000000000 BSS{{$}}
+# WHITESPACE-NEXT: {{^}}  4 .other        00000000 0000000000000000 0000000000000000 {{$}}
+
+# WHITESPACE-NO-LMA:      {{^}}Sections:{{$}}
+# WHITESPACE-NO-LMA-NEXT: {{^}}Idx Name          Size     VMA              Type{{$}}
+# WHITESPACE-NO-LMA-NEXT: {{^}}  0               00000000 0000000000000000 {{$}}
+# WHITESPACE-NO-LMA-NEXT: {{^}}  1 .text         00000000 0000000000000000 TEXT{{$}}
+# WHITESPACE-NO-LMA-NEXT: {{^}}  2 .data         00000000 0000000000000000 DATA{{$}}
+# WHITESPACE-NO-LMA-NEXT: {{^}}  3 .bss          00000000 0000000000000000 BSS{{$}}
+# WHITESPACE-NO-LMA-NEXT: {{^}}  4 .other        00000000 0000000000000000 {{$}}
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name:  .text
+    Type:  SHT_PROGBITS
+    Flags: [SHF_ALLOC, SHF_EXECINSTR]
+  - Name:  .data
+    Type:  SHT_PROGBITS
+    Flags: [SHF_ALLOC, SHF_WRITE]
+  - Name:  .bss
+    Type:  SHT_NOBITS
+    Flags: [SHF_ALLOC, SHF_WRITE]
+  - Name:  .other
+    Type:  SHT_REL
+
+## The name field automatically expands past the default 13 columns when a
+## section name is longer than that.
+## Note: check with and without --show-lma to make sure resizing happens in
+## both cases.
+
+# RUN: yaml2obj %s --docnum=2 -o %t-name13chars.o
+# RUN: llvm-objdump -h --show-lma %t-name13chars.o \
+# RUN:   | FileCheck %s --check-prefix=NAME-13 --strict-whitespace
+# RUN: llvm-objdump -h %t-name13chars.o \
+# RUN:   | FileCheck %s --check-prefix=NAME-13 --strict-whitespace
+
+# NAME-13:      Sections:
+# NAME-13-NEXT: {{^}}Idx Name          Size
+# NAME-13-NEXT: {{^}}  0               00000000
+# NAME-13-NEXT: {{^}}  1 .foo          00000000
+# NAME-13-NEXT: {{^}}  2 .thirteenchar 00000000
+# NAME-13-NEXT: {{^}}  3 .bar          00000000
+
+## Including a section with a name of length 14 expands the width of the "Name"
+## column.
+# RUN: yaml2obj %s --docnum=3 -o %t-name14chars.o
+# RUN: llvm-objdump -h --show-lma %t-name14chars.o \
+# RUN:   | FileCheck %s --check-prefix=NAME-14 --strict-whitespace
+# RUN: llvm-objdump -h %t-name14chars.o \
+# RUN:   | FileCheck %s --check-prefix=NAME-14 --strict-whitespace
+
+# NAME-14:      Sections:
+# NAME-14-NEXT: {{^}}Idx Name           Size
+# NAME-14-NEXT: {{^}}  0                00000000
+# NAME-14-NEXT: {{^}}  1 .foo           00000000
+# NAME-14-NEXT: {{^}}  2 .fourteenchars 00000000
+# NAME-14-NEXT: {{^}}  3 .bar           00000000
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name: .foo
+    Type: SHT_PROGBITS
+  - Name: .thirteenchar
+    Type: SHT_PROGBITS
+  - Name: .bar
+    Type: SHT_PROGBITS
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name: .foo
+    Type: SHT_PROGBITS
+  - Name: .fourteenchars
+    Type: SHT_PROGBITS
+  - Name: .bar
+    Type: SHT_PROGBITS
+
+## Check that objdump -h only prints the necessary amount of bytes for
+## addresses.
+
+# RUN: yaml2obj %s --docnum=4 -o %t-32bit.o
+# RUN: yaml2obj %s --docnum=5 -o %t-64bit.o
+
+# RUN: llvm-objdump -h --show-lma %t-32bit.o \
+# RUN:   | FileCheck %s --check-prefix=32 --strict-whitespace
+# 32: {{^}}Idx Name          Size     VMA      LMA      Type{{$}}
+# 32: {{^}}  1 .foo          00000000 00000400 00000400 TEXT{{$}}
+
+# RUN: llvm-objdump -h %t-32bit.o \
+# RUN:   | FileCheck %s --check-prefix=32-NO-LMA --strict-whitespace
+# 32-NO-LMA: {{^}}Idx Name          Size     VMA      Type{{$}}
+# 32-NO-LMA: {{^}}  1 .foo          00000000 00000400 TEXT{{$}}
+
+# RUN: llvm-objdump -h --show-lma %t-64bit.o \
+# RUN:   | FileCheck %s --check-prefix=64 --strict-whitespace
+# 64: {{^}}Idx Name          Size     VMA              LMA              Type{{$}}
+# 64: {{^}}  1 .foo          00000000 0000000000000400 0000000000000400 TEXT{{$}}
+
+# RUN: llvm-objdump -h %t-64bit.o \
+# RUN:   | FileCheck %s --check-prefix=64-NO-LMA --strict-whitespace
+# 64-NO-LMA: {{^}}Idx Name          Size     VMA              Type{{$}}
+# 64-NO-LMA: {{^}}  1 .foo          00000000 0000000000000400 TEXT{{$}}
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_386
+Sections:
+  - Name:    .foo
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Address: 0x400
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name:    .foo
+    Type:    SHT_PROGBITS
+    Flags:   [SHF_ALLOC, SHF_EXECINSTR]
+    Address: 0x400

Modified: llvm/trunk/test/tools/llvm-objdump/wasm.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/wasm.txt?rev=374795&r1=374794&r2=374795&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/wasm.txt (original)
+++ llvm/trunk/test/tools/llvm-objdump/wasm.txt Mon Oct 14 10:47:17 2019
@@ -1,14 +1,14 @@
 # RUN: llvm-objdump -h %p/Inputs/trivial.obj.wasm | FileCheck %s
 
 # CHECK:      Sections:
-# CHECK-NEXT: Idx Name          Size    VMA              Type
-# CHECK-NEXT:  0 TYPE          00000011 0000000000000000
-# CHECK-NEXT:  1 IMPORT        0000005d 0000000000000000
-# CHECK-NEXT:  2 FUNCTION      00000003 0000000000000000
-# CHECK-NEXT:  3 CODE          00000024 0000000000000000 TEXT
-# CHECK-NEXT:  4 DATA          0000001c 0000000000000000 DATA
-# CHECK-NEXT:  5 linking       0000006d 0000000000000000
-# CHECK-NEXT:  6 reloc.CODE    0000000f 0000000000000000
+# CHECK-NEXT: Idx Name          Size     VMA      Type
+# CHECK-NEXT:   0 TYPE          00000011 00000000
+# CHECK-NEXT:   1 IMPORT        0000005d 00000000
+# CHECK-NEXT:   2 FUNCTION      00000003 00000000
+# CHECK-NEXT:   3 CODE          00000024 00000000 TEXT
+# CHECK-NEXT:   4 DATA          0000001c 00000000 DATA
+# CHECK-NEXT:   5 linking       0000006d 00000000
+# CHECK-NEXT:   6 reloc.CODE    0000000f 00000000
 
 # RUN: llvm-objdump -p %p/Inputs/trivial.obj.wasm | FileCheck %s -check-prefix CHECK-HEADER
 

Modified: llvm/trunk/test/tools/llvm-objdump/xcoff-section-headers.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/xcoff-section-headers.test?rev=374795&r1=374794&r2=374795&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/xcoff-section-headers.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/xcoff-section-headers.test Mon Oct 14 10:47:17 2019
@@ -12,12 +12,12 @@
 
 # CHECK: xcoff-section-headers.o:      file format aixcoff-rs6000
 # CHECK: Sections:
-# CHECK: Idx Name          Size     VMA          Type
-# CHECK:   1 .text         00000080 0000000000000000 TEXT
-# CHECK:   2 .data         00000024 0000000000000080 DATA
-# CHECK:   3 .bss          00000004 00000000000000a4 BSS
-# CHECK:   4 .tdata        00000008 0000000000000000 DATA
-# CHECK:   5 .tbss         00000004 0000000000000008 BSS
+# CHECK: Idx Name          Size     VMA      Type
+# CHECK:   1 .text         00000080 00000000 TEXT
+# CHECK:   2 .data         00000024 00000080 DATA
+# CHECK:   3 .bss          00000004 000000a4 BSS
+# CHECK:   4 .tdata        00000008 00000000 DATA
+# CHECK:   5 .tbss         00000004 00000008 BSS
 
 # xcoff-section-headers.o Compiled with IBM XL C/C++ for AIX, V16.1.0
 # test.c:
@@ -32,10 +32,10 @@
 
 # LONG: xcoff-long-sec-names.o:      file format aixcoff-rs6000
 # LONG: Sections:
-# LONG: Idx Name          Size     VMA          Type
-# LONG: 1 .dwarnge      00000004 0000000000000000
-# LONG: 2 .dwpbnms      00000004 0000000000000000
-# LONG: 3 .dwpbtyp      00000004 0000000000000000
+# LONG: Idx Name        Size     VMA      Type
+# LONG: 1 .dwarnge      00000004 00000000
+# LONG: 2 .dwpbnms      00000004 00000000
+# LONG: 3 .dwpbtyp      00000004 00000000
 
 # xcoff-long-sec-names.o was generated by assembling the following .s file:
 #  .dwsect 0x30000 # .dwpbnms section

Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=374795&r1=374794&r2=374795&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Mon Oct 14 10:47:17 2019
@@ -1650,15 +1650,31 @@ static bool shouldDisplayLMA(const Objec
   return ShowLMA;
 }
 
+static size_t getMaxSectionNameWidth(const ObjectFile *Obj) {
+  // Default column width for names is 13 even if no names are that long.
+  size_t MaxWidth = 13;
+  for (const SectionRef &Section : ToolSectionFilter(*Obj)) {
+    StringRef Name = unwrapOrError(Section.getName(), Obj->getFileName());
+    MaxWidth = std::max(MaxWidth, Name.size());
+  }
+  return MaxWidth;
+}
+
 void printSectionHeaders(const ObjectFile *Obj) {
+  size_t NameWidth = getMaxSectionNameWidth(Obj);
+  size_t AddressWidth = 2 * Obj->getBytesInAddress();
   bool HasLMAColumn = shouldDisplayLMA(Obj);
   if (HasLMAColumn)
     outs() << "Sections:\n"
-              "Idx Name          Size     VMA              LMA              "
-              "Type\n";
+              "Idx "
+           << left_justify("Name", NameWidth) << " Size     "
+           << left_justify("VMA", AddressWidth) << " "
+           << left_justify("LMA", AddressWidth) << " Type\n";
   else
     outs() << "Sections:\n"
-              "Idx Name          Size     VMA          Type\n";
+              "Idx "
+           << left_justify("Name", NameWidth) << " Size     "
+           << left_justify("VMA", AddressWidth) << " Type\n";
 
   for (const SectionRef &Section : ToolSectionFilter(*Obj)) {
     StringRef Name = unwrapOrError(Section.getName(), Obj->getFileName());
@@ -1667,21 +1683,23 @@ void printSectionHeaders(const ObjectFil
       VMA += AdjustVMA;
 
     uint64_t Size = Section.getSize();
-    bool Text = Section.isText();
-    bool Data = Section.isData();
-    bool BSS = Section.isBSS();
-    std::string Type = (std::string(Text ? "TEXT " : "") +
-                        (Data ? "DATA " : "") + (BSS ? "BSS" : ""));
+
+    std::string Type = Section.isText() ? "TEXT" : "";
+    if (Section.isData())
+      Type += Type.empty() ? "DATA" : " DATA";
+    if (Section.isBSS())
+      Type += Type.empty() ? "BSS" : " BSS";
 
     if (HasLMAColumn)
-      outs() << format("%3d %-13s %08" PRIx64 " %016" PRIx64 " %016" PRIx64
-                       " %s\n",
-                       (unsigned)Section.getIndex(), Name.str().c_str(), Size,
-                       VMA, getELFSectionLMA(Section), Type.c_str());
+      outs() << format("%3d %-*s %08" PRIx64 " ", (unsigned)Section.getIndex(),
+                       NameWidth, Name.str().c_str(), Size)
+             << format_hex_no_prefix(VMA, AddressWidth) << " "
+             << format_hex_no_prefix(getELFSectionLMA(Section), AddressWidth)
+             << " " << Type << "\n";
     else
-      outs() << format("%3d %-13s %08" PRIx64 " %016" PRIx64 " %s\n",
-                       (unsigned)Section.getIndex(), Name.str().c_str(), Size,
-                       VMA, Type.c_str());
+      outs() << format("%3d %-*s %08" PRIx64 " ", (unsigned)Section.getIndex(),
+                       NameWidth, Name.str().c_str(), Size)
+             << format_hex_no_prefix(VMA, AddressWidth) << " " << Type << "\n";
   }
   outs() << "\n";
 }




More information about the llvm-commits mailing list