diff --git a/llvm/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64 b/llvm/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64 new file mode 100755 index 000000000000..b5c74f234c60 Binary files /dev/null and b/llvm/test/tools/llvm-nm/X86/Inputs/init-fini.out.elf-x86_64 differ diff --git a/llvm/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 b/llvm/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 new file mode 100644 index 000000000000..8aa41bf4f37f Binary files /dev/null and b/llvm/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 differ diff --git a/llvm/test/tools/llvm-nm/X86/init-fini.test b/llvm/test/tools/llvm-nm/X86/init-fini.test index 80a81ba0d33f..86afc711c4ea 100644 --- a/llvm/test/tools/llvm-nm/X86/init-fini.test +++ b/llvm/test/tools/llvm-nm/X86/init-fini.test @@ -1,50 +1,8 @@ -# 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 +# RUN: llvm-nm -B -S %p/Inputs/init-fini.out.elf-x86_64 | FileCheck --match-full-lines %s -# 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 +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 diff --git a/llvm/test/tools/llvm-nm/X86/weak.test b/llvm/test/tools/llvm-nm/X86/weak.test index 4fc03eaffb90..8d06f4fb029e 100644 --- a/llvm/test/tools/llvm-nm/X86/weak.test +++ b/llvm/test/tools/llvm-nm/X86/weak.test @@ -1,36 +1,7 @@ -# 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 +# 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 -# CHECK: w weak_extern_func -# CHECK: v weak_extern_var -# CHECK: 0000000000000000 0000000000000011 W weak_func -# CHECK: 0000000000000000 0000000000000004 V weak_var +CHECK: w weak_extern_func +CHECK: w weak_extern_var +CHECK: 0000000000000000 0000000000000011 W weak_func +CHECK: 0000000000000000 0000000000000004 V weak_var diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 336167f34bb7..9b72c300726a 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -901,26 +901,43 @@ static char getSymbolNMTypeChar(ELFObjectFileBase &Obj, elf_section_iterator SecI = *SecIOrErr; if (SecI != Obj.section_end()) { - uint32_t Type = SecI->getType(); - uint64_t Flags = SecI->getFlags(); - if (Type == ELF::SHT_NOBITS) + 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: return 'b'; - if (Flags & ELF::SHF_EXECINSTR) + case ELF::SHT_INIT_ARRAY: + case ELF::SHT_FINI_ARRAY: return 't'; - if (Flags & ELF::SHF_ALLOC) - return Flags & ELF::SHF_WRITE ? 'd' : 'r'; + } + } + + if (SymI->getELFType() == ELF::STT_SECTION) { Expected Name = SymI->getName(); if (!Name) { consumeError(Name.takeError()); return '?'; } - if (Name->startswith(".debug")) - return 'N'; - if (!(Flags & ELF::SHF_WRITE)) - return 'n'; + return StringSwitch(*Name) + .StartsWith(".debug", 'N') + .StartsWith(".note", 'n') + .StartsWith(".comment", 'n') + .Default('?'); } - return '?'; + return 'n'; } static char getSymbolNMTypeChar(COFFObjectFile &Obj, symbol_iterator I) {