diff options
Diffstat (limited to 'lldb/source')
| -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 |
3 files changed, 56 insertions, 6 deletions
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"); } |

