Index: lldb/include/lldb/Utility/ConstString.h =================================================================== --- lldb/include/lldb/Utility/ConstString.h +++ lldb/include/lldb/Utility/ConstString.h @@ -10,6 +10,7 @@ #define liblldb_ConstString_h_ #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/DenseMapInfo.h" #include "llvm/Support/FormatVariadic.h" #include @@ -437,6 +438,14 @@ static size_t StaticMemorySize(); protected: + template friend struct ::llvm::DenseMapInfo; + /// Only used by DenseMapInfo. + static ConstString FromStringPoolPointer(const char *ptr) { + ConstString s; + s.m_string = ptr; + return s; + }; + // Member variables const char *m_string; }; @@ -451,6 +460,27 @@ static void format(const lldb_private::ConstString &CS, llvm::raw_ostream &OS, llvm::StringRef Options); }; + +/// DenseMapInfo implementation. +/// \{ +template <> struct DenseMapInfo { + static inline lldb_private::ConstString getEmptyKey() { + return lldb_private::ConstString::FromStringPoolPointer( + DenseMapInfo::getEmptyKey()); + } + static inline lldb_private::ConstString getTombstoneKey() { + return lldb_private::ConstString::FromStringPoolPointer( + DenseMapInfo::getTombstoneKey()); + } + static unsigned getHashValue(lldb_private::ConstString val) { + return DenseMapInfo::getHashValue(val.m_string); + } + static bool isEqual(lldb_private::ConstString LHS, + lldb_private::ConstString RHS) { + return LHS == RHS; + } +}; +/// \} } #endif // liblldb_ConstString_h_ Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp =================================================================== --- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -1932,7 +1932,7 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset, const bool is_arm, std::vector &nameSlices, - std::set &resolver_addresses, + llvm::DenseSet &resolver_addresses, std::vector &output) { if (!data.ValidOffset(offset)) return true; @@ -2475,8 +2475,8 @@ std::vector N_BRAC_indexes; std::vector N_COMM_indexes; typedef std::multimap ValueToSymbolIndexMap; - typedef std::map NListIndexToSymbolIndexMap; - typedef std::map ConstNameToSymbolIndexMap; + typedef llvm::DenseMap NListIndexToSymbolIndexMap; + typedef llvm::DenseMap ConstNameToSymbolIndexMap; ValueToSymbolIndexMap N_FUN_addr_to_sym_idx; ValueToSymbolIndexMap N_STSYM_addr_to_sym_idx; ConstNameToSymbolIndexMap N_GSYM_name_to_sym_idx; @@ -2493,7 +2493,7 @@ uint32_t unmapped_local_symbols_found = 0; std::vector trie_entries; - std::set resolver_addresses; + llvm::DenseSet resolver_addresses; if (dyld_trie_data.GetByteSize() > 0) { std::vector nameSlices; @@ -2686,8 +2686,8 @@ offset = 0; - typedef std::map UndefinedNameToDescMap; - typedef std::map SymbolIndexToName; + typedef llvm::DenseMap UndefinedNameToDescMap; + typedef llvm::DenseMap SymbolIndexToName; UndefinedNameToDescMap undefined_name_to_desc; SymbolIndexToName reexport_shlib_needs_fixup; @@ -3484,15 +3484,11 @@ // matches, then we can merge the two into just the // function symbol to avoid duplicate entries in // the symbol table - std::pair - range; - range = + auto range = N_FUN_addr_to_sym_idx.equal_range(nlist.n_value); if (range.first != range.second) { bool found_it = false; - for (ValueToSymbolIndexMap::const_iterator pos = - range.first; + for (const auto pos = range.first; pos != range.second; ++pos) { if (sym[sym_idx].GetMangled().GetName( lldb::eLanguageTypeUnknown, @@ -3533,15 +3529,11 @@ // matches, then we can merge the two into just the // Static symbol to avoid duplicate entries in the // symbol table - std::pair - range; - range = N_STSYM_addr_to_sym_idx.equal_range( + auto range = N_STSYM_addr_to_sym_idx.equal_range( nlist.n_value); if (range.first != range.second) { bool found_it = false; - for (ValueToSymbolIndexMap::const_iterator pos = - range.first; + for (const auto pos = range.first; pos != range.second; ++pos) { if (sym[sym_idx].GetMangled().GetName( lldb::eLanguageTypeUnknown, @@ -3664,8 +3656,8 @@ nlist_idx = 0; } - typedef std::map UndefinedNameToDescMap; - typedef std::map SymbolIndexToName; + typedef llvm::DenseMap UndefinedNameToDescMap; + typedef llvm::DenseMap SymbolIndexToName; UndefinedNameToDescMap undefined_name_to_desc; SymbolIndexToName reexport_shlib_needs_fixup; for (; nlist_idx < symtab_load_command.nsyms; ++nlist_idx) {