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 | |
| 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
| -rw-r--r-- | lldb/include/lldb/Symbol/Block.h | 2 | ||||
| -rw-r--r-- | lldb/include/lldb/lldb-private-log.h | 2 | ||||
| -rw-r--r-- | lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 2 | ||||
| -rw-r--r-- | lldb/source/Symbol/Block.cpp | 57 | ||||
| -rw-r--r-- | lldb/source/lldb-log.cpp | 3 |
5 files changed, 59 insertions, 7 deletions
diff --git a/lldb/include/lldb/Symbol/Block.h b/lldb/include/lldb/Symbol/Block.h index 8fabf954073..669861832ab 100644 --- a/lldb/include/lldb/Symbol/Block.h +++ b/lldb/include/lldb/Symbol/Block.h @@ -97,7 +97,7 @@ public: /// describes the end address of a range for this block. //------------------------------------------------------------------ void - AddRange(lldb::addr_t start_offset, lldb::addr_t end_offset); + AddRange (const VMRange& range); //------------------------------------------------------------------ /// @copydoc SymbolContextScope::CalculateSymbolContext(SymbolContext*) diff --git a/lldb/include/lldb/lldb-private-log.h b/lldb/include/lldb/lldb-private-log.h index 7017fc56419..41bbf7a16b4 100644 --- a/lldb/include/lldb/lldb-private-log.h +++ b/lldb/include/lldb/lldb-private-log.h @@ -39,6 +39,7 @@ #define LIBLLDB_LOG_SCRIPT (1u << 17) #define LIBLLDB_LOG_COMMANDS (1U << 18) #define LIBLLDB_LOG_TYPES (1u << 19) +#define LIBLLDB_LOG_SYMBOLS (1u << 20) #define LIBLLDB_LOG_ALL (UINT32_MAX) #define LIBLLDB_LOG_DEFAULT (LIBLLDB_LOG_PROCESS |\ LIBLLDB_LOG_THREAD |\ @@ -47,6 +48,7 @@ LIBLLDB_LOG_WATCHPOINTS |\ LIBLLDB_LOG_STEP |\ LIBLLDB_LOG_STATE |\ + LIBLLDB_LOG_SYMBOLS |\ LIBLLDB_LOG_COMMANDS) namespace lldb_private { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 13e0d1af654..b101c1798d0 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -635,7 +635,7 @@ AddRangesToBlock const DWARFDebugRanges::Range *debug_range; for (range_idx = 0; (debug_range = ranges.RangeAtIndex(range_idx)) != NULL; range_idx++) { - block.AddRange(debug_range->begin_offset, debug_range->end_offset); + block.AddRange(VMRange (debug_range->begin_offset, debug_range->end_offset)); } } 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); } diff --git a/lldb/source/lldb-log.cpp b/lldb/source/lldb-log.cpp index 737cdc4edfa..6dc32f0d378 100644 --- a/lldb/source/lldb-log.cpp +++ b/lldb/source/lldb-log.cpp @@ -135,6 +135,7 @@ lldb_private::DisableLog (Args &args, Stream *feedback_strm) else if (0 == ::strncasecmp(arg, "host", 4)) flag_bits &= ~LIBLLDB_LOG_HOST; else if (0 == ::strncasecmp(arg, "unwind", 6)) flag_bits &= ~LIBLLDB_LOG_UNWIND; else if (0 == ::strncasecmp(arg, "types", 5)) flag_bits &= ~LIBLLDB_LOG_TYPES; + else if (0 == ::strncasecmp(arg, "symbol", 6)) flag_bits &= ~LIBLLDB_LOG_SYMBOLS; else { feedback_strm->Printf ("error: unrecognized log category '%s'\n", arg); @@ -202,6 +203,7 @@ lldb_private::EnableLog (StreamSP &log_stream_sp, uint32_t log_options, Args &ar else if (0 == ::strncasecmp(arg, "host", 4)) flag_bits |= LIBLLDB_LOG_HOST; else if (0 == ::strncasecmp(arg, "unwind", 6)) flag_bits |= LIBLLDB_LOG_UNWIND; else if (0 == ::strncasecmp(arg, "types", 5)) flag_bits |= LIBLLDB_LOG_TYPES; + else if (0 == ::strncasecmp(arg, "symbol", 6)) flag_bits |= LIBLLDB_LOG_SYMBOLS; else { feedback_strm->Printf("error: unrecognized log category '%s'\n", arg); @@ -241,6 +243,7 @@ lldb_private::ListLogCategories (Stream *strm) " step - log step related activities\n" " unwind - log stack unwind activities\n" " verbose - enable verbose logging\n" + " symbol - log symbol related issues and warnings\n" " watch - log watchpoint related activities\n" " types - log type system related activities\n"); } |

