Author: adrian Date: Tue Oct 8 09:59:24 2019 New Revision: 374084 URL: http://llvm.org/viewvc/llvm-project?rev=374084&view=rev Log: ObjectFileMachO: Replace std::map with llvm::DenseMap (NFC)
This makes parsing the symbol table of clang marginally faster. (Hashtable versus tree). Differential Revision: https://reviews.llvm.org/D68605 Modified: lldb/trunk/include/lldb/Utility/ConstString.h lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Modified: lldb/trunk/include/lldb/Utility/ConstString.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Utility/ConstString.h?rev=374084&r1=374083&r2=374084&view=diff ============================================================================== --- lldb/trunk/include/lldb/Utility/ConstString.h (original) +++ lldb/trunk/include/lldb/Utility/ConstString.h Tue Oct 8 09:59:24 2019 @@ -10,6 +10,7 @@ #define liblldb_ConstString_h_ #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/DenseMapInfo.h" #include "llvm/Support/FormatVariadic.h" #include <stddef.h> @@ -437,6 +438,14 @@ public: static size_t StaticMemorySize(); protected: + template <typename T> 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 @@ template <> struct format_provider<lldb_ static void format(const lldb_private::ConstString &CS, llvm::raw_ostream &OS, llvm::StringRef Options); }; + +/// DenseMapInfo implementation. +/// \{ +template <> struct DenseMapInfo<lldb_private::ConstString> { + static inline lldb_private::ConstString getEmptyKey() { + return lldb_private::ConstString::FromStringPoolPointer( + DenseMapInfo<const char *>::getEmptyKey()); + } + static inline lldb_private::ConstString getTombstoneKey() { + return lldb_private::ConstString::FromStringPoolPointer( + DenseMapInfo<const char *>::getTombstoneKey()); + } + static unsigned getHashValue(lldb_private::ConstString val) { + return DenseMapInfo<const char *>::getHashValue(val.m_string); + } + static bool isEqual(lldb_private::ConstString LHS, + lldb_private::ConstString RHS) { + return LHS == RHS; + } +}; +/// \} } #endif // liblldb_ConstString_h_ Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=374084&r1=374083&r2=374084&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original) +++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Tue Oct 8 09:59:24 2019 @@ -2478,8 +2478,8 @@ size_t ObjectFileMachO::ParseSymtab() { std::vector<uint32_t> N_BRAC_indexes; std::vector<uint32_t> N_COMM_indexes; typedef std::multimap<uint64_t, uint32_t> ValueToSymbolIndexMap; - typedef std::map<uint32_t, uint32_t> NListIndexToSymbolIndexMap; - typedef std::map<const char *, uint32_t> ConstNameToSymbolIndexMap; + typedef llvm::DenseMap<uint32_t, uint32_t> NListIndexToSymbolIndexMap; + typedef llvm::DenseMap<const char *, uint32_t> ConstNameToSymbolIndexMap; ValueToSymbolIndexMap N_FUN_addr_to_sym_idx; ValueToSymbolIndexMap N_STSYM_addr_to_sym_idx; ConstNameToSymbolIndexMap N_GSYM_name_to_sym_idx; @@ -2689,8 +2689,8 @@ size_t ObjectFileMachO::ParseSymtab() { offset = 0; - typedef std::map<ConstString, uint16_t> UndefinedNameToDescMap; - typedef std::map<uint32_t, ConstString> SymbolIndexToName; + typedef llvm::DenseMap<ConstString, uint16_t> UndefinedNameToDescMap; + typedef llvm::DenseMap<uint32_t, ConstString> SymbolIndexToName; UndefinedNameToDescMap undefined_name_to_desc; SymbolIndexToName reexport_shlib_needs_fixup; @@ -3487,15 +3487,11 @@ size_t ObjectFileMachO::ParseSymtab() { // matches, then we can merge the two into just the // function symbol to avoid duplicate entries in // the symbol table - std::pair<ValueToSymbolIndexMap::const_iterator, - ValueToSymbolIndexMap::const_iterator> - 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, @@ -3536,15 +3532,11 @@ size_t ObjectFileMachO::ParseSymtab() { // matches, then we can merge the two into just the // Static symbol to avoid duplicate entries in the // symbol table - std::pair<ValueToSymbolIndexMap::const_iterator, - ValueToSymbolIndexMap::const_iterator> - 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, @@ -3667,8 +3659,8 @@ size_t ObjectFileMachO::ParseSymtab() { nlist_idx = 0; } - typedef std::map<ConstString, uint16_t> UndefinedNameToDescMap; - typedef std::map<uint32_t, ConstString> SymbolIndexToName; + typedef llvm::DenseMap<ConstString, uint16_t> UndefinedNameToDescMap; + typedef llvm::DenseMap<uint32_t, ConstString> SymbolIndexToName; UndefinedNameToDescMap undefined_name_to_desc; SymbolIndexToName reexport_shlib_needs_fixup; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits