[llvm] r357853 - [llvm-objdump] Simplify disassembleObject
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 6 22:32:17 PDT 2019
Author: maskray
Date: Sat Apr 6 22:32:16 2019
New Revision: 357853
URL: http://llvm.org/viewvc/llvm-project?rev=357853&view=rev
Log:
[llvm-objdump] Simplify disassembleObject
* Use std::binary_search to replace some std::lower_bound
* Use llvm::upper_bound to replace some std::upper_bound
* Use format_hex and support::endian::read{16,32}
Modified:
llvm/trunk/test/tools/llvm-objdump/AArch64/elf-aarch64-mapping-symbols.test
llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
Modified: llvm/trunk/test/tools/llvm-objdump/AArch64/elf-aarch64-mapping-symbols.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/AArch64/elf-aarch64-mapping-symbols.test?rev=357853&r1=357852&r2=357853&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/AArch64/elf-aarch64-mapping-symbols.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/AArch64/elf-aarch64-mapping-symbols.test Sat Apr 6 22:32:16 2019
@@ -21,10 +21,10 @@ mystr:
# CHECK: 4: 48 65 6c 6c .word
# CHECK: 8: 6f 2c 20 77 .word
# CHECK: c: 6f 72 6c 64 .word
-# CHECK: 10: 0a 00 .short
+# CHECK: 10: 0a 00 .short 0x000a
# CHECK: Disassembly of section .myothersection:
# CHECK: $x.2:
# CHECK: 0: 01 00 00 90 adrp x1, #0
# CHECK: mystr:
# CHECK: 4: 62 6c 61 68 .word
-# CHECK: 8: 00 .byte
+# CHECK: 8: 00 .byte 0x01
Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=357853&r1=357852&r2=357853&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Sat Apr 6 22:32:16 2019
@@ -969,8 +969,6 @@ static void disassembleObject(const Targ
AllSymbols[*SecI].emplace_back(Address, *Name, SymbolType);
else
AbsoluteSymbols.emplace_back(Address, *Name, SymbolType);
-
-
}
if (AllSymbols.empty() && Obj->isELF())
addDynamicElfSymbols(Obj, AllSymbols);
@@ -997,19 +995,15 @@ static void disassembleObject(const Targ
error(ExportEntry.getExportRVA(RVA));
uint64_t VA = COFFObj->getImageBase() + RVA;
- auto Sec = std::upper_bound(
- SectionAddresses.begin(), SectionAddresses.end(), VA,
+ auto Sec = llvm::upper_bound(
+ SectionAddresses, VA,
[](uint64_t LHS, const std::pair<uint64_t, SectionRef> &RHS) {
return LHS < RHS.first;
});
- if (Sec != SectionAddresses.begin())
+ if (Sec != SectionAddresses.begin()) {
--Sec;
- else
- Sec = SectionAddresses.end();
-
- if (Sec != SectionAddresses.end())
AllSymbols[Sec->second].emplace_back(VA, Name, ELF::STT_NOTYPE);
- else
+ } else
AbsoluteSymbols.emplace_back(VA, Name, ELF::STT_NOTYPE);
}
}
@@ -1196,62 +1190,38 @@ static void disassembleObject(const Targ
// 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 &&
- !DisassembleAll) {
- uint64_t Stride = 0;
-
- auto DAI = std::lower_bound(DataMappingSymsAddr.begin(),
- DataMappingSymsAddr.end(), Index);
- if (DAI != DataMappingSymsAddr.end() && *DAI == Index) {
- // Switch to data.
- while (Index < End) {
- outs() << format("%8" PRIx64 ":", SectionAddr + Index);
- outs() << "\t";
- if (Index + 4 <= End) {
- Stride = 4;
- dumpBytes(Bytes.slice(Index, 4), outs());
- outs() << "\t.word\t";
- uint32_t Data = 0;
- if (Obj->isLittleEndian()) {
- const auto Word =
- reinterpret_cast<const support::ulittle32_t *>(
- Bytes.data() + Index);
- Data = *Word;
- } else {
- const auto Word = reinterpret_cast<const support::ubig32_t *>(
- Bytes.data() + Index);
- Data = *Word;
- }
- outs() << "0x" << format("%08" PRIx32, Data);
- } else if (Index + 2 <= End) {
- Stride = 2;
- dumpBytes(Bytes.slice(Index, 2), outs());
- outs() << "\t\t.short\t";
- uint16_t Data = 0;
- if (Obj->isLittleEndian()) {
- const auto Short =
- reinterpret_cast<const support::ulittle16_t *>(
- Bytes.data() + Index);
- Data = *Short;
- } else {
- const auto Short =
- reinterpret_cast<const support::ubig16_t *>(Bytes.data() +
- Index);
- Data = *Short;
- }
- outs() << "0x" << format("%04" PRIx16, Data);
- } else {
- Stride = 1;
- dumpBytes(Bytes.slice(Index, 1), outs());
- outs() << "\t\t.byte\t";
- outs() << "0x" << format("%02" PRIx8, Bytes.slice(Index, 1)[0]);
- }
- Index += Stride;
- outs() << "\n";
- auto TAI = std::lower_bound(TextMappingSymsAddr.begin(),
- TextMappingSymsAddr.end(), Index);
- if (TAI != TextMappingSymsAddr.end() && *TAI == Index)
- break;
+ !DisassembleAll &&
+ std::binary_search(DataMappingSymsAddr.begin(),
+ DataMappingSymsAddr.end(), Index)) {
+ // Switch to data.
+ support::endianness Endian =
+ Obj->isLittleEndian() ? support::little : support::big;
+ while (Index < End) {
+ outs() << format("%8" PRIx64 ":", SectionAddr + Index);
+ outs() << "\t";
+ if (Index + 4 <= End) {
+ dumpBytes(Bytes.slice(Index, 4), outs());
+ outs() << "\t.word\t"
+ << format_hex(support::endian::read32(Bytes.data() + Index,
+ Endian),
+ 10);
+ Index += 4;
+ } else if (Index + 2 <= End) {
+ dumpBytes(Bytes.slice(Index, 2), outs());
+ outs() << "\t\t.short\t"
+ << format_hex(support::endian::read16(Bytes.data() + Index,
+ Endian),
+ 6);
+ Index += 2;
+ } else {
+ dumpBytes(Bytes.slice(Index, 1), outs());
+ outs() << "\t\t.byte\t" << format_hex(Bytes[0], 4);
+ ++Index;
}
+ outs() << "\n";
+ if (std::binary_search(TextMappingSymsAddr.begin(),
+ TextMappingSymsAddr.end(), Index))
+ break;
}
}
@@ -1348,10 +1318,9 @@ static void disassembleObject(const Targ
// N.B. We don't walk the relocations in the relocatable case yet.
auto *TargetSectionSymbols = &Symbols;
if (!Obj->isRelocatableObject()) {
- auto SectionAddress = std::upper_bound(
- SectionAddresses.begin(), SectionAddresses.end(), Target,
- [](uint64_t LHS,
- const std::pair<uint64_t, SectionRef> &RHS) {
+ auto SectionAddress = llvm::upper_bound(
+ SectionAddresses, Target,
+ [](uint64_t LHS, const std::pair<uint64_t, SectionRef> &RHS) {
return LHS < RHS.first;
});
if (SectionAddress != SectionAddresses.begin()) {
@@ -1365,20 +1334,20 @@ static void disassembleObject(const Targ
// Find the first symbol in the section whose offset is less than
// or equal to the target. If there isn't a section that contains
// the target, find the nearest preceding absolute symbol.
- auto TargetSym = std::upper_bound(
- TargetSectionSymbols->begin(), TargetSectionSymbols->end(),
- Target, [](uint64_t LHS,
- const std::tuple<uint64_t, StringRef, uint8_t> &RHS) {
+ auto TargetSym = llvm::upper_bound(
+ *TargetSectionSymbols, Target,
+ [](uint64_t LHS,
+ const std::tuple<uint64_t, StringRef, uint8_t> &RHS) {
return LHS < std::get<0>(RHS);
});
if (TargetSym == TargetSectionSymbols->begin()) {
TargetSectionSymbols = &AbsoluteSymbols;
- TargetSym = std::upper_bound(
- AbsoluteSymbols.begin(), AbsoluteSymbols.end(),
- Target, [](uint64_t LHS,
- const std::tuple<uint64_t, StringRef, uint8_t> &RHS) {
- return LHS < std::get<0>(RHS);
- });
+ TargetSym = llvm::upper_bound(
+ AbsoluteSymbols, Target,
+ [](uint64_t LHS,
+ const std::tuple<uint64_t, StringRef, uint8_t> &RHS) {
+ return LHS < std::get<0>(RHS);
+ });
}
if (TargetSym != TargetSectionSymbols->begin()) {
--TargetSym;
More information about the llvm-commits
mailing list