[PATCH] D95461: [llvm-nm] Display defined weak STT_GNU_IFUNC symbols as 'i'
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 26 14:59:39 PST 2021
MaskRay updated this revision to Diff 319416.
MaskRay added a subscriber: lhames.
MaskRay added a comment.
Display WeakRef as 'U'
Mach-O is poorly tested. CC @lhames in case he wants to add Mach-O tests:)
$ echo '__attribute__((weak)) void ref(); __attribute__((weak)) void def() { ref(); };' > test.c && clang -c test.c
$ nm test.o
0000000000000000 T _def
U _ref
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D95461/new/
https://reviews.llvm.org/D95461
Files:
llvm/test/tools/llvm-nm/ifunc.test
llvm/tools/llvm-nm/llvm-nm.cpp
Index: llvm/tools/llvm-nm/llvm-nm.cpp
===================================================================
--- llvm/tools/llvm-nm/llvm-nm.cpp
+++ llvm/tools/llvm-nm/llvm-nm.cpp
@@ -1142,13 +1142,17 @@
}
}
- if ((Symflags & object::SymbolRef::SF_Weak) && !isa<MachOObjectFile>(Obj)) {
- char Ret = isObject(Obj, I) ? 'v' : 'w';
- return (!(Symflags & object::SymbolRef::SF_Undefined)) ? toupper(Ret) : Ret;
- }
-
- if (Symflags & object::SymbolRef::SF_Undefined)
+ if (Symflags & object::SymbolRef::SF_Undefined) {
+ if (Symflags & object::SymbolRef::SF_Weak && !isa<MachOObjectFile>(Obj))
+ return isObject(Obj, I) ? 'v' : 'w';
return 'U';
+ }
+ if (ELFObjectFileBase *ELF = dyn_cast<ELFObjectFileBase>(&Obj)) {
+ if (ELFSymbolRef(*I).getELFType() == ELF::STT_GNU_IFUNC)
+ return 'i';
+ }
+ if ((Symflags & object::SymbolRef::SF_Weak) && !isa<MachOObjectFile>(Obj))
+ return isObject(Obj, I) ? 'V' : 'W';
if (Symflags & object::SymbolRef::SF_Common)
return 'C';
@@ -1169,8 +1173,6 @@
else if (TapiFile *Tapi = dyn_cast<TapiFile>(&Obj))
Ret = getSymbolNMTypeChar(*Tapi, 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;
Index: llvm/test/tools/llvm-nm/ifunc.test
===================================================================
--- llvm/test/tools/llvm-nm/ifunc.test
+++ llvm/test/tools/llvm-nm/ifunc.test
@@ -5,6 +5,8 @@
# CHECK: i ifunc_local
# CHECK-NEXT: i ifunc_global
+# CHECK-NEXT: i ifunc_weak
+# CHECK-NEXT: U ifunc_undef
!ELF
FileHeader:
@@ -25,3 +27,10 @@
Type: STT_GNU_IFUNC
Binding: STB_GLOBAL
Section: .text
+ - Name: ifunc_weak
+ Type: STT_GNU_IFUNC
+ Binding: STB_WEAK
+ Section: .text
+ - Name: ifunc_undef
+ Type: STT_GNU_IFUNC
+ Binding: STB_GLOBAL
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95461.319416.patch
Type: text/x-patch
Size: 2026 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210126/f664f425/attachment.bin>
More information about the llvm-commits
mailing list