[llvm] 547530c - [llvm-objdump] - Fix the indentation when printing dynamic tags.

Georgii Rymar via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 20 01:30:22 PST 2020


Author: Georgii Rymar
Date: 2020-01-20T12:29:50+03:00
New Revision: 547530cc6a82879c9f777d9c1035a8f0ebcb3cfe

URL: https://github.com/llvm/llvm-project/commit/547530cc6a82879c9f777d9c1035a8f0ebcb3cfe
DIFF: https://github.com/llvm/llvm-project/commit/547530cc6a82879c9f777d9c1035a8f0ebcb3cfe.diff

LOG: [llvm-objdump] - Fix the indentation when printing dynamic tags.

We have a bug currently: printed tag names might overlap the
value column. It happens for MIPS now.

This patch adds a logic to calculate the size of indentation on fly
to fix such issues.

Differential revision: https://reviews.llvm.org/D72838

Added: 
    

Modified: 
    llvm/test/tools/llvm-objdump/elf-dynamic-section-machine-specific.test
    llvm/test/tools/llvm-objdump/elf-dynamic-section.test
    llvm/tools/llvm-objdump/ELFDump.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-objdump/elf-dynamic-section-machine-specific.test b/llvm/test/tools/llvm-objdump/elf-dynamic-section-machine-specific.test
index e2f859a82ebf..49d3e89b702f 100644
--- a/llvm/test/tools/llvm-objdump/elf-dynamic-section-machine-specific.test
+++ b/llvm/test/tools/llvm-objdump/elf-dynamic-section-machine-specific.test
@@ -36,57 +36,56 @@ ProgramHeaders:
       - Section: .dynamic
 
 ## Case 2: Test that MIPS machine-specific tags can be dumped.
+##         MIPS has a few long tag names. Show that we indent columns properly.
 # RUN: yaml2obj --docnum=2 -o %t.mips %s
 # RUN: llvm-objdump -p %t.mips | FileCheck %s  --strict-whitespace --match-full-lines --check-prefix=MIPS
 
 #      MIPS:Dynamic Section:
