diff options
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp | 11 | ||||
-rw-r--r-- | lldb/source/Symbol/Symtab.cpp | 11 |
2 files changed, 22 insertions, 0 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp index 413920f..4db946c 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp @@ -100,6 +100,7 @@ bool NameToDIE::Decode(const DataExtractor &data, lldb::offset_t *offset_ptr, if (identifier != kIdentifierNameToDIE) return false; const uint32_t count = data.GetU32(offset_ptr); + m_map.Reserve(count); for (uint32_t i = 0; i < count; ++i) { llvm::StringRef str(strtab.Get(data.GetU32(offset_ptr))); // No empty strings allowed in the name to DIE maps. @@ -110,6 +111,16 @@ bool NameToDIE::Decode(const DataExtractor &data, lldb::offset_t *offset_ptr, else return false; } + // We must sort the UniqueCStringMap after decoding it since it is a vector + // of UniqueCStringMap::Entry objects which contain a ConstString and type T. + // ConstString objects are sorted by "const char *" and then type T and + // the "const char *" are point values that will depend on the order in which + // ConstString objects are created and in which of the 256 string pools they + // are created in. So after we decode all of the entries, we must sort the + // name map to ensure name lookups succeed. If we encode and decode within + // the same process we wouldn't need to sort, so unit testing didn't catch + // this issue when first checked in. + m_map.Sort(std::less<DIERef>()); return true; } diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp index d148706..eb2447e 100644 --- a/lldb/source/Symbol/Symtab.cpp +++ b/lldb/source/Symbol/Symtab.cpp @@ -1204,6 +1204,7 @@ bool DecodeCStrMap(const DataExtractor &data, lldb::offset_t *offset_ptr, if (identifier != kIdentifierCStrMap) return false; const uint32_t count = data.GetU32(offset_ptr); + cstr_map.Reserve(count); for (uint32_t i=0; i<count; ++i) { llvm::StringRef str(strtab.Get(data.GetU32(offset_ptr))); @@ -1213,6 +1214,16 @@ bool DecodeCStrMap(const DataExtractor &data, lldb::offset_t *offset_ptr, return false; cstr_map.Append(ConstString(str), value); } + // We must sort the UniqueCStringMap after decoding it since it is a vector + // of UniqueCStringMap::Entry objects which contain a ConstString and type T. + // ConstString objects are sorted by "const char *" and then type T and + // the "const char *" are point values that will depend on the order in which + // ConstString objects are created and in which of the 256 string pools they + // are created in. So after we decode all of the entries, we must sort the + // name map to ensure name lookups succeed. If we encode and decode within + // the same process we wouldn't need to sort, so unit testing didn't catch + // this issue when first checked in. + cstr_map.Sort(); return true; } |