forked from OSchip/llvm-project
[llvm-readobj/libObject] - Get rid of `FirstSym` argument. NFCI.
We use `FirstSym` argument in `getExtendedSymbolTableIndex` to calculate a symbol index: ``` &Sym - &FirstSym ``` Instead, we could pass the symbol index directly. This is what this patch does, it allows to simplify another llvm-readobj API. Differential revision: https://reviews.llvm.org/D88016
This commit is contained in:
parent
82042a2c9b
commit
df3e903655
|
@ -337,19 +337,17 @@ getSection(typename ELFT::ShdrRange Sections, uint32_t Index) {
|
|||
|
||||
template <class ELFT>
|
||||
inline Expected<uint32_t>
|
||||
getExtendedSymbolTableIndex(const typename ELFT::Sym &Sym,
|
||||
const typename ELFT::Sym &FirstSym,
|
||||
getExtendedSymbolTableIndex(const typename ELFT::Sym &Sym, unsigned SymIndex,
|
||||
ArrayRef<typename ELFT::Word> ShndxTable) {
|
||||
assert(Sym.st_shndx == ELF::SHN_XINDEX);
|
||||
unsigned Index = &Sym - &FirstSym;
|
||||
if (Index >= ShndxTable.size())
|
||||
if (SymIndex >= ShndxTable.size())
|
||||
return createError(
|
||||
"extended symbol index (" + Twine(Index) +
|
||||
"extended symbol index (" + Twine(SymIndex) +
|
||||
") is past the end of the SHT_SYMTAB_SHNDX section of size " +
|
||||
Twine(ShndxTable.size()));
|
||||
|
||||
// The size of the table was checked in getSHNDXTable.
|
||||
return ShndxTable[Index];
|
||||
return ShndxTable[SymIndex];
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
|
@ -359,7 +357,7 @@ ELFFile<ELFT>::getSectionIndex(const Elf_Sym &Sym, Elf_Sym_Range Syms,
|
|||
uint32_t Index = Sym.st_shndx;
|
||||
if (Index == ELF::SHN_XINDEX) {
|
||||
Expected<uint32_t> ErrorOrIndex =
|
||||
getExtendedSymbolTableIndex<ELFT>(Sym, *Syms.begin(), ShndxTable);
|
||||
getExtendedSymbolTableIndex<ELFT>(Sym, &Sym - Syms.begin(), ShndxTable);
|
||||
if (!ErrorOrIndex)
|
||||
return ErrorOrIndex.takeError();
|
||||
return *ErrorOrIndex;
|
||||
|
|
|
@ -359,7 +359,7 @@ public:
|
|||
Optional<StringRef> StrTable,
|
||||
bool IsDynamic) const;
|
||||
Expected<unsigned> getSymbolSectionIndex(const Elf_Sym *Symbol,
|
||||
const Elf_Sym *FirstSym) const;
|
||||
unsigned SymIndex) const;
|
||||
Expected<StringRef> getSymbolSectionName(const Elf_Sym *Symbol,
|
||||
unsigned SectionIndex) const;
|
||||
std::string getStaticSymbolName(uint32_t Index) const;
|
||||
|
@ -711,7 +711,7 @@ void ELFDumper<ELFT>::printSymbolsHelper(bool IsDynamic) const {
|
|||
|
||||
ELFDumperStyle->printSymtabMessage(SymtabSec, Entries, NonVisibilityBitsUsed);
|
||||
for (const auto &Sym : Syms)
|
||||
ELFDumperStyle->printSymbol(&Sym, Syms.begin(), StrTable, IsDynamic,
|
||||
ELFDumperStyle->printSymbol(&Sym, &Sym - Syms.begin(), StrTable, IsDynamic,
|
||||
NonVisibilityBitsUsed);
|
||||
}
|
||||
|
||||
|
@ -740,7 +740,7 @@ public:
|
|||
virtual void printDynamicRelocations() = 0;
|
||||
virtual void printSymtabMessage(const Elf_Shdr *Symtab, size_t Offset,
|
||||
bool NonVisibilityBitsUsed) {}
|
||||
virtual void printSymbol(const Elf_Sym *Symbol, const Elf_Sym *FirstSym,
|
||||
virtual void printSymbol(const Elf_Sym *Symbol, unsigned SymIndex,
|
||||
Optional<StringRef> StrTable, bool IsDynamic,
|
||||
bool NonVisibilityBitsUsed) = 0;
|
||||
virtual void printProgramHeaders(bool PrintProgramHeaders,
|
||||
|
@ -891,7 +891,7 @@ private:
|
|||
OS.flush();
|
||||
return OS;
|
||||
}
|
||||
void printHashedSymbol(const Elf_Sym *FirstSym, uint32_t Sym,
|
||||
void printHashedSymbol(const Elf_Sym *Sym, unsigned SymIndex,
|
||||
StringRef StrTable, uint32_t Bucket);
|
||||
void printReloc(const Relocation<ELFT> &R, unsigned RelIndex,
|
||||
const Elf_Shdr &Sec, const Elf_Shdr *SymTab) override;
|
||||
|
@ -899,15 +899,14 @@ private:
|
|||
|
||||
void printRelRelaReloc(const Relocation<ELFT> &R,
|
||||
const RelSymbol<ELFT> &RelSym);
|
||||
void printSymbol(const Elf_Sym *Symbol, const Elf_Sym *First,
|
||||
void printSymbol(const Elf_Sym *Symbol, unsigned SymIndex,
|
||||
Optional<StringRef> StrTable, bool IsDynamic,
|
||||
bool NonVisibilityBitsUsed) override;
|
||||
void printDynamicRelocHeader(unsigned Type, StringRef Name,
|
||||
const DynRegionInfo &Reg) override;
|
||||
void printDynamicReloc(const Relocation<ELFT> &R) override;
|
||||
|
||||
std::string getSymbolSectionNdx(const Elf_Sym *Symbol,
|
||||
const Elf_Sym *FirstSym);
|
||||
std::string getSymbolSectionNdx(const Elf_Sym *Symbol, unsigned SymIndex);
|
||||
void printProgramHeaders();
|
||||
void printSectionMapping();
|
||||
void printGNUVersionSectionProlog(const typename ELFT::Shdr *Sec,
|
||||
|
@ -967,8 +966,8 @@ private:
|
|||
void printRelRelaReloc(const Relocation<ELFT> &R, StringRef SymbolName);
|
||||
void printSymbols();
|
||||
void printDynamicSymbols();
|
||||
void printSymbolSection(const Elf_Sym *Symbol, const Elf_Sym *First);
|
||||
void printSymbol(const Elf_Sym *Symbol, const Elf_Sym *First,
|
||||
void printSymbolSection(const Elf_Sym *Symbol, unsigned SymIndex);
|
||||
void printSymbol(const Elf_Sym *Symbol, unsigned SymIndex,
|
||||
Optional<StringRef> StrTable, bool IsDynamic,
|
||||
bool /*NonVisibilityBitsUsed*/) override;
|
||||
void printProgramHeaders();
|
||||
|
@ -1191,7 +1190,7 @@ std::string ELFDumper<ELFT>::getFullSymbolName(const Elf_Sym *Symbol,
|
|||
Elf_Sym_Range Syms = unwrapOrError(
|
||||
ObjF->getFileName(), ObjF->getELFFile()->symbols(DotSymtabSec));
|
||||
Expected<unsigned> SectionIndex =
|
||||
getSymbolSectionIndex(Symbol, Syms.begin());
|
||||
getSymbolSectionIndex(Symbol, Symbol - Syms.begin());
|
||||
if (!SectionIndex) {
|
||||
reportUniqueWarning(SectionIndex.takeError());
|
||||
return "<?>";
|
||||
|
@ -1224,10 +1223,10 @@ std::string ELFDumper<ELFT>::getFullSymbolName(const Elf_Sym *Symbol,
|
|||
template <typename ELFT>
|
||||
Expected<unsigned>
|
||||
ELFDumper<ELFT>::getSymbolSectionIndex(const Elf_Sym *Symbol,
|
||||
const Elf_Sym *FirstSym) const {
|
||||
unsigned SymIndex) const {
|
||||
unsigned Ndx = Symbol->st_shndx;
|
||||
if (Ndx == SHN_XINDEX)
|
||||
return object::getExtendedSymbolTableIndex<ELFT>(*Symbol, *FirstSym,
|
||||
return object::getExtendedSymbolTableIndex<ELFT>(*Symbol, SymIndex,
|
||||
ShndxTable);
|
||||
if (Ndx != SHN_UNDEF && Ndx < SHN_LORESERVE)
|
||||
return Ndx;
|
||||
|
@ -3925,7 +3924,7 @@ void GNUStyle<ELFT>::printSymtabMessage(const Elf_Shdr *Symtab, size_t Entries,
|
|||
|
||||
template <class ELFT>
|
||||
std::string GNUStyle<ELFT>::getSymbolSectionNdx(const Elf_Sym *Symbol,
|
||||
const Elf_Sym *FirstSym) {
|
||||
unsigned SymIndex) {
|
||||
unsigned SectionIndex = Symbol->st_shndx;
|
||||
switch (SectionIndex) {
|
||||
case ELF::SHN_UNDEF:
|
||||
|
@ -3936,7 +3935,7 @@ std::string GNUStyle<ELFT>::getSymbolSectionNdx(const Elf_Sym *Symbol,
|
|||
return "COM";
|
||||
case ELF::SHN_XINDEX: {
|
||||
Expected<uint32_t> IndexOrErr = object::getExtendedSymbolTableIndex<ELFT>(
|
||||
*Symbol, *FirstSym, this->dumper()->getShndxTable());
|
||||
*Symbol, SymIndex, this->dumper()->getShndxTable());
|
||||
if (!IndexOrErr) {
|
||||
assert(Symbol->st_shndx == SHN_XINDEX &&
|
||||
"getExtendedSymbolTableIndex should only fail due to an invalid "
|
||||
|
@ -3967,13 +3966,13 @@ std::string GNUStyle<ELFT>::getSymbolSectionNdx(const Elf_Sym *Symbol,
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
void GNUStyle<ELFT>::printSymbol(const Elf_Sym *Symbol, const Elf_Sym *FirstSym,
|
||||
void GNUStyle<ELFT>::printSymbol(const Elf_Sym *Symbol, unsigned SymIndex,
|
||||
Optional<StringRef> StrTable, bool IsDynamic,
|
||||
bool NonVisibilityBitsUsed) {
|
||||
unsigned Bias = ELFT::Is64Bits ? 8 : 0;
|
||||
Field Fields[8] = {0, 8, 17 + Bias, 23 + Bias,
|
||||
31 + Bias, 38 + Bias, 48 + Bias, 51 + Bias};
|
||||
Fields[0].Str = to_string(format_decimal(Symbol - FirstSym, 6)) + ":";
|
||||
Fields[0].Str = to_string(format_decimal(SymIndex, 6)) + ":";
|
||||
Fields[1].Str = to_string(
|
||||
format_hex_no_prefix(Symbol->st_value, ELFT::Is64Bits ? 16 : 8));
|
||||
Fields[2].Str = to_string(format_decimal(Symbol->st_size, 5));
|
||||
|
@ -3994,7 +3993,7 @@ void GNUStyle<ELFT>::printSymbol(const Elf_Sym *Symbol, const Elf_Sym *FirstSym,
|
|||
" [<other: " + to_string(format_hex(Symbol->st_other, 2)) + ">]";
|
||||
|
||||
Fields[6].Column += NonVisibilityBitsUsed ? 13 : 0;
|
||||
Fields[6].Str = getSymbolSectionNdx(Symbol, FirstSym);
|
||||
Fields[6].Str = getSymbolSectionNdx(Symbol, SymIndex);
|
||||
|
||||
Fields[7].Str =
|
||||
this->dumper()->getFullSymbolName(Symbol, StrTable, IsDynamic);
|
||||
|
@ -4004,15 +4003,14 @@ void GNUStyle<ELFT>::printSymbol(const Elf_Sym *Symbol, const Elf_Sym *FirstSym,
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
void GNUStyle<ELFT>::printHashedSymbol(const Elf_Sym *FirstSym, uint32_t Sym,
|
||||
void GNUStyle<ELFT>::printHashedSymbol(const Elf_Sym *Symbol, unsigned SymIndex,
|
||||
StringRef StrTable, uint32_t Bucket) {
|
||||
unsigned Bias = ELFT::Is64Bits ? 8 : 0;
|
||||
Field Fields[9] = {0, 6, 11, 20 + Bias, 25 + Bias,
|
||||
34 + Bias, 41 + Bias, 49 + Bias, 53 + Bias};
|
||||
Fields[0].Str = to_string(format_decimal(Sym, 5));
|
||||
Fields[0].Str = to_string(format_decimal(SymIndex, 5));
|
||||
Fields[1].Str = to_string(format_decimal(Bucket, 3)) + ":";
|
||||
|
||||
const auto Symbol = FirstSym + Sym;
|
||||
Fields[2].Str = to_string(
|
||||
format_hex_no_prefix(Symbol->st_value, ELFT::Is64Bits ? 16 : 8));
|
||||
Fields[3].Str = to_string(format_decimal(Symbol->st_size, 5));
|
||||
|
@ -4028,7 +4026,7 @@ void GNUStyle<ELFT>::printHashedSymbol(const Elf_Sym *FirstSym, uint32_t Sym,
|
|||
printEnum(Symbol->getBinding(), makeArrayRef(ElfSymbolBindings));
|
||||
Fields[6].Str =
|
||||
printEnum(Symbol->getVisibility(), makeArrayRef(ElfSymbolVisibilities));
|
||||
Fields[7].Str = getSymbolSectionNdx(Symbol, FirstSym);
|
||||
Fields[7].Str = getSymbolSectionNdx(Symbol, SymIndex);
|
||||
Fields[8].Str = this->dumper()->getFullSymbolName(Symbol, StrTable, true);
|
||||
|
||||
for (auto &Entry : Fields)
|
||||
|
@ -4087,7 +4085,7 @@ void GNUStyle<ELFT>::printHashTableSymbols(const Elf_Hash &SysVHash) {
|
|||
break;
|
||||
}
|
||||
|
||||
printHashedSymbol(FirstSym, Ch, StringTable, Buc);
|
||||
printHashedSymbol(FirstSym + Ch, Ch, StringTable, Buc);
|
||||
Visited[Ch] = true;
|
||||
}
|
||||
}
|
||||
|
@ -4118,7 +4116,8 @@ void GNUStyle<ELFT>::printGnuHashTableSymbols(const Elf_GnuHash &GnuHash) {
|
|||
uint32_t GnuHashable = Index - GnuHash.symndx;
|
||||
// Print whole chain
|
||||
while (true) {
|
||||
printHashedSymbol(FirstSym, Index++, StringTable, Buc);
|
||||
uint32_t SymIndex = Index++;
|
||||
printHashedSymbol(FirstSym + SymIndex, SymIndex, StringTable, Buc);
|
||||
// Chain ends at symbol with stopper bit
|
||||
if ((GnuHash.values(DynSyms.size())[GnuHashable++] & 1) == 1)
|
||||
break;
|
||||
|
@ -5854,7 +5853,8 @@ void GNUStyle<ELFT>::printMipsGOT(const MipsGOTParser<ELFT> &Parser) {
|
|||
OS.PadToColumn(40 + 3 * Bias);
|
||||
OS << printEnum(Sym->getType(), makeArrayRef(ElfSymbolTypes));
|
||||
OS.PadToColumn(48 + 3 * Bias);
|
||||
OS << getSymbolSectionNdx(Sym, this->dumper()->dynamic_symbols().begin());
|
||||
OS << getSymbolSectionNdx(
|
||||
Sym, Sym - this->dumper()->dynamic_symbols().begin());
|
||||
OS.PadToColumn(52 + 3 * Bias);
|
||||
OS << SymName << "\n";
|
||||
}
|
||||
|
@ -5903,7 +5903,8 @@ void GNUStyle<ELFT>::printMipsPLT(const MipsGOTParser<ELFT> &Parser) {
|
|||
OS.PadToColumn(29 + 3 * Bias);
|
||||
OS << printEnum(Sym->getType(), makeArrayRef(ElfSymbolTypes));
|
||||
OS.PadToColumn(37 + 3 * Bias);
|
||||
OS << getSymbolSectionNdx(Sym, this->dumper()->dynamic_symbols().begin());
|
||||
OS << getSymbolSectionNdx(
|
||||
Sym, Sym - this->dumper()->dynamic_symbols().begin());
|
||||
OS.PadToColumn(41 + 3 * Bias);
|
||||
OS << SymName << "\n";
|
||||
}
|
||||
|
@ -6146,17 +6147,15 @@ template <class ELFT> void LLVMStyle<ELFT>::printSectionHeaders() {
|
|||
StringRef StrTable = unwrapOrError(
|
||||
this->FileName, this->Obj.getStringTableForSymtab(*Symtab));
|
||||
|
||||
for (const Elf_Sym &Sym :
|
||||
unwrapOrError(this->FileName, this->Obj.symbols(Symtab))) {
|
||||
typename ELFT::SymRange Symbols =
|
||||
unwrapOrError(this->FileName, this->Obj.symbols(Symtab));
|
||||
for (const Elf_Sym &Sym : Symbols) {
|
||||
const Elf_Shdr *SymSec =
|
||||
unwrapOrError(this->FileName,
|
||||
this->Obj.getSection(
|
||||
Sym, Symtab, this->dumper()->getShndxTable()));
|
||||
if (SymSec == &Sec)
|
||||
printSymbol(&Sym,
|
||||
unwrapOrError(this->FileName, this->Obj.symbols(Symtab))
|
||||
.begin(),
|
||||
StrTable, false, false);
|
||||
printSymbol(&Sym, &Sym - &Symbols[0], StrTable, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6173,7 +6172,7 @@ template <class ELFT> void LLVMStyle<ELFT>::printSectionHeaders() {
|
|||
|
||||
template <class ELFT>
|
||||
void LLVMStyle<ELFT>::printSymbolSection(const Elf_Sym *Symbol,
|
||||
const Elf_Sym *First) {
|
||||
unsigned SymIndex) {
|
||||
auto GetSectionSpecialType = [&]() -> Optional<StringRef> {
|
||||
if (Symbol->isUndefined())
|
||||
return StringRef("Undefined");
|
||||
|
@ -6196,7 +6195,7 @@ void LLVMStyle<ELFT>::printSymbolSection(const Elf_Sym *Symbol,
|
|||
}
|
||||
|
||||
Expected<unsigned> SectionIndex =
|
||||
this->dumper()->getSymbolSectionIndex(Symbol, First);
|
||||
this->dumper()->getSymbolSectionIndex(Symbol, SymIndex);
|
||||
if (!SectionIndex) {
|
||||
assert(Symbol->st_shndx == SHN_XINDEX &&
|
||||
"getSymbolSectionIndex should only fail due to an invalid "
|
||||
|
@ -6222,7 +6221,7 @@ void LLVMStyle<ELFT>::printSymbolSection(const Elf_Sym *Symbol,
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
void LLVMStyle<ELFT>::printSymbol(const Elf_Sym *Symbol, const Elf_Sym *First,
|
||||
void LLVMStyle<ELFT>::printSymbol(const Elf_Sym *Symbol, unsigned SymIndex,
|
||||
Optional<StringRef> StrTable, bool IsDynamic,
|
||||
bool /*NonVisibilityBitsUsed*/) {
|
||||
std::string FullSymbolName =
|
||||
|
@ -6261,7 +6260,7 @@ void LLVMStyle<ELFT>::printSymbol(const Elf_Sym *Symbol, const Elf_Sym *First,
|
|||
}
|
||||
W.printFlags("Other", Symbol->st_other, makeArrayRef(SymOtherFlags), 0x3u);
|
||||
}
|
||||
printSymbolSection(Symbol, First);
|
||||
printSymbolSection(Symbol, SymIndex);
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
|
@ -6765,7 +6764,7 @@ void LLVMStyle<ELFT>::printMipsGOT(const MipsGOTParser<ELFT> &Parser) {
|
|||
const Elf_Sym *Sym = Parser.getGotSym(&E);
|
||||
W.printHex("Value", Sym->st_value);
|
||||
W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes));
|
||||
printSymbolSection(Sym, this->dumper()->dynamic_symbols().begin());
|
||||
printSymbolSection(Sym, Sym - this->dumper()->dynamic_symbols().begin());
|
||||
|
||||
std::string SymName = this->dumper()->getFullSymbolName(
|
||||
Sym, this->dumper()->getDynamicStringTable(), true);
|
||||
|
@ -6809,7 +6808,7 @@ void LLVMStyle<ELFT>::printMipsPLT(const MipsGOTParser<ELFT> &Parser) {
|
|||
const Elf_Sym *Sym = Parser.getPltSym(&E);
|
||||
W.printHex("Value", Sym->st_value);
|
||||
W.printEnum("Type", Sym->getType(), makeArrayRef(ElfSymbolTypes));
|
||||
printSymbolSection(Sym, this->dumper()->dynamic_symbols().begin());
|
||||
printSymbolSection(Sym, Sym - this->dumper()->dynamic_symbols().begin());
|
||||
|
||||
std::string SymName =
|
||||
this->dumper()->getFullSymbolName(Sym, Parser.getPltStrTable(), true);
|
||||
|
|
Loading…
Reference in New Issue