-# MIPS-NEXT:  MIPS_RLD_VERSION     0x0000000012345678
-# MIPS-NEXT:  MIPS_TIME_STAMP      0x0000000011223344
-# MIPS-NEXT:  MIPS_ICHECKSUM       0x0000000011112222
-# MIPS-NEXT:  MIPS_IVERSION        0x0000000000000001
-# MIPS-NEXT:  MIPS_FLAGS           0x0000000011111111
-# MIPS-NEXT:  MIPS_BASE_ADDRESS    0x0000000087654321
-# MIPS-NEXT:  MIPS_MSYM            0x0000000000001000
-# MIPS-NEXT:  MIPS_CONFLICT        0x0000000000001000
-# MIPS-NEXT:  MIPS_LIBLIST         0x0000000000001000
-# MIPS-NEXT:  MIPS_LOCAL_GOTNO     0x0000000000000001
-# MIPS-NEXT:  MIPS_CONFLICTNO      0x0000000000000001
-# MIPS-NEXT:  MIPS_LIBLISTNO       0x0000000000000001
-# MIPS-NEXT:  MIPS_SYMTABNO        0x0000000000000001
-# MIPS-NEXT:  MIPS_UNREFEXTNO      0x0000000000000000
-# MIPS-NEXT:  MIPS_GOTSYM          0x0000000000000000
-# MIPS-NEXT:  MIPS_HIPAGENO        0x0000000088776655
-# MIPS-NEXT:  MIPS_RLD_MAP         0x0000000000001000
-# MIPS-NEXT:  MIPS_DELTA_CLASS     0x0000000000001000
-# MIPS-NEXT:  MIPS_DELTA_CLASS_NO  0x0000000000000001
-# MIPS-NEXT:  MIPS_DELTA_INSTANCE  0x0000000000001000
-## FIXME: llvm-objdump does not print spaces after MIPS_DELTA_INSTANCE_NO, MIPS_PROTECTED_GOTIDX
-##        and other long tags. The output looks broken because of that.
-# MIPS-NEXT:  MIPS_DELTA_INSTANCE_NO0x0000000000000001
-# MIPS-NEXT:  MIPS_DELTA_RELOC     0x0000000000001000
-# MIPS-NEXT:  MIPS_DELTA_RELOC_NO  0x0000000000000001
-# MIPS-NEXT:  MIPS_DELTA_SYM       0x0000000000001000
-# MIPS-NEXT:  MIPS_DELTA_SYM_NO    0x0000000000000001
-# MIPS-NEXT:  MIPS_DELTA_CLASSSYM  0x0000000000001000
-# MIPS-NEXT:  MIPS_DELTA_CLASSSYM_NO0x0000000000000001
-# MIPS-NEXT:  MIPS_CXX_FLAGS       0x0000000088887777
-# MIPS-NEXT:  MIPS_PIXIE_INIT      0x0000000000001000
-# MIPS-NEXT:  MIPS_LOCALPAGE_GOTIDX0x0000000000000001
-# MIPS-NEXT:  MIPS_LOCAL_GOTIDX    0x0000000000000001
-# MIPS-NEXT:  MIPS_HIDDEN_GOTIDX   0x0000000000000001
-# MIPS-NEXT:  MIPS_PROTECTED_GOTIDX0x0000000000000001
-# MIPS-NEXT:  MIPS_OPTIONS         0x0000000000001000
-# MIPS-NEXT:  MIPS_INTERFACE       0x0000000000001000
-# MIPS-NEXT:  MIPS_DYNSTR_ALIGN    0x0000000088888888
-# MIPS-NEXT:  MIPS_INTERFACE_SIZE  0x0000000000000010
-# MIPS-NEXT:  MIPS_RLD_TEXT_RESOLVE_ADDR0x0000000000000008
-# MIPS-NEXT:  MIPS_PERF_SUFFIX     0x0000000000000000
-# MIPS-NEXT:  MIPS_COMPACT_SIZE    0x0000000000000010
-# MIPS-NEXT:  MIPS_GP_VALUE        0x0000000000000001
-# MIPS-NEXT:  MIPS_AUX_DYNAMIC     0x0000000000001000
-# MIPS-NEXT:  MIPS_PLTGOT          0x0000000000001000
-# MIPS-NEXT:  MIPS_RWPLT           0x0000000000001000
-# MIPS-NEXT:  MIPS_RLD_MAP_REL     0x0000000000001000
+# MIPS-NEXT:  MIPS_RLD_VERSION           0x0000000012345678
+# MIPS-NEXT:  MIPS_TIME_STAMP            0x0000000011223344
+# MIPS-NEXT:  MIPS_ICHECKSUM             0x0000000011112222
+# MIPS-NEXT:  MIPS_IVERSION              0x0000000000000001
+# MIPS-NEXT:  MIPS_FLAGS                 0x0000000011111111
+# MIPS-NEXT:  MIPS_BASE_ADDRESS          0x0000000087654321
+# MIPS-NEXT:  MIPS_MSYM                  0x0000000000001000
+# MIPS-NEXT:  MIPS_CONFLICT              0x0000000000001000
+# MIPS-NEXT:  MIPS_LIBLIST               0x0000000000001000
+# MIPS-NEXT:  MIPS_LOCAL_GOTNO           0x0000000000000001
+# MIPS-NEXT:  MIPS_CONFLICTNO            0x0000000000000001
+# MIPS-NEXT:  MIPS_LIBLISTNO             0x0000000000000001
+# MIPS-NEXT:  MIPS_SYMTABNO              0x0000000000000001
+# MIPS-NEXT:  MIPS_UNREFEXTNO            0x0000000000000000
+# MIPS-NEXT:  MIPS_GOTSYM                0x0000000000000000
+# MIPS-NEXT:  MIPS_HIPAGENO              0x0000000088776655
+# MIPS-NEXT:  MIPS_RLD_MAP               0x0000000000001000
+# MIPS-NEXT:  MIPS_DELTA_CLASS           0x0000000000001000
+# MIPS-NEXT:  MIPS_DELTA_CLASS_NO        0x0000000000000001
+# MIPS-NEXT:  MIPS_DELTA_INSTANCE        0x0000000000001000
+# MIPS-NEXT:  MIPS_DELTA_INSTANCE_NO     0x0000000000000001
+# MIPS-NEXT:  MIPS_DELTA_RELOC           0x0000000000001000
+# MIPS-NEXT:  MIPS_DELTA_RELOC_NO        0x0000000000000001
+# MIPS-NEXT:  MIPS_DELTA_SYM             0x0000000000001000
+# MIPS-NEXT:  MIPS_DELTA_SYM_NO          0x0000000000000001
+# MIPS-NEXT:  MIPS_DELTA_CLASSSYM        0x0000000000001000
+# MIPS-NEXT:  MIPS_DELTA_CLASSSYM_NO     0x0000000000000001
+# MIPS-NEXT:  MIPS_CXX_FLAGS             0x0000000088887777
+# MIPS-NEXT:  MIPS_PIXIE_INIT            0x0000000000001000
+# MIPS-NEXT:  MIPS_LOCALPAGE_GOTIDX      0x0000000000000001
+# MIPS-NEXT:  MIPS_LOCAL_GOTIDX          0x0000000000000001
+# MIPS-NEXT:  MIPS_HIDDEN_GOTIDX         0x0000000000000001
+# MIPS-NEXT:  MIPS_PROTECTED_GOTIDX      0x0000000000000001
+# MIPS-NEXT:  MIPS_OPTIONS               0x0000000000001000
+# MIPS-NEXT:  MIPS_INTERFACE             0x0000000000001000
+# MIPS-NEXT:  MIPS_DYNSTR_ALIGN          0x0000000088888888
+# MIPS-NEXT:  MIPS_INTERFACE_SIZE        0x0000000000000010
+# MIPS-NEXT:  MIPS_RLD_TEXT_RESOLVE_ADDR 0x0000000000000008
+# MIPS-NEXT:  MIPS_PERF_SUFFIX           0x0000000000000000
+# MIPS-NEXT:  MIPS_COMPACT_SIZE          0x0000000000000010
+# MIPS-NEXT:  MIPS_GP_VALUE              0x0000000000000001
+# MIPS-NEXT:  MIPS_AUX_DYNAMIC           0x0000000000001000
+# MIPS-NEXT:  MIPS_PLTGOT                0x0000000000001000
+# MIPS-NEXT:  MIPS_RWPLT                 0x0000000000001000
+# MIPS-NEXT:  MIPS_RLD_MAP_REL           0x0000000000001000
 
 --- !ELF
 FileHeader:

