Index: tools/llvm-objdump/llvm-objdump.cpp =================================================================== --- tools/llvm-objdump/llvm-objdump.cpp +++ tools/llvm-objdump/llvm-objdump.cpp @@ -269,9 +269,23 @@ cl::value_desc("address"), cl::init(UINT64_MAX)); static StringRef ToolName; -typedef std::vector> SectionSymbolsTy; - namespace { +struct SectionSymbol { + SectionSymbol(uint64_t Address, StringRef Name, uint8_t Type) + : Address(Address), Name(Name), Type(Type) {} + + bool operator<(const SectionSymbol &Other) const { + return std::tie(Address, Name, Type) < + std::tie(Other.Address, Other.Name, Other.Type); + } + + uint64_t Address; + StringRef Name; + uint8_t Type; +}; + +typedef std::vector SectionSymbolsTy; + typedef std::function FilterPredicate; class SectionFilterIterator { @@ -1465,8 +1479,8 @@ std::vector TextMappingSymsAddr; if (isArmElf(Obj)) { for (const auto &Symb : Symbols) { - uint64_t Address = std::get<0>(Symb); - StringRef Name = std::get<1>(Symb); + uint64_t Address = Symb.Address; + StringRef Name = Symb.Name; if (Name.startswith("$d")) DataMappingSymsAddr.push_back(Address - SectionAddr); if (Name.startswith("$x")) @@ -1515,11 +1529,11 @@ error(Section.getName(SectionName)); // If the section has no symbol at the start, just insert a dummy one. - if (Symbols.empty() || std::get<0>(Symbols[0]) != 0) { + if (Symbols.empty() || Symbols[0].Address != 0) { Symbols.insert( Symbols.begin(), - std::make_tuple(SectionAddr, SectionName, - Section.isText() ? ELF::STT_FUNC : ELF::STT_OBJECT)); + SectionSymbol(SectionAddr, SectionName, + Section.isText() ? ELF::STT_FUNC : ELF::STT_OBJECT)); } SmallString<40> Comments; @@ -1538,11 +1552,11 @@ std::vector::const_iterator rel_end = Rels.end(); // Disassemble symbol by symbol. for (unsigned si = 0, se = Symbols.size(); si != se; ++si) { - uint64_t Start = std::get<0>(Symbols[si]) - SectionAddr; + uint64_t Start = Symbols[si].Address - SectionAddr; // The end is either the section end or the beginning of the next // symbol. uint64_t End = - (si == se - 1) ? SectSize : std::get<0>(Symbols[si + 1]) - SectionAddr; + (si == se - 1) ? SectSize : Symbols[si + 1].Address - SectionAddr; // Don't try to disassemble beyond the end of section contents. if (End > SectSize) End = SectSize; @@ -1558,8 +1572,7 @@ } /// Skip if user requested specific symbols and this is not in the list - if (!DisasmFuncsSet.empty() && - !DisasmFuncsSet.count(std::get<1>(Symbols[si]))) + if (!DisasmFuncsSet.empty() && !DisasmFuncsSet.count(Symbols[si].Name)) continue; if (!PrintedSection) { @@ -1575,12 +1588,12 @@ End = StopAddress - SectionAddr; if (Obj->isELF() && Obj->getArch() == Triple::amdgcn) { - if (std::get<2>(Symbols[si]) == ELF::STT_AMDGPU_HSA_KERNEL) { + if (Symbols[si].Type == ELF::STT_AMDGPU_HSA_KERNEL) { // skip amd_kernel_code_t at the begining of kernel symbol (256 bytes) Start += 256; } if (si == se - 1 || - std::get<2>(Symbols[si + 1]) == ELF::STT_AMDGPU_HSA_KERNEL) { + Symbols[si + 1].Type == ELF::STT_AMDGPU_HSA_KERNEL) { // cut trailing zeroes at the end of kernel // cut up to 256 bytes const uint64_t EndAlign = 256; @@ -1592,7 +1605,7 @@ } outs() << '\n'; - StringRef SymbolName = std::get<1>(Symbols[si]); + StringRef SymbolName = Symbols[si].Name; if (Demangle) outs() << demangle(SymbolName) << ":\n"; else @@ -1624,7 +1637,7 @@ // same section. We rely on the markers introduced to // understand what we need to dump. If the data marker is within a // function, it is denoted as a word/short etc - if (isArmElf(Obj) && std::get<2>(Symbols[si]) != ELF::STT_OBJECT && + if (isArmElf(Obj) && Symbols[si].Type != ELF::STT_OBJECT && !DisassembleAll) { uint64_t Stride = 0; @@ -1688,7 +1701,7 @@ // disassembling text (applicable all architectures), // we are in a situation where we must print the data and not // disassemble it. - if (Obj->isELF() && std::get<2>(Symbols[si]) == ELF::STT_OBJECT && + if (Obj->isELF() && Symbols[si].Type == ELF::STT_OBJECT && !DisassembleAll && Section.isText()) { // print out data up to 8 bytes at a time in hex and ascii uint8_t AsciiData[9] = {'\0'}; @@ -1777,25 +1790,21 @@ // the target, find the nearest preceding absolute symbol. auto TargetSym = std::upper_bound( TargetSectionSymbols->begin(), TargetSectionSymbols->end(), - Target, [](uint64_t LHS, - const std::tuple &RHS) { - return LHS < std::get<0>(RHS); + Target, [](uint64_t LHS, const SectionSymbol &RHS) { + return LHS < RHS.Address; }); if (TargetSym == TargetSectionSymbols->begin()) { TargetSectionSymbols = &AbsoluteSymbols; TargetSym = std::upper_bound( - AbsoluteSymbols.begin(), AbsoluteSymbols.end(), - Target, [](uint64_t LHS, - const std::tuple &RHS) { - return LHS < std::get<0>(RHS); - }); + AbsoluteSymbols.begin(), AbsoluteSymbols.end(), Target, + [](uint64_t LHS, const SectionSymbol &RHS) { + return LHS < RHS.Address; + }); } if (TargetSym != TargetSectionSymbols->begin()) { --TargetSym; - uint64_t TargetAddress = std::get<0>(*TargetSym); - StringRef TargetName = std::get<1>(*TargetSym); - outs() << " <" << TargetName; - uint64_t Disp = Target - TargetAddress; + outs() << " <" << TargetSym->Name; + uint64_t Disp = Target - TargetSym->Address; if (Disp) outs() << "+0x" << Twine::utohexstr(Disp); outs() << '>';