@@ -262,6 +262,8 @@ struct NMSymbol {
262
262
uint64_t Size ;
263
263
char TypeChar;
264
264
StringRef Name;
265
+ StringRef SectionName;
266
+ StringRef TypeName;
265
267
BasicSymbolRef Sym;
266
268
// The Sym field above points to the native symbol in the object file,
267
269
// for Mach-O when we are creating symbols from the dyld info the above
@@ -882,8 +884,12 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName,
882
884
std::string PaddedName (Name);
883
885
while (PaddedName.length () < 20 )
884
886
PaddedName += " " ;
887
+ std::string TypeName = I->TypeName ;
888
+ if (TypeName.size () < 18 )
889
+ TypeName = std::string (18 -TypeName.size (), ' ' ) + TypeName;
885
890
outs () << PaddedName << " |" << SymbolAddrStr << " | " << I->TypeChar
886
- << " | |" << SymbolSizeStr << " | |\n " ;
891
+ << " |" << TypeName << " |" << SymbolSizeStr << " | |"
892
+ << I->SectionName << " \n " ;
887
893
}
888
894
}
889
895
@@ -1078,8 +1084,40 @@ static bool isObject(SymbolicFile &Obj, basic_symbol_iterator I) {
1078
1084
: elf_symbol_iterator (I)->getELFType () == ELF::STT_OBJECT;
1079
1085
}
1080
1086
1081
- static char getNMTypeChar (SymbolicFile &Obj, basic_symbol_iterator I) {
1087
+ // For ELF object files, Set TypeName to the symbol typename, to be printed
1088
+ // in the 'Type' column of the SYSV format output.
1089
+ static StringRef getNMTypeName (SymbolicFile &Obj, basic_symbol_iterator I) {
1090
+ if (isa<ELFObjectFileBase>(&Obj)) {
1091
+ elf_symbol_iterator SymI (I);
1092
+ return SymI->getELFTypeName ();
1093
+ }
1094
+ return " " ;
1095
+ }
1096
+
1097
+ // Return Posix nm class type tag (single letter), but also set SecName and
1098
+ // section and name, to be used in format=sysv output.
1099
+ static char getNMSectionTagAndName (SymbolicFile &Obj, basic_symbol_iterator I,
1100
+ StringRef &SecName) {
1082
1101
uint32_t Symflags = I->getFlags ();
1102
+ if (isa<ELFObjectFileBase>(&Obj)) {
1103
+ if (Symflags & object::SymbolRef::SF_Absolute)
1104
+ SecName = " *ABS*" ;
1105
+ else if (Symflags & object::SymbolRef::SF_Common)
1106
+ SecName = " *COM*" ;
1107
+ else if (Symflags & object::SymbolRef::SF_Undefined)
1108
+ SecName = " *UND*" ;
1109
+ else {
1110
+ elf_symbol_iterator SymI (I);
1111
+ Expected<elf_section_iterator> SecIOrErr = SymI->getSection ();
1112
+ if (!SecIOrErr) {
1113
+ consumeError (SecIOrErr.takeError ());
1114
+ return ' ?' ;
1115
+ }
1116
+ elf_section_iterator secT = *SecIOrErr;
1117
+ secT->getName (SecName);
1118
+ }
1119
+ }
1120
+
1083
1121
if ((Symflags & object::SymbolRef::SF_Weak) && !isa<MachOObjectFile>(Obj)) {
1084
1122
char Ret = isObject (Obj, I) ? ' v' : ' w' ;
1085
1123
return (!(Symflags & object::SymbolRef::SF_Undefined)) ? toupper (Ret) : Ret;
@@ -1201,7 +1239,8 @@ dumpSymbolNamesFromObject(SymbolicFile &Obj, bool printName,
1201
1239
}
1202
1240
S.Address = *AddressOrErr;
1203
1241
}
1204
- S.TypeChar = getNMTypeChar (Obj, Sym);
1242
+ S.TypeName = getNMTypeName (Obj, Sym);
1243
+ S.TypeChar = getNMSectionTagAndName (Obj, Sym, S.SectionName );
1205
1244
std::error_code EC = Sym.printName (OS);
1206
1245
if (EC && MachO)
1207
1246
OS << " bad string index" ;
0 commit comments