[llvm] r359311 - [llvm-nm] Fix handling of symbol types 't' 'd' 'r'

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 26 09:01:48 PDT 2019


Author: maskray
Date: Fri Apr 26 09:01:48 2019
New Revision: 359311

URL: http://llvm.org/viewvc/llvm-project?rev=359311&view=rev
Log:
[llvm-nm] Fix handling of symbol types 't' 'd' 'r'

In addition, fix and convert the two tests to yaml2obj based. This
allows us to delete two executables.

X86/weak.test: 'v' was not tested
X86/init-fini.test: symbol types of __bss_start _edata _end were wrong
  GNU nm reports __init_array_start as 't', and __preinit_array_start as 'd'.
  __init_array_start is 't' just because its section ".init_array" starts with ".init"

  'd' makes more sense and allows us to drop the weird SHT_INIT_ARRAY rule.
  So, change __init_array_start to 'd' instead.

Removed:
    llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64
    llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
Modified:
    llvm/trunk/test/tools/llvm-nm/X86/init-fini.test
    llvm/trunk/test/tools/llvm-nm/X86/weak.test
    llvm/trunk/tools/llvm-nm/llvm-nm.cpp

Removed: llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64?rev=359310&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64 (original) and llvm/trunk/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64 (removed) differ

Removed: llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64?rev=359310&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 (original) and llvm/trunk/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 (removed) differ

Modified: llvm/trunk/test/tools/llvm-nm/X86/init-fini.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/init-fini.test?rev=359311&r1=359310&r2=359311&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-nm/X86/init-fini.test (original)
+++ llvm/trunk/test/tools/llvm-nm/X86/init-fini.test Fri Apr 26 09:01:48 2019
@@ -1,8 +1,50 @@
-# RUN: llvm-nm -B -S %p/Inputs/init-fini.out.elf-x86_64 | FileCheck --match-full-lines %s
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-nm -B -S %t | FileCheck %s
+!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: .init_array
+    Type: SHT_INIT_ARRAY
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+  - Name: .preinit_array
+    Type: SHT_PREINIT_ARRAY
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+  - Name: .fini_array
+    Type: SHT_FINI_ARRAY
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+  - Name: .data
+    Type: SHT_PROGBITS
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+  - Name: .bss
+    Type: SHT_NOBITS
+    Flags: [ SHF_ALLOC, SHF_WRITE ]
+Symbols:
+  - Name:    __init_array_start
+    Section: .init_array
+  - Name:    __preinit_array_start
+    Section: .preinit_array
+  - Name:    __fini_array_start
+    Section: .fini_array
+  - Name:    __bss_start
+    Section: .bss
+    Binding: STB_GLOBAL
+  - Name:    _edata
+    Section: .data
+    Binding: STB_GLOBAL
+  - Name:    _end
+    Section: .bss
+    Binding: STB_GLOBAL
 
-CHECK: 00000000006000c2 0000000000000000 T __bss_start
-CHECK: 00000000006000c2 0000000000000000 t __init_array_end
-CHECK: 00000000006000ba 0000000000000000 t __init_array_start
-CHECK: 00000000006000c2 0000000000000000 T _edata
-CHECK: 00000000006000c8 0000000000000000 T _end
-CHECK: 00000000004000b0 0000000000000000 T _start
+# CHECK: B __bss_start
+# CHECK: d __fini_array_start
+# CHECK: d __init_array_start
+# CHECK: d __preinit_array_start
+# CHECK: D _edata
+# CHECK: B _end

Modified: llvm/trunk/test/tools/llvm-nm/X86/weak.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-nm/X86/weak.test?rev=359311&r1=359310&r2=359311&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-nm/X86/weak.test (original)
+++ llvm/trunk/test/tools/llvm-nm/X86/weak.test Fri Apr 26 09:01:48 2019
@@ -1,7 +1,36 @@
-# RUN: llvm-nm -B -S %p/Inputs/weak.obj.elf-x86_64 | FileCheck --match-full-lines %s
-# RUN: llvm-nm -W -B -S %p/Inputs/weak.obj.elf-x86_64 | count 0
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-nm -B -S %t | FileCheck --match-full-lines %s
+# RUN: llvm-nm -W -B -S %t | count 0
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name: .text
+    Type: SHT_PROGBITS
+  - Name: .data
+    Type: SHT_PROGBITS
+Symbols:
+  - Name:    weak_func
+    Type:    STT_FUNC
+    Section: .text
+    Binding: STB_WEAK
+    Size:    17
+  - Name:    weak_var
+    Type:    STT_OBJECT
+    Section: .data
+    Binding: STB_WEAK
+    Size:    4
+  - Name:    weak_extern_func
+    Type:    STT_FUNC
+    Binding: STB_WEAK
+  - Name:    weak_extern_var
+    Type:    STT_OBJECT
+    Binding: STB_WEAK
 
-CHECK:                  w weak_extern_func
-CHECK:                  w weak_extern_var
-CHECK: 0000000000000000 0000000000000011 W weak_func
-CHECK: 0000000000000000 0000000000000004 V weak_var
+# CHECK:                  w weak_extern_func
+# CHECK:                  v weak_extern_var
+# CHECK: 0000000000000000 0000000000000011 W weak_func
+# CHECK: 0000000000000000 0000000000000004 V weak_var

Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=359311&r1=359310&r2=359311&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)
+++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Fri Apr 26 09:01:48 2019
@@ -936,27 +936,14 @@ static char getSymbolNMTypeChar(ELFObjec
 
   elf_section_iterator SecI = *SecIOrErr;
   if (SecI != Obj.section_end()) {
-    switch (SecI->getType()) {
-    case ELF::SHT_PROGBITS:
-    case ELF::SHT_DYNAMIC:
-      switch (SecI->getFlags()) {
-      case (ELF::SHF_ALLOC | ELF::SHF_EXECINSTR):
-        return 't';
-      case (ELF::SHF_TLS | ELF::SHF_ALLOC | ELF::SHF_WRITE):
-      case (ELF::SHF_ALLOC | ELF::SHF_WRITE):
-        return 'd';
-      case ELF::SHF_ALLOC:
-      case (ELF::SHF_ALLOC | ELF::SHF_MERGE):
-      case (ELF::SHF_ALLOC | ELF::SHF_MERGE | ELF::SHF_STRINGS):
-        return 'r';
-      }
-      break;
-    case ELF::SHT_NOBITS:
+    uint32_t Type = SecI->getType();
+    uint64_t Flags = SecI->getFlags();
+    if (Type == ELF::SHT_NOBITS)
       return 'b';
-    case ELF::SHT_INIT_ARRAY:
-    case ELF::SHT_FINI_ARRAY:
+    if (Flags & ELF::SHF_EXECINSTR)
       return 't';
-    }
+    if (Flags & ELF::SHF_ALLOC)
+      return Flags & ELF::SHF_WRITE ? 'd' : 'r';
   }
 
   if (SymI->getELFType() == ELF::STT_SECTION) {




More information about the llvm-commits mailing list