aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-09-29 23:41:34 +0000
committerGreg Clayton <gclayton@apple.com>2011-09-29 23:41:34 +0000
commited11c1ebc344458c2bc83aa5b0bf6b3d0e2ef987 (patch)
treef6a6202a23930d4ae18f10f7b7feea424ae04f3e
parent811ded5b244c20a9f39a04aba1a11ce02aa45f5e (diff)
downloadlldb-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.h2
-rw-r--r--include/lldb/lldb-private-log.h2
-rw-r--r--source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp2
-rw-r--r--source/Symbol/Block.cpp57
-rw-r--r--source/lldb-log.cpp3
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");
}