diff  --git a/llvm/test/tools/llvm-objdump/elf-dynamic-section.test b/llvm/test/tools/llvm-objdump/elf-dynamic-section.test
index 05f21f6072ab..8688f0db1e31 100644
--- a/llvm/test/tools/llvm-objdump/elf-dynamic-section.test
+++ b/llvm/test/tools/llvm-objdump/elf-dynamic-section.test
@@ -430,3 +430,45 @@ ProgramHeaders:
     VAddr: 0x1010
     Sections:
       - Section: .dynamic
+
+## When printing the value column we want to have the minimal possible indentation.
+## Use an arbitrary dynamic tag to demonstrate that.
+
+# RUN: yaml2obj --docnum=3 %s -o %t3
+# RUN: llvm-objdump -p %t3 | FileCheck %s --strict-whitespace --check-prefix=INDENT
+
+# RUN: yaml2obj --docnum=4 %s -o %t4
+# RUN: llvm-objdump -p %t4 | FileCheck %s --strict-whitespace --check-prefix=INDENT
+
+# INDENT: {{^}}Dynamic Section:
+# INDENT: {{^}}  NEEDED 0x
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name: .dynamic
+    Type: SHT_DYNAMIC
+    Entries:
+     - Tag:   DT_NEEDED
+       Value: 0x1
+     - Tag:   DT_NULL
+       Value: 0x0
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS32
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_386
+Sections:
+  - Name: .dynamic
+    Type: SHT_DYNAMIC
+    Entries:
+     - Tag:   DT_NEEDED
+       Value: 0x1
+     - Tag:   DT_NULL
+       Value: 0x0

diff  --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp
index abfe08346bbd..f2d6754b4031 100644
--- a/llvm/tools/llvm-objdump/ELFDump.cpp
+++ b/llvm/tools/llvm-objdump/ELFDump.cpp
@@ -162,13 +162,20 @@ template <class ELFT>
 void printDynamicSection(const ELFFile<ELFT> *Elf, StringRef Filename) {
   ArrayRef<typename ELFT::Dyn> DynamicEntries =
       unwrapOrError(Elf->dynamicEntries(), Filename);
+
+  // Find the maximum tag name length to format the value column properly.
+  size_t MaxLen = 0;
+  for (const typename ELFT::Dyn &Dyn : DynamicEntries)
+    MaxLen = std::max(MaxLen, Elf->getDynamicTagAsString(Dyn.d_tag).size());
+  std::string TagFmt = "  %-" + std::to_string(MaxLen) + "s ";
+
   outs() << "Dynamic Section:\n";
   for (const typename ELFT::Dyn &Dyn : DynamicEntries) {
     if (Dyn.d_tag == ELF::DT_NULL)
       continue;
 
     std::string Str = Elf->getDynamicTagAsString(Dyn.d_tag);
-    outs() << format("  %-21s", Str.c_str());
+    outs() << format(TagFmt.c_str(), Str.c_str());
 
     const char *Fmt =
         ELFT::Is64Bits ? "0x%016" PRIx64 "\n" : "0x%08" PRIx64 "\n";


        


More information about the llvm-commits mailing list