[PATCH] D156622: [llvm-objdump] [NFC] Use a single vector to store all symbol mappings.
Jacek Caban via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 30 10:36:00 PDT 2023
jacek created this revision.
Herald added a subscriber: mgrang.
Herald added a reviewer: jhenderson.
Herald added a reviewer: MaskRay.
Herald added a project: All.
jacek requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
This is a preparation for D149095 <https://reviews.llvm.org/D149095>. D156190 <https://reviews.llvm.org/D156190> introduced AllMappingSymbols, which is close to what CHPE map. CHPE map operates on ranges that may cross sections. This patch uses a single vector for all mappings and leaves handling of mapping from other sections up to getMappingSymbolKind.
https://reviews.llvm.org/D156622
Files:
llvm/tools/llvm-objdump/llvm-objdump.cpp
Index: llvm/tools/llvm-objdump/llvm-objdump.cpp
===================================================================
--- llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1116,22 +1116,20 @@
typedef std::pair<uint64_t, char> MappingSymbolPair;
static char getMappingSymbolKind(ArrayRef<MappingSymbolPair> MappingSymbols,
- uint64_t Address) {
- auto It =
- partition_point(MappingSymbols, [Address](const MappingSymbolPair &Val) {
- return Val.first <= Address;
- });
+ uint64_t SectionAddress, uint64_t Index) {
+ auto It = partition_point(MappingSymbols, [=](const MappingSymbolPair &Val) {
+ return Val.first <= SectionAddress + Index;
+ });
// Return zero for any address before the first mapping symbol; this means
// we should use the default disassembly mode, depending on the target.
- if (It == MappingSymbols.begin())
+ if (It == MappingSymbols.begin() || (--It)->first < SectionAddress)
return '\x00';
- return (It - 1)->second;
+ return It->second;
}
static uint64_t dumpARMELFData(uint64_t SectionAddr, uint64_t Index,
uint64_t End, const ObjectFile &Obj,
ArrayRef<uint8_t> Bytes,
- ArrayRef<MappingSymbolPair> MappingSymbols,
const MCSubtargetInfo &STI, raw_ostream &OS) {
support::endianness Endian =
Obj.isLittleEndian() ? support::little : support::big;
@@ -1428,7 +1426,7 @@
// Create a mapping from virtual address to symbol name. This is used to
// pretty print the symbols while disassembling.
std::map<SectionRef, SectionSymbolsTy> AllSymbols;
- std::map<SectionRef, SmallVector<MappingSymbolPair, 0>> AllMappingSymbols;
+ std::vector<MappingSymbolPair> MappingSymbols;
SectionSymbolsTy AbsoluteSymbols;
const StringRef FileName = Obj.getFileName();
const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(&Obj);
@@ -1448,19 +1446,17 @@
// synthesize a section symbol if no symbol is defined at offset 0.
//
// For a mapping symbol, store it within both AllSymbols and
- // AllMappingSymbols. If --show-all-symbols is unspecified, its label will
+ // MappingSymbols. If --show-all-symbols is unspecified, its label will
// not be printed in disassembly listing.
if (getElfSymbolType(Obj, Symbol) != ELF::STT_SECTION &&
hasMappingSymbols(Obj)) {
section_iterator SecI = unwrapOrError(Symbol.getSection(), FileName);
if (SecI != Obj.section_end()) {
- uint64_t SectionAddr = SecI->getAddress();
uint64_t Address = cantFail(Symbol.getAddress());
StringRef Name = *NameOrErr;
if (Name.consume_front("$") && Name.size() &&
strchr("adtx", Name[0])) {
- AllMappingSymbols[*SecI].emplace_back(Address - SectionAddr,
- Name[0]);
+ MappingSymbols.emplace_back(Address, Name[0]);
AllSymbols[*SecI].push_back(
createSymbolInfo(Obj, Symbol, /*MappingSymbol=*/true));
}
@@ -1493,6 +1489,8 @@
AbsoluteSymbols.push_back(createSymbolInfo(Obj, Symbol));
}
+ llvm::sort(MappingSymbols);
+
if (AllSymbols.empty() && Obj.isELF())
addDynamicElfSymbols(cast<ELFObjectFileBase>(Obj), AllSymbols);
@@ -1603,8 +1601,6 @@
// Get the list of all the symbols in this section.
SectionSymbolsTy &Symbols = AllSymbols[Section];
- auto &MappingSymbols = AllMappingSymbols[Section];
- llvm::sort(MappingSymbols);
ArrayRef<uint8_t> Bytes = arrayRefFromStringRef(
unwrapOrError(Section.getContents(), Obj.getFileName()));
@@ -1898,7 +1894,7 @@
// we need to dump. If the data marker is within a function, it is
// denoted as a word/short etc.
if (!MappingSymbols.empty()) {
- char Kind = getMappingSymbolKind(MappingSymbols, Index);
+ char Kind = getMappingSymbolKind(MappingSymbols, SectionAddr, Index);
DumpARMELFData = Kind == 'd';
if (SecondaryTarget) {
if (Kind == 'a') {
@@ -1911,7 +1907,7 @@
if (DumpARMELFData) {
Size = dumpARMELFData(SectionAddr, Index, End, Obj, Bytes,
- MappingSymbols, *DT->SubtargetInfo, FOS);
+ *DT->SubtargetInfo, FOS);
} else {
// When -z or --disassemble-zeroes are given we always dissasemble
// them. Otherwise we might want to skip zero bytes we see.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D156622.545451.patch
Type: text/x-patch
Size: 4682 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230730/6e52081c/attachment.bin>
More information about the llvm-commits
mailing list