[yaml2obj] - Stop using square brackets for unique suffixes.
authorGeorgii Rymar <grimar@accesssoftek.com>
Mon, 18 May 2020 13:43:13 +0000 (16:43 +0300)
committerGeorgii Rymar <grimar@accesssoftek.com>
Tue, 19 May 2020 09:59:13 +0000 (12:59 +0300)
For describing section/symbol names we can use unique suffixes,
e.g:

```
- Name: '.foo [1]`
- Name: '.foo [2]`
```

It can be a problem (see https://reviews.llvm.org/D79984#inline-734829),
because `[]` are sometimes used to describe a macros:

```
- Name: "[[a0]]"
```

Seems the better approach is to use something else, like "()".
This patch does it and refactors the code related.

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

14 files changed:
llvm/include/llvm/ObjectYAML/ELFYAML.h
llvm/lib/ObjectYAML/ELFEmitter.cpp
llvm/test/Object/X86/obj2yaml-dup-section-name.s
llvm/test/tools/llvm-dwarfdump/X86/section_sizes_elf.test
llvm/test/tools/llvm-gsymutil/X86/elf-dwarf.yaml
llvm/test/tools/llvm-objcopy/ELF/strip-dwo-groups.test
llvm/test/tools/llvm-readobj/ELF/stack-sizes.test
llvm/test/tools/obj2yaml/ELF/duplicate-symbol-and-section-names.yaml
llvm/test/tools/obj2yaml/ELF/program-headers.yaml
llvm/test/tools/yaml2obj/ELF/call-graph-profile-section.yaml
llvm/test/tools/yaml2obj/ELF/duplicate-section-names.yaml
llvm/test/tools/yaml2obj/ELF/duplicate-symbol-names.yaml
llvm/test/tools/yaml2obj/ELF/stack-sizes.yaml
llvm/tools/obj2yaml/elf2yaml.cpp

index 7165caf..1522434 100644 (file)
@@ -26,6 +26,7 @@ namespace llvm {
 namespace ELFYAML {
 
 StringRef dropUniqueSuffix(StringRef S);
+std::string appendUniqueSuffix(StringRef Name, const Twine& Msg);
 
 // These types are invariant across 32/64-bit ELF, so for simplicity just
 // directly give them their exact sizes. We don't need to worry about
index acdc307..2b1de2f 100644 (file)
@@ -401,8 +401,19 @@ bool ELFState<ELFT>::initImplicitHeader(ContiguousBlobAccumulator &CBA,
   return true;
 }
 
+constexpr StringRef SuffixStart = " (";
+constexpr char SuffixEnd = ')';
+
+std::string llvm::ELFYAML::appendUniqueSuffix(StringRef Name,
+                                              const Twine &Msg) {
+  return (Name + SuffixStart + Msg + Twine(SuffixEnd)).str();
+}
+
 StringRef llvm::ELFYAML::dropUniqueSuffix(StringRef S) {
-  size_t SuffixPos = S.rfind(" [");
+  if (S.empty() || S.back() != SuffixEnd)
+    return S;
+
+  size_t SuffixPos = S.rfind(SuffixStart);
   if (SuffixPos == StringRef::npos)
     return S;
   return S.substr(0, SuffixPos);
index 0c480b4..17fc7a4 100644 (file)
@@ -9,16 +9,16 @@
 # CHECK: - Name:            .text.foo{{$}}
 # CHECK: - Name:            .rela.text.foo{{$}}
 # CHECK:   Info:            .text.foo{{$}}
-# CHECK: - Name:            '.group [1]'
+# CHECK: - Name:            '.group (1)'
 # CHECK:   Members:
-# CHECK:     - SectionOrType:   '.text.foo [1]'
-# CHECK:     - SectionOrType:   '.rela.text.foo [1]'
-# CHECK: - Name:            '.text.foo [1]'
-# CHECK: - Name:            '.rela.text.foo [1]'
-# CHECK:   Info:            '.text.foo [1]'
+# CHECK:     - SectionOrType:   '.text.foo (1)'
+# CHECK:     - SectionOrType:   '.rela.text.foo (1)'
+# CHECK: - Name:            '.text.foo (1)'
+# CHECK: - Name:            '.rela.text.foo (1)'
+# CHECK:   Info:            '.text.foo (1)'
 # CHECK: Symbols:
 # CHECK:   Section:         .group{{$}}
-# CHECK:   Section:         '.group [1]'
+# CHECK:   Section:         '.group (1)'
 
 
         .section        .text.foo,"axG",@progbits,sym1,comdat
index ad1763f..5b2bb53 100644 (file)
@@ -39,7 +39,7 @@ Sections:
   - Name: .debug_type
     Type: SHT_PROGBITS
     Size: 13
-  - Name: .debug_type [1]
+  - Name: .debug_type (1)
     Type: SHT_PROGBITS
     Size: 13
   - Name: .debug_foo
index bf964d9..3838571 100644 (file)
@@ -571,7 +571,7 @@ Symbols:
   - Name:            main.cpp
     Type:            STT_FILE
     Index:           SHN_ABS
-  - Name:            'crtstuff.c [1]'
+  - Name:            'crtstuff.c (1)'
     Type:            STT_FILE
     Index:           SHN_ABS
   - Name:            __FRAME_END__
index eed3100..e3bdc35 100644 (file)
@@ -55,7 +55,7 @@ Sections:
   - Name:  .text.group1
     Type:  SHT_PROGBITS
     Flags: [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
-  - Name: '.group [1]'
+  - Name: '.group (1)'
     Type: SHT_GROUP
     Link: .symtab
     Info: group2
index c315749..16b92bb 100644 (file)
@@ -48,7 +48,7 @@ Sections:
       - Size: 0x10
       - Size: 0x20
     Link:    .text
-  - Name:    '.stack_sizes [1]'
+  - Name:    '.stack_sizes (1)'
     Type:    SHT_PROGBITS
     Entries:
       - Address: 0x20
@@ -67,9 +67,9 @@ Sections:
         Addend: 16
         Symbol: .text
         Type:   R_X86_64_64
-  - Name:   '.rela.stack_sizes [1]'
+  - Name:   '.rela.stack_sizes (1)'
     Type:   SHT_RELA
-    Info:   '.stack_sizes [1]'
+    Info:   '.stack_sizes (1)'
     Relocations:
       - Offset: 0
         Symbol: separate_text_section_baz
index 56c0774..97f90bc 100644 (file)
 # CASE1-NEXT: Sections:
 # CASE1-NEXT:   - Name: .foo
 # CASE1-NEXT:     Type: SHT_PROGBITS
-# CASE1-NEXT:   - Name: '.foo [1]'
+# CASE1-NEXT:   - Name: '.foo (1)'
 # CASE1-NEXT:     Type: SHT_PROGBITS
-# CASE1-NEXT:   - Name: '.foo [2]'
+# CASE1-NEXT:   - Name: '.foo (2)'
 # CASE1-NEXT:     Type: SHT_PROGBITS
 # CASE1-NEXT:   - Name: .bar
 # CASE1-NEXT:     Type: SHT_PROGBITS
-# CASE1-NEXT:   - Name: '.bar [1]'
+# CASE1-NEXT:   - Name: '.bar (1)'
 # CASE1-NEXT:     Type: SHT_PROGBITS
-# CASE1-NEXT:   - Name: '.bar [2]'
+# CASE1-NEXT:   - Name: '.bar (2)'
 # CASE1-NEXT:     Type: SHT_PROGBITS
 # CASE1-NEXT: Symbols:
 # CASE1-NEXT:   - Name: localfoo
-# CASE1-NEXT:   - Name: 'localfoo [1]'
-# CASE1-NEXT:   - Name: 'localfoo [2]'
+# CASE1-NEXT:   - Name: 'localfoo (1)'
+# CASE1-NEXT:   - Name: 'localfoo (2)'
 # CASE1-NEXT:   - Name: localbar
-# CASE1-NEXT:   - Name: 'localbar [1]'
-# CASE1-NEXT:   - Name: 'localbar [2]'
+# CASE1-NEXT:   - Name: 'localbar (1)'
+# CASE1-NEXT:   - Name: 'localbar (2)'
 # CASE1-NEXT: ...
 
 --- !ELF
@@ -59,23 +59,23 @@ FileHeader:
 Sections:
   - Name: .foo
     Type: SHT_PROGBITS
-  - Name: '.foo [555]'
+  - Name: '.foo (555)'
     Type: SHT_PROGBITS
-  - Name: '.foo [random_tag]'
+  - Name: '.foo (random_tag)'
     Type: SHT_PROGBITS
   - Name: .bar
     Type: SHT_PROGBITS
-  - Name: '.bar [666]'
+  - Name: '.bar (666)'
     Type: SHT_PROGBITS
-  - Name: '.bar [random_tag]'
+  - Name: '.bar (random_tag)'
     Type: SHT_PROGBITS
 Symbols:
-  - Name: 'localfoo [111]'
-  - Name: 'localfoo [222]'
-  - Name: 'localfoo [random_tag]' 
-  - Name: 'localbar [333]'
-  - Name: 'localbar [444]'
-  - Name: 'localbar [random_tag]' 
+  - Name: 'localfoo (111)'
+  - Name: 'localfoo (222)'
+  - Name: 'localfoo (random_tag)'
+  - Name: 'localbar (333)'
+  - Name: 'localbar (444)'
+  - Name: 'localbar (random_tag)'
 
 ## Check we can refer to symbols with the same
 ## name from relocations.
@@ -84,14 +84,14 @@ Symbols:
 # RUN: obj2yaml %t2 | FileCheck %s --check-prefix=CASE2
 
 # CASE2:      Relocations:
-# CASE2-NEXT:  - Symbol: 'foo [1]'
+# CASE2-NEXT:  - Symbol: 'foo (1)'
 # CASE2-NEXT:    Type:   R_X86_64_PC32
 # CASE2-NEXT:  - Offset: 0x0000000000000004
 # CASE2-NEXT:    Symbol: foo
 # CASE2-NEXT:    Type:   R_X86_64_PC32
 # CASE2-NEXT: Symbols:
 # CASE2-NEXT:  - Name: foo
-# CASE2-NEXT:  - Name: 'foo [1]'
+# CASE2-NEXT:  - Name: 'foo (1)'
   
 --- !ELF
 FileHeader:
@@ -109,13 +109,13 @@ Sections:
     Link: .symtab
     Relocations:
       - Type: R_X86_64_PC32
-        Symbol: 'foo [1]'
+        Symbol: 'foo (1)'
       - Type: R_X86_64_PC32
         Offset: 4
         Symbol: foo
 Symbols:
   - Name: foo
-  - Name: 'foo [1]'
+  - Name: 'foo (1)'
 
 ## Check obj2yaml does not add a suffix to a name if the
 ## symbol is in .symtab and .dynsym at the same time.
index 740d349..2a240d1 100644 (file)
@@ -55,7 +55,7 @@
 # YAML-NEXT:  - Type:  PT_LOAD
 # YAML-NEXT:    Flags: [ PF_R ]
 # YAML-NEXT:    Sections:
-# YAML-NEXT:      - Section: '.foo [1]'
+# YAML-NEXT:      - Section: '.foo (1)'
 # YAML-NEXT:      - Section: .baz
 # YAML-NEXT:    VAddr: 0x0000000000002000
 # YAML-NEXT:    Align: 0x0000000000001000
@@ -123,7 +123,7 @@ ProgramHeaders:
   - Type:  PT_LOAD
     Flags: [ PF_R ]
     Sections:
-      - Section: '.foo [1]'
+      - Section: '.foo (1)'
       - Section: .baz
     VAddr: 0x2000
     Align: 0x1000
@@ -209,7 +209,7 @@ Sections:
     Flags:   [ SHF_ALLOC, SHF_EXECINSTR ]
     Address: 0x1008
     Size:    0x8
-  - Name:    '.foo [1]'
+  - Name:    '.foo (1)'
     Type:    SHT_PROGBITS
     Flags:   [ SHF_ALLOC ]
     Address: 0x2000
index a4ca37b..7885292 100644 (file)
@@ -142,12 +142,12 @@ Sections:
         Weight: 10
 ## Case 2: Test we can refer to symbols with suffixes.
       - From:   foo
-        To:     'foo [1]'
+        To:     'foo (1)'
         Weight: 30
 Symbols:
   - Name: foo
   - Name: bar
-  - Name: 'foo [1]'
+  - Name: 'foo (1)'
 
 ## Check we can describe SHT_LLVM_CALL_GRAPH_PROFILE sections using the "Content" tag.
 # RUN: yaml2obj --docnum=5 %s -o %t.content
index e681ff1..93605b2 100644 (file)
@@ -2,12 +2,16 @@
 ## containing sections with duplicate names (but different name suffixes).
 
 # RUN: yaml2obj --docnum=1 %s -o %t1
-# RUN: llvm-readobj -s %t1 | FileCheck %s --check-prefix=CASE1
+# RUN: llvm-readelf -sections %t1 | FileCheck %s --check-prefix=CASE1
 
-# CASE1: Name: .foo1 (
-# CASE1: Name: .foo (
-# CASE1: Name: .foo (
-# CASE1: Name: .foo2 (
+# CASE1:      [Nr] Name    Type
+# CASE1:      [ 1] .foo1   PROGBITS
+# CASE1-NEXT: [ 2] .foo    PROGBITS
+# CASE1-NEXT: [ 3] .foo    PROGBITS
+# CASE1-NEXT: [ 4] .foo2   PROGBITS
+# CASE1-NEXT: [ 5] .foo2 ( PROGBITS
+# CASE1-NEXT: [ 6] .foo2 ) PROGBITS
+# CASE1-NEXT: [ 7] .foo2   PROGBITS
 
 --- !ELF
 FileHeader:
@@ -20,17 +24,23 @@ Sections:
     Type: SHT_PROGBITS
   - Name: .foo
     Type: SHT_PROGBITS
-  - Name: '.foo [1]'
+  - Name: '.foo (1)'
     Type: SHT_PROGBITS
   - Name: .foo2
     Type: SHT_PROGBITS
+  - Name: '.foo2 ('
+    Type: SHT_PROGBITS
+  - Name: '.foo2 )'
+    Type: SHT_PROGBITS
+  - Name: '.foo2 ()'
+    Type: SHT_PROGBITS
 
 ## Check that yaml2obj reports an error in case we have
 ## sections with equal names and suffixes.
 
 # RUN: not yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --check-prefix=CASE2
-# CASE2: error: repeated section/fill name: '.foo [1]' at YAML section/fill number 2
-# CASE2: error: repeated section/fill name: '.foo [1]' at YAML section/fill number 3
+# CASE2: error: repeated section/fill name: '.foo (1)' at YAML section/fill number 2
+# CASE2: error: repeated section/fill name: '.foo (1)' at YAML section/fill number 3
 
 --- !ELF
 FileHeader:
@@ -39,11 +49,11 @@ FileHeader:
   Type:    ET_REL
   Machine: EM_X86_64
 Sections:
-  - Name: '.foo [1]'
+  - Name: '.foo (1)'
     Type: SHT_PROGBITS
-  - Name: '.foo [1]'
+  - Name: '.foo (1)'
     Type: SHT_PROGBITS
-  - Name: '.foo [1]'
+  - Name: '.foo (1)'
     Type: SHT_PROGBITS
 
 ## Check that yaml2obj reports an error in case we have
@@ -102,13 +112,13 @@ FileHeader:
 Sections:
   - Name: .foo
     Type: SHT_PROGBITS
-  - Name: '.foo [1]'
+  - Name: '.foo (1)'
     Type: SHT_PROGBITS
 Symbols:
   - Name:    foo
     Section: .foo
   - Name:    bar
-    Section: '.foo [1]'
+    Section: '.foo (1)'
 
 ## Check that yaml2obj can produce SHT_GROUP sections that
 ## reference sections and symbols with name suffixes.
@@ -156,16 +166,16 @@ Sections:
       - SectionOrType: .text.foo
   - Name: .text.foo
     Type: SHT_PROGBITS
-  - Name: '.group [1]'
+  - Name: '.group (1)'
     Type: SHT_GROUP
-    Info: 'foo [1]'
+    Info: 'foo (1)'
     Members:
       - SectionOrType: GRP_COMDAT
-      - SectionOrType: '.text.foo [1]'
-  - Name: '.text.foo [1]'
+      - SectionOrType: '.text.foo (1)'
+  - Name: '.text.foo (1)'
     Type: SHT_PROGBITS
 Symbols:
   - Name:    foo
     Section: .text.foo
-  - Name:    'foo [1]'
-    Section: '.text.foo [1]'
+  - Name:    'foo (1)'
+    Section: '.text.foo (1)'
index a889254..20c1dcb 100644 (file)
@@ -15,13 +15,13 @@ FileHeader:
   Machine: EM_X86_64
 Symbols:
   - Name: localfoo
-  - Name: 'localfoo [1]'
+  - Name: 'localfoo (1)'
 
 ## Check that yaml2obj reports an error when we have
 ## symbols with equal names and suffixes.
 
 # RUN: not yaml2obj --docnum=2 %s 2>&1| FileCheck %s --check-prefix=CASE2
-# CASE2-COUNT-2: error: repeated symbol name: 'localfoo [1]'
+# CASE2-COUNT-2: error: repeated symbol name: 'localfoo (1)'
 
 --- !ELF
 FileHeader:
@@ -30,9 +30,9 @@ FileHeader:
   Type:    ET_REL
   Machine: EM_X86_64
 Symbols:
-  - Name: 'localfoo [1]'
-  - Name: 'localfoo [1]'
-  - Name: 'localfoo [1]'
+  - Name: 'localfoo (1)'
+  - Name: 'localfoo (1)'
+  - Name: 'localfoo (1)'
 
 ## Check that yaml2obj reports an error when we have
 ## symbols without suffixes in the names and their
@@ -94,7 +94,7 @@ Sections:
         Symbol: foo
       - Offset: 0x1
         Type:   R_X86_64_NONE
-        Symbol: 'foo [1]'
+        Symbol: 'foo (1)'
 Symbols:
   - Name: foo
-  - Name: 'foo [1]'
+  - Name: 'foo (1)'
index 12a88bd..28ed9dc 100644 (file)
@@ -50,15 +50,15 @@ FileHeader:
   Machine: EM_X86_64
 Sections:
 ## Valid.
-  - Name:    '.stack_sizes [1]'
+  - Name:    '.stack_sizes (1)'
     Type:    SHT_PROGBITS
     Content: "100000000000000020"
 ## Truncated.
-  - Name:    '.stack_sizes [2]'
+  - Name:    '.stack_sizes (2)'
     Type:    SHT_PROGBITS
     Content: "1000000000000000"
 ## Empty.
-  - Name:    '.stack_sizes [3]'
+  - Name:    '.stack_sizes (3)'
     Type:    SHT_PROGBITS
     Content: ""
 
@@ -287,12 +287,12 @@ FileHeader:
   Type:    ET_EXEC
   Machine: EM_X86_64
 Sections:
-  - Name:    '.stack_sizes [1]'
+  - Name:    '.stack_sizes (1)'
     Type:    SHT_PROGBITS
     Entries:
       - Address: 0x10
         Size:    0x20
-  - Name:    '.stack_sizes [2]'
+  - Name:    '.stack_sizes (2)'
     Type:    SHT_PROGBITS
     Entries:
       - Address: 0x30
index fe3f36f..8602477 100644 (file)
@@ -129,7 +129,7 @@ ELFDumper<ELFT>::getUniquedSectionName(const Elf_Shdr *Sec) {
 
   auto It = UsedSectionNames.insert({Name, 0});
   if (!It.second)
-    Ret = (Name + " [" + Twine(++It.first->second) + "]").str();
+    Ret = ELFYAML::appendUniqueSuffix(Name, Twine(++It.first->second));
   else
     Ret = std::string(Name);
   return Ret;
@@ -161,7 +161,7 @@ ELFDumper<ELFT>::getUniquedSymbolName(const Elf_Sym *Sym, StringRef StrTable,
     auto It = UsedSymbolNames.insert({Name, 0});
     if (!It.second)
       SymbolNames[Index] =
-          (Name + " [" + Twine(++It.first->second) + "]").str();
+          ELFYAML::appendUniqueSuffix(Name, Twine(++It.first->second));
     else
       SymbolNames[Index] = std::string(Name);
     return SymbolNames[Index];