diff options
author | Fangrui Song <maskray@google.com> | 2019-04-26 16:01:48 +0000 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2019-04-26 16:01:48 +0000 |
commit | 0bf06a8f59b0074a60871865e828d92db8930c59 (patch) | |
tree | afe7ff54777d64bca408d7a6a10f3f0dae39a7d2 /llvm/tools/llvm-nm/llvm-nm.cpp | |
parent | 51a4a0d68f3761a0a0317b3bedde06a3cb44ee3d (diff) | |
download | bcm5719-llvm-0bf06a8f59b0074a60871865e828d92db8930c59.tar.gz bcm5719-llvm-0bf06a8f59b0074a60871865e828d92db8930c59.zip |
[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.
llvm-svn: 359311
Diffstat (limited to 'llvm/tools/llvm-nm/llvm-nm.cpp')
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 25 |
1 files changed, 6 insertions, 19 deletions
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 139fcc3ea87..8f4108d9d88 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -936,27 +936,14 @@ static char getSymbolNMTypeChar(ELFObjectFileBase &Obj, 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) { |