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 | ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987 (patch) | |
tree | f6a6202a23930d4ae18f10f7b7feea424ae04f3e | |
parent | 811ded5b244c20a9f39a04aba1a11ce02aa45f5e (diff) | |
download | lldb-ed11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987.tar.gz |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@140822 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/lldb/Symbol/Block.h | 2 | ||||
-rw-r--r-- | include/lldb/lldb-private-log.h | 2 | ||||
-rw-r--r-- | source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp | 2 | ||||
-rw-r--r-- | source/Symbol/Block.cpp | 57 | ||||
-rw-r--r-- | source/lldb-log.cpp | 3 |
5 files changed, 59 insertions, 7 deletions
diff --git a/include/lldb/Symbol/Block.h b/include/lldb/Symbol/Block.h index 8fabf9540..669861832 100644 --- a/include/lldb/Symbol/Block.h +++ b/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/include/lldb/lldb-private-log.h b/include/lldb/lldb-private-log.h index 7017fc564..41bbf7a16 100644 --- a/include/lldb/lldb-private-log.h +++ b/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/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 13e0d1af6..b101c1798 100644 --- a/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/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/source/Symbol/Block.cpp b/source/Symbol/Block.cpp index ed7772178..d0f8ff323 100644 --- a/source/Symbol/Block.cpp +++ b/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/source/lldb-log.cpp b/source/lldb-log.cpp index 737cdc4ed..6dc32f0d3 100644 --- a/source/lldb-log.cpp +++ b/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"); } |