Index: lldb/lit/SymbolFile/Inputs/sizeless-symbol.s =================================================================== --- /dev/null +++ lldb/lit/SymbolFile/Inputs/sizeless-symbol.s @@ -0,0 +1,12 @@ + .text + .byte 0 +sizeless: + .globl sizeless + .type sizeless, @object +sizeful: + .globl sizeful + .type sizeful, @object + .byte 0 + .byte 0 +sizeend: + .size sizeful, sizeend - sizeful Index: lldb/lit/SymbolFile/sizeless-symbol.test =================================================================== --- /dev/null +++ lldb/lit/SymbolFile/sizeless-symbol.test @@ -0,0 +1,7 @@ +# RUN: %clang %S/Inputs/sizeless-symbol.s -c -o %t.o +# RUN: %lldb %t.o -s %s -o quit | FileCheck %s + +image lookup --address 1 +# CHECK: Summary: sizeless-symbol.test.tmp.o`sizeful +image lookup --address 2 +# CHECK: Summary: sizeless-symbol.test.tmp.o`sizeful + 1 Index: lldb/source/Symbol/Symtab.cpp =================================================================== --- lldb/source/Symbol/Symtab.cpp +++ lldb/source/Symbol/Symtab.cpp @@ -873,7 +873,7 @@ m_file_addr_to_index.Append(entry); } } - const size_t num_entries = m_file_addr_to_index.GetSize(); + const ssize_t num_entries = m_file_addr_to_index.GetSize(); if (num_entries > 0) { m_file_addr_to_index.Sort(); @@ -893,11 +893,15 @@ // entries that didn't already have a size from the Symbol (e.g. if we // have a plain linker symbol with an address only, instead of debug info // where we get an address and a size and a type, etc.) - for (size_t i = 0; i < num_entries; i++) { + // Check symbols downwards as symbols at the same address with size will + // be ordered after zero-sized symbols. + for (ssize_t i = num_entries - 1 ; i >= 0; --i) { FileRangeToIndexMap::Entry *entry = m_file_addr_to_index.GetMutableEntryAtIndex(i); - if (entry->GetByteSize() == 0) { - addr_t curr_base_addr = entry->GetRangeBase(); + if (entry->GetByteSize() > 0) + continue; + addr_t curr_base_addr = entry->GetRangeBase(); + if (i == num_entries - 1 || m_file_addr_to_index.GetMutableEntryAtIndex(i + 1)->GetRangeBase() != curr_base_addr) { const RangeVector::Entry *containing_section = section_ranges.FindEntryThatContains(curr_base_addr); @@ -909,7 +913,7 @@ (entry->GetRangeBase() - containing_section->GetRangeBase()); } - for (size_t j = i; j < num_entries; j++) { + for (ssize_t j = i; j < num_entries; j++) { FileRangeToIndexMap::Entry *next_entry = m_file_addr_to_index.GetMutableEntryAtIndex(j); addr_t next_base_addr = next_entry->GetRangeBase();