diff options
author | Fangrui Song <maskray@google.com> | 2019-12-21 21:53:22 -0800 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2019-12-25 09:47:53 -0800 |
commit | ba1cdba4c48cfee5e400e103af8353f4901ecb9a (patch) | |
tree | 5ff6f3bca211351d7d2a9942b8cd0fa8a6da3861 | |
parent | aff6c9db9a96b763a03bde729894d3e1dcfb0be5 (diff) | |
download | bcm5719-llvm-ba1cdba4c48cfee5e400e103af8353f4901ecb9a.tar.gz bcm5719-llvm-ba1cdba4c48cfee5e400e103af8353f4901ecb9a.zip |
[llvm-nm] Display STT_GNU_IFUNC as 'i'
Reviewed By: grimar
Differential Revision: https://reviews.llvm.org/D71803
-rw-r--r-- | lld/test/ELF/ppc64-ifunc.s | 4 | ||||
-rw-r--r-- | llvm/test/LTO/Resolution/X86/ifunc.ll | 2 | ||||
-rw-r--r-- | llvm/test/tools/llvm-nm/ifunc.test | 27 | ||||
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 13 |
4 files changed, 38 insertions, 8 deletions
diff --git a/lld/test/ELF/ppc64-ifunc.s b/lld/test/ELF/ppc64-ifunc.s index 4bc1ce7e00a..9bb204fd01f 100644 --- a/lld/test/ELF/ppc64-ifunc.s +++ b/lld/test/ELF/ppc64-ifunc.s @@ -15,8 +15,8 @@ # RUN: llvm-readobj -r %t | FileCheck --check-prefix=REL %s # NM-DAG: 0000000010028248 d .TOC. -# NM-DAG: 00000000100101f8 T ifunc -# NM-DAG: 00000000100101fc T ifunc2 +# NM-DAG: 00000000100101f8 i ifunc +# NM-DAG: 00000000100101fc i ifunc2 # SECTIONS: .plt NOBITS 0000000010030250 000250 000010 00 WA 0 0 8 diff --git a/llvm/test/LTO/Resolution/X86/ifunc.ll b/llvm/test/LTO/Resolution/X86/ifunc.ll index 5a437fddbcb..7192ea2d5f7 100644 --- a/llvm/test/LTO/Resolution/X86/ifunc.ll +++ b/llvm/test/LTO/Resolution/X86/ifunc.ll @@ -1,7 +1,7 @@ ; RUN: opt -module-summary -o %t.bc %s ; RUN: llvm-lto2 run %t.bc -r %t.bc,foo,pl -o %t2 ; RUN: llvm-nm %t2.1 | FileCheck %s -; CHECK: T foo +; CHECK: i foo ; CHECK: t foo_ifunc target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" diff --git a/llvm/test/tools/llvm-nm/ifunc.test b/llvm/test/tools/llvm-nm/ifunc.test new file mode 100644 index 00000000000..fdc3ced971a --- /dev/null +++ b/llvm/test/tools/llvm-nm/ifunc.test @@ -0,0 +1,27 @@ +## Test that the symbol type of STT_GNU_IFUNC is 'i'. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-nm --no-sort %t | FileCheck %s + +# CHECK: i ifunc_local +# CHECK-NEXT: i ifunc_global + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] +Symbols: + - Name: ifunc_local + Type: STT_GNU_IFUNC + Binding: STB_LOCAL + Section: .text + - Name: ifunc_global + Type: STT_GNU_IFUNC + Binding: STB_GLOBAL + Section: .text diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index ee55722dc13..107d62b1f2b 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -1133,15 +1133,18 @@ static char getNMSectionTagAndName(SymbolicFile &Obj, basic_symbol_iterator I, Ret = getSymbolNMTypeChar(*MachO, I); else if (WasmObjectFile *Wasm = dyn_cast<WasmObjectFile>(&Obj)) Ret = getSymbolNMTypeChar(*Wasm, I); - else - Ret = getSymbolNMTypeChar(cast<ELFObjectFileBase>(Obj), I); + else if (ELFObjectFileBase *ELF = dyn_cast<ELFObjectFileBase>(&Obj)) { + if (ELFSymbolRef(*I).getELFType() == ELF::STT_GNU_IFUNC) + return 'i'; + Ret = getSymbolNMTypeChar(*ELF, I); + if (ELFSymbolRef(*I).getBinding() == ELF::STB_GNU_UNIQUE) + return Ret; + } else + llvm_unreachable("unknown binary format"); if (!(Symflags & object::SymbolRef::SF_Global)) return Ret; - if (Obj.isELF() && ELFSymbolRef(*I).getBinding() == ELF::STB_GNU_UNIQUE) - return Ret; - return toupper(Ret); } |