diff options
| author | Greg Clayton <gclayton@apple.com> | 2011-09-29 23:41:34 +0000 |
|---|---|---|
| committer | Greg Clayton <gclayton@apple.com> | 2011-09-29 23:41:34 +0000 |
| commit | 6c7f56192fa6e689ef14d32e43a785de5692e9c0 (patch) | |
| tree | 8846a2853b68e0c5f59e76751ef68d46093cac0c /lldb/source/Symbol/Block.cpp | |
| parent | a3e7ffdae80e06f88191be8ec80d7d21f158ac54 (diff) | |
| download | bcm5719-llvm-6c7f56192fa6e689ef14d32e43a785de5692e9c0.tar.gz bcm5719-llvm-6c7f56192fa6e689ef14d32e43a785de5692e9c0.zip | |
Fixed an issue where a lexical block or inlined function might have bad debug
information generated for it. Say we have a concrete function "foo" which
has inlined function "a" which calls another inlined function "b":
foo
1 {
2 {
a ()
3 {
b ()
4 {
}
}
}
}
Sometimes we see the compiler generate an address range in the DWARF for "foo"
(block 1 above) as say [0x1000-0x1100). Then the range for "a" is something
like [0x1050-0x1060) (note that it is correctly scoped within the "foo"
address range). And then we get "b" which is a child of "a", yet the debug
info says it has a range of [0x1060-0x1080) (not contained within "a"). We now
detect this issue when making our blocks and add an extra range to "a".
Also added a new "lldb" logging category named "symbol" where we can find out
about symbol file errors and warnings.
llvm-svn: 140822
Diffstat (limited to 'lldb/source/Symbol/Block.cpp')
| -rw-r--r-- | lldb/source/Symbol/Block.cpp | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/lldb/source/Symbol/Block.cpp b/lldb/source/Symbol/Block.cpp index ed7772178f0..d0f8ff32389 100644 --- a/lldb/source/Symbol/Block.cpp +++ b/lldb/source/Symbol/Block.cpp @@ -8,9 +8,13 @@ //===----------------------------------------------------------------------===// #include "lldb/Symbol/Block.h" -#include "lldb/Symbol/Function.h" + +#include "lldb/lldb-private-log.h" + +#include "lldb/Core/Log.h" #include "lldb/Core/Module.h" #include "lldb/Core/Section.h" +#include "lldb/Symbol/Function.h" #include "lldb/Symbol/SymbolFile.h" #include "lldb/Symbol/SymbolVendor.h" #include "lldb/Symbol/VariableList.h" @@ -433,10 +437,53 @@ Block::GetStartAddress (Address &addr) } void -Block::AddRange(addr_t start_offset, addr_t end_offset) +Block::AddRange (const VMRange& new_range) { - m_ranges.resize(m_ranges.size()+1); - m_ranges.back().Reset(start_offset, end_offset); + Block *parent_block = GetParent (); + if (parent_block && !parent_block->Contains(new_range)) + { + LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_SYMBOLS)); + if (log) + { + Module *module = m_parent_scope->CalculateSymbolContextModule(); + Function *function = m_parent_scope->CalculateSymbolContextFunction(); + const addr_t function_file_addr = function->GetAddressRange().GetBaseAddress().GetFileAddress(); + const addr_t block_start_addr = function_file_addr + new_range.GetBaseAddress (); + const addr_t block_end_addr = function_file_addr + new_range.GetEndAddress (); + Type *func_type = function->GetType(); + + const Declaration &func_decl = func_type->GetDeclaration(); + if (func_decl.GetLine()) + { + log->Printf ("warning: %s/%s:%u block {0x%8.8x} has range[%u] [0x%llx - 0x%llx) which is not contained in parent block {0x%8.8x} in function {0x%8.8x} from %s/%s", + func_decl.GetFile().GetDirectory().GetCString(), + func_decl.GetFile().GetFilename().GetCString(), + func_decl.GetLine(), + GetID(), + (uint32_t)m_ranges.size(), + block_start_addr, + block_end_addr, + parent_block->GetID(), + function->GetID(), + module->GetFileSpec().GetDirectory().GetCString(), + module->GetFileSpec().GetFilename().GetCString()); + } + else + { + log->Printf ("warning: block {0x%8.8x} has range[%u] [0x%llx - 0x%llx) which is not contained in parent block {0x%8.8x} in function {0x%8.8x} from %s/%s", + GetID(), + (uint32_t)m_ranges.size(), + block_start_addr, + block_end_addr, + parent_block->GetID(), + function->GetID(), + module->GetFileSpec().GetDirectory().GetCString(), + module->GetFileSpec().GetFilename().GetCString()); + } + } + parent_block->AddRange (new_range); + } + m_ranges.push_back(new_range); } // Return the current number of bytes that this object occupies in memory @@ -605,7 +652,7 @@ Block::GetSibling() const { if (m_parent_scope) { - Block *parent_block = m_parent_scope->CalculateSymbolContextBlock(); + Block *parent_block = GetParent(); if (parent_block) return parent_block->GetSiblingForChild (this); } |

