aboutsummaryrefslogtreecommitdiff
path: root/tools/llvm-objdump/MachODump.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-objdump/MachODump.cpp')
-rw-r--r--tools/llvm-objdump/MachODump.cpp31
1 files changed, 5 insertions, 26 deletions
diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp
index c43ccc211811..563084856f6f 100644
--- a/tools/llvm-objdump/MachODump.cpp
+++ b/tools/llvm-objdump/MachODump.cpp
@@ -1780,10 +1780,6 @@ void llvm::ParseInputMachO(StringRef Filename) {
llvm_unreachable("Input object can't be invalid at this point");
}
-typedef std::pair<uint64_t, const char *> BindInfoEntry;
-typedef std::vector<BindInfoEntry> BindTable;
-typedef BindTable::iterator bind_table_iterator;
-
// The block of info used by the Symbolizer call backs.
struct DisassembleInfo {
bool verbose;
@@ -1797,7 +1793,7 @@ struct DisassembleInfo {
char *demangled_name;
uint64_t adrp_addr;
uint32_t adrp_inst;
- BindTable *bindtable;
+ std::unique_ptr<SymbolAddressMap> bindtable;
uint32_t depth;
};
@@ -5311,9 +5307,6 @@ static void printObjc2_64bit_MetaData(MachOObjectFile *O, bool verbose) {
II = get_section(O, "__DATA", "__objc_imageinfo");
info.S = II;
print_image_info64(II, &info);
-
- if (info.bindtable != nullptr)
- delete info.bindtable;
}
static void printObjc2_32bit_MetaData(MachOObjectFile *O, bool verbose) {
@@ -6841,14 +6834,10 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF,
free(SymbolizerInfo.method);
if (SymbolizerInfo.demangled_name != nullptr)
free(SymbolizerInfo.demangled_name);
- if (SymbolizerInfo.bindtable != nullptr)
- delete SymbolizerInfo.bindtable;
if (ThumbSymbolizerInfo.method != nullptr)
free(ThumbSymbolizerInfo.method);
if (ThumbSymbolizerInfo.demangled_name != nullptr)
free(ThumbSymbolizerInfo.demangled_name);
- if (ThumbSymbolizerInfo.bindtable != nullptr)
- delete ThumbSymbolizerInfo.bindtable;
}
}
@@ -9427,7 +9416,7 @@ void llvm::printMachOWeakBindTable(const object::MachOObjectFile *Obj) {
static const char *get_dyld_bind_info_symbolname(uint64_t ReferenceValue,
struct DisassembleInfo *info) {
if (info->bindtable == nullptr) {
- info->bindtable = new (BindTable);
+ info->bindtable = llvm::make_unique<SymbolAddressMap>();
SegInfo sectionTable(info->O);
for (const llvm::object::MachOBindEntry &Entry : info->O->bindTable()) {
uint32_t SegIndex = Entry.segmentIndex();
@@ -9435,21 +9424,11 @@ static const char *get_dyld_bind_info_symbolname(uint64_t ReferenceValue,
if (!sectionTable.isValidSegIndexAndOffset(SegIndex, OffsetInSeg))
continue;
uint64_t Address = sectionTable.address(SegIndex, OffsetInSeg);
- const char *SymbolName = nullptr;
StringRef name = Entry.symbolName();
if (!name.empty())
- SymbolName = name.data();
- info->bindtable->push_back(std::make_pair(Address, SymbolName));
- }
- }
- for (bind_table_iterator BI = info->bindtable->begin(),
- BE = info->bindtable->end();
- BI != BE; ++BI) {
- uint64_t Address = BI->first;
- if (ReferenceValue == Address) {
- const char *SymbolName = BI->second;
- return SymbolName;
+ (*info->bindtable)[Address] = name;
}
}
- return nullptr;
+ auto name = info->bindtable->lookup(ReferenceValue);
+ return !name.empty() ? name.data() : nullptr;
}