summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTamas Berghammer <tberghammer@google.com>2016-01-19 10:24:51 +0000
committerTamas Berghammer <tberghammer@google.com>2016-01-19 10:24:51 +0000
commit8c6996f737fe941ce58366183c6bda2282b3054d (patch)
treefd37f4d3c578c3e906131a2fdae0978c67fb2daa
parent2a3810e8f7a45a118b5d55eb7f9d1e0cae363fd2 (diff)
downloadbcm5719-llvm-8c6996f737fe941ce58366183c6bda2282b3054d.tar.gz
bcm5719-llvm-8c6996f737fe941ce58366183c6bda2282b3054d.zip
Unconditionally accept symbol sizes from elf
The ELF symbol table always contain the size of the symbols so we don't have to try to guess them based on the address of the next symbol (it is needed for mach-o). The change fixes an issue when a symbol is removed after a 0 size symbol (e.g. because the second one is not public) what previously caused the symbol lookup algorithm to end up with showing the 0 size symbol even for the later addresses (what are not part of any symbol). That symbol lookup error can confuse the user and also confuses the current stack unwinder. Re-commit this CL after fixing the issue with gcc-4.9.2 on i386 Linux. Differential revision: http://reviews.llvm.org/D16186 llvm-svn: 258113
-rw-r--r--lldb/include/lldb/Symbol/Symbol.h3
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp12
-rw-r--r--lldb/source/Symbol/Symbol.cpp7
-rw-r--r--lldb/source/Symbol/Symtab.cpp23
4 files changed, 33 insertions, 12 deletions
diff --git a/lldb/include/lldb/Symbol/Symbol.h b/lldb/include/lldb/Symbol/Symbol.h
index c77d3dea4bd..43f29f368d9 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 ea7c0640440..9f2cd4f3fd1 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 5884fcaa551..1fa792c9729 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 b20504addec..31db57289fd 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;
}
OpenPOWER on IntegriCloud