diff --git a/lldb/include/lldb/Symbol/Symbol.h b/lldb/include/lldb/Symbol/Symbol.h index c77d3dea4bd2..43f29f368d92 100644 --- a/lldb/include/lldb/Symbol/Symbol.h +++ b/lldb/include/lldb/Symbol/Symbol.h @@ -383,6 +383,9 @@ public: bool prefer_file_cache, Stream &strm); + bool + ContainsFileAddress (lldb::addr_t file_addr) const; + protected: // This is the internal guts of ResolveReExportedSymbol, it assumes reexport_name is not null, and that module_spec // is valid. We track the modules we've already seen to make sure we don't get caught in a cycle. diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index ea7c06404401..9f2cd4f3fd14 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2283,6 +2283,12 @@ ObjectFileELF::ParseSymbols (Symtab *symtab, mangled.SetDemangledName( ConstString((demangled_name + suffix).str()) ); } + // In ELF all symbol should have a valid size but it is not true for some code symbols + // coming from hand written assembly. As none of the code symbol should have 0 size we try + // to calculate the size for these symbols in the symtab with saying that their original + // size is not valid. + bool symbol_size_valid = symbol.st_size != 0 || symbol_type != eSymbolTypeCode; + Symbol dc_symbol( i + start_id, // ID is the original symbol table index. mangled, @@ -2295,7 +2301,7 @@ ObjectFileELF::ParseSymbols (Symtab *symtab, symbol_section_sp, // Section in which this symbol is defined or null. symbol_value, // Offset in section or symbol value. symbol.st_size), // Size in bytes of this symbol. - symbol.st_size != 0, // Size is valid if it is not 0 + symbol_size_valid, // Symbol size is valid has_suffix, // Contains linker annotations? flags); // Symbol flags. symtab->AddSymbol(dc_symbol); @@ -2304,7 +2310,9 @@ ObjectFileELF::ParseSymbols (Symtab *symtab, } unsigned -ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab) +ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, + user_id_t start_id, + lldb_private::Section *symtab) { if (symtab->GetObjectFile() != this) { diff --git a/lldb/source/Symbol/Symbol.cpp b/lldb/source/Symbol/Symbol.cpp index 5884fcaa551d..1fa792c9729d 100644 --- a/lldb/source/Symbol/Symbol.cpp +++ b/lldb/source/Symbol/Symbol.cpp @@ -737,3 +737,10 @@ Symbol::GetDisassembly (const ExecutionContext &exe_ctx, } return false; } + +bool +Symbol::ContainsFileAddress (lldb::addr_t file_addr) const +{ + return m_addr_range.ContainsFileAddress(file_addr); +} + diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp index b20504addec9..31db57289fdc 100644 --- a/lldb/source/Symbol/Symtab.cpp +++ b/lldb/source/Symbol/Symtab.cpp @@ -971,9 +971,11 @@ Symtab::InitAddressIndexes() if (end_section_file_addr > symbol_file_addr) { Symbol &symbol = m_symbols[entry.data]; - - symbol.SetByteSize(end_section_file_addr - symbol_file_addr); - symbol.SetSizeIsSynthesized(true); + if (!symbol.GetByteSizeIsValid()) + { + symbol.SetByteSize(end_section_file_addr - symbol_file_addr); + symbol.SetSizeIsSynthesized(true); + } } } } @@ -1039,18 +1041,15 @@ Symtab::FindSymbolContainingFileAddress (addr_t file_addr, const uint32_t* index return info.match_symbol; } - const size_t symbol_byte_size = info.match_symbol->GetByteSize(); - - if (symbol_byte_size == 0) + if (!info.match_symbol->GetByteSizeIsValid()) { - // We weren't able to find the size of the symbol so lets just go - // with that match we found in our search... + // The matched symbol dosn't have a valid byte size so lets just go with that match... return info.match_symbol; } // We were able to figure out a symbol size so lets make sure our // offset puts "file_addr" in the symbol's address range. - if (info.match_offset < symbol_byte_size) + if (info.match_offset < info.match_symbol->GetByteSize()) return info.match_symbol; } return nullptr; @@ -1066,7 +1065,11 @@ Symtab::FindSymbolContainingFileAddress (addr_t file_addr) const FileRangeToIndexMap::Entry *entry = m_file_addr_to_index.FindEntryThatContains(file_addr); if (entry) - return SymbolAtIndex(entry->data); + { + Symbol* symbol = SymbolAtIndex(entry->data); + if (symbol->ContainsFileAddress(file_addr)) + return symbol; + } return nullptr; }