}
static bool compareSymbolAddress(const NMSymbol &A, const NMSymbol &B) {
- if (!ReverseSort) {
- if (A.Address < B.Address)
- return true;
- if (A.Address == B.Address && A.Name < B.Name)
- return true;
- if (A.Address == B.Address && A.Name == B.Name && A.Size < B.Size)
- return true;
- return false;
- }
-
- if (A.Address > B.Address)
+ if (A.Address < B.Address)
return true;
- if (A.Address == B.Address && A.Name > B.Name)
+ if (A.Address == B.Address && A.Name < B.Name)
return true;
- if (A.Address == B.Address && A.Name == B.Name && A.Size > B.Size)
+ if (A.Address == B.Address && A.Name == B.Name && A.Size < B.Size)
return true;
return false;
}
static bool compareSymbolSize(const NMSymbol &A, const NMSymbol &B) {
- if (!ReverseSort) {
- if (A.Size < B.Size)
- return true;
- if (A.Size == B.Size && A.Name < B.Name)
- return true;
- if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address)
- return true;
- return false;
- }
-
- if (A.Size > B.Size)
+ if (A.Size < B.Size)
return true;
- if (A.Size == B.Size && A.Name > B.Name)
+ if (A.Size == B.Size && A.Name < B.Name)
return true;
- if (A.Size == B.Size && A.Name == B.Name && A.Address > B.Address)
+ if (A.Size == B.Size && A.Name == B.Name && A.Address < B.Address)
return true;
return false;
}
static bool compareSymbolName(const NMSymbol &A, const NMSymbol &B) {
- if (!ReverseSort) {
- if (A.Name < B.Name)
- return true;
- if (A.Name == B.Name && A.Size < B.Size)
- return true;
- if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address)
- return true;
- return false;
- }
- if (A.Name > B.Name)
+ if (A.Name < B.Name)
return true;
- if (A.Name == B.Name && A.Size > B.Size)
+ if (A.Name == B.Name && A.Size < B.Size)
return true;
- if (A.Name == B.Name && A.Size == B.Size && A.Address > B.Address)
+ if (A.Name == B.Name && A.Size == B.Size && A.Address < B.Address)
return true;
return false;
}
std::string ArchiveName,
std::string ArchitectureName) {
if (!NoSort) {
+ std::function<bool(const NMSymbol &, const NMSymbol &)> Cmp;
if (NumericSort)
- std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolAddress);
+ Cmp = compareSymbolAddress;
else if (SizeSort)
- std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolSize);
+ Cmp = compareSymbolSize;
else
- std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolName);
+ Cmp = compareSymbolName;
+
+ if (ReverseSort)
+ Cmp = [=](const NMSymbol &A, const NMSymbol &B) { return !Cmp(A, B); };
+ std::sort(SymbolList.begin(), SymbolList.end(), Cmp);
}
if (!PrintFileName) {
}
if (SymI->getELFType() == ELF::STT_SECTION) {
- StringRef Name;
- if (error(SymI->getName(Name)))
+ ErrorOr<StringRef> Name = SymI->getName();
+ if (error(Name.getError()))
return '?';
- return StringSwitch<char>(Name)
+ return StringSwitch<char>(*Name)
.StartsWith(".debug", 'N')
.StartsWith(".note", 'n')
.Default('?');
// OK, this is COFF.
symbol_iterator SymI(I);
- StringRef Name;
- if (error(SymI->getName(Name)))
+ ErrorOr<StringRef> Name = SymI->getName();
+ if (error(Name.getError()))
return '?';
- char Ret = StringSwitch<char>(Name)
+ char Ret = StringSwitch<char>(*Name)
.StartsWith(".debug", 'N')
.StartsWith(".sxdata", 'N')
.Default('?');
S.Size = ELFSymbolRef(Sym).getSize();
}
if (PrintAddress && isa<ObjectFile>(Obj)) {
- if (error(SymbolRef(Sym).getAddress(S.Address)))
- break;
+ SymbolRef SymRef(Sym);
+ if (SymFlags & SymbolRef::SF_Common) {
+ S.Address = SymRef.getCommonSize();
+ } else {
+ ErrorOr<uint64_t> AddressOrErr = SymRef.getAddress();
+ if (error(AddressOrErr.getError()))
+ break;
+ S.Address = *AddressOrErr;
+ }
}
S.TypeChar = getNMTypeChar(Obj, Sym);
if (error(Sym.printName(OS)))