Index: lib/Object/MachOObjectFile.cpp =================================================================== --- lib/Object/MachOObjectFile.cpp +++ lib/Object/MachOObjectFile.cpp @@ -2823,7 +2823,11 @@ } bool MachORebaseEntry::operator==(const MachORebaseEntry &Other) const { +#ifdef EXPENSIVE_CHECKS assert(Opcodes == Other.Opcodes && "compare iterators of different files"); +#else + assert(Opcodes.data() == Other.Opcodes.data() && "compare iterators of different files"); +#endif return (Ptr == Other.Ptr) && (RemainingLoopCount == Other.RemainingLoopCount) && (Done == Other.Done); @@ -3073,7 +3077,11 @@ int MachOBindEntry::ordinal() const { return Ordinal; } bool MachOBindEntry::operator==(const MachOBindEntry &Other) const { +#ifdef EXPENSIVE_CHECKS assert(Opcodes == Other.Opcodes && "compare iterators of different files"); +#else + assert(Opcodes.data() == Other.Opcodes.data() && "compare iterators of different files"); +#endif return (Ptr == Other.Ptr) && (RemainingLoopCount == Other.RemainingLoopCount) && (Done == Other.Done); Index: tools/llvm-objdump/MachODump.cpp =================================================================== --- tools/llvm-objdump/MachODump.cpp +++ tools/llvm-objdump/MachODump.cpp @@ -1780,10 +1780,6 @@ llvm_unreachable("Input object can't be invalid at this point"); } -typedef std::pair BindInfoEntry; -typedef std::vector 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 @@ char *demangled_name; uint64_t adrp_addr; uint32_t adrp_inst; - BindTable *bindtable; + std::unique_ptr bindtable; uint32_t depth; }; @@ -5311,9 +5307,6 @@ 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 @@ 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 @@ 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(); SegInfo sectionTable(info->O); for (const llvm::object::MachOBindEntry &Entry : info->O->bindTable()) { uint32_t SegIndex = Entry.segmentIndex(); @@ -9435,21 +9424,11 @@ 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; }