aboutsummaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-07-10 19:21:23 +0000
committerGreg Clayton <gclayton@apple.com>2011-07-10 19:21:23 +0000
commitfb81642e03567a3413d94cdb632b6005a0ad4273 (patch)
treeb69380fa5685def03522b043accd14476ad4f3d1 /source
parent5638d2c0d72747d8334638a128a17246353b53a7 (diff)
downloadlldb-fb81642e03567a3413d94cdb632b6005a0ad4273.tar.gz
Allow the built in ValueObject summary providers for C strings
use lldb_private::Target::ReadMemory(...) to allow constant strings to be displayed in global variables prior on in between process execution. Centralized the variable declaration dumping into: bool Variable::DumpDeclaration (Stream *s, bool show_fullpaths, bool show_module); Fixed an issue if you used "target variable --regex <regex>" where the variable name would not be displayed, but the regular expression would. Fixed an issue when viewing global variables through "target variable" might not display correctly when doing DWARF in object files. git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@134878 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'source')
-rw-r--r--source/Commands/CommandObjectFrame.cpp6
-rw-r--r--source/Commands/CommandObjectTarget.cpp14
-rw-r--r--source/Core/ValueObject.cpp20
-rw-r--r--source/Symbol/Declaration.cpp7
-rw-r--r--source/Symbol/SymbolContext.cpp27
-rw-r--r--source/Symbol/Variable.cpp26
6 files changed, 82 insertions, 18 deletions
diff --git a/source/Commands/CommandObjectFrame.cpp b/source/Commands/CommandObjectFrame.cpp
index d184e0038..f82c06bcc 100644
--- a/source/Commands/CommandObjectFrame.cpp
+++ b/source/Commands/CommandObjectFrame.cpp
@@ -479,8 +479,10 @@ public:
if (m_option_variable.show_decl && var_sp->GetDeclaration ().GetFile())
{
- var_sp->GetDeclaration ().DumpStopContext (&s, false);
- s.PutCString (": ");
+ bool show_fullpaths = false;
+ bool show_module = true;
+ if (var_sp->DumpDeclaration(&s, show_fullpaths, show_module))
+ s.PutCString (": ");
}
ValueObject::DumpValueObject (result.GetOutputStream(),
diff --git a/source/Commands/CommandObjectTarget.cpp b/source/Commands/CommandObjectTarget.cpp
index 510fe488a..b957314cb 100644
--- a/source/Commands/CommandObjectTarget.cpp
+++ b/source/Commands/CommandObjectTarget.cpp
@@ -466,10 +466,12 @@ public:
break;
}
- if (m_option_variable.show_decl && var_sp->GetDeclaration ().GetFile())
+ if (m_option_variable.show_decl)
{
- var_sp->GetDeclaration ().DumpStopContext (&s, false);
- s.PutCString (": ");
+ bool show_fullpaths = false;
+ bool show_module = true;
+ if (var_sp->DumpDeclaration(&s, show_fullpaths, show_module))
+ s.PutCString (": ");
}
const Format format = m_option_variable.format;
@@ -528,6 +530,7 @@ public:
const char *arg = args.GetArgumentAtIndex(idx);
uint32_t matches = 0;
+ bool use_var_name = false;
if (m_option_variable.use_regex)
{
RegularExpression regex(arg);
@@ -537,6 +540,7 @@ public:
result.SetStatus (eReturnStatusFailed);
return false;
}
+ use_var_name = true;
matches = exe_ctx.target->GetImages().FindGlobalVariables (regex,
true,
UINT32_MAX,
@@ -573,10 +577,10 @@ public:
{
ValueObjectSP valobj_sp (valobj_list.GetValueObjectAtIndex(global_idx));
if (!valobj_sp)
- valobj_sp = ValueObjectVariable::Create (exe_ctx.target, var_sp);
+ valobj_sp = ValueObjectVariable::Create (exe_ctx.GetBestExecutionContextScope(), var_sp);
if (valobj_sp)
- DumpValueObject (s, var_sp, valobj_sp, arg);
+ DumpValueObject (s, var_sp, valobj_sp, use_var_name ? var_sp->GetName().GetCString() : arg);
}
}
}
diff --git a/source/Core/ValueObject.cpp b/source/Core/ValueObject.cpp
index 09cbd8c60..5c548dfbb 100644
--- a/source/Core/ValueObject.cpp
+++ b/source/Core/ValueObject.cpp
@@ -563,8 +563,8 @@ ValueObject::GetSummaryAsCString ()
if (type_flags.AnySet (ClangASTContext::eTypeIsArray | ClangASTContext::eTypeIsPointer) &&
ClangASTContext::IsCharType (elem_or_pointee_clang_type))
{
- Process *process = exe_scope->CalculateProcess();
- if (process != NULL)
+ Target *target = exe_scope->CalculateTarget();
+ if (target != NULL)
{
lldb::addr_t cstr_address = LLDB_INVALID_ADDRESS;
AddressType cstr_address_type = eAddressTypeInvalid;
@@ -593,15 +593,21 @@ ValueObject::GetSummaryAsCString ()
}
if (cstr_address != LLDB_INVALID_ADDRESS)
{
+ Address cstr_so_addr (NULL, cstr_address);
DataExtractor data;
size_t bytes_read = 0;
std::vector<char> data_buffer;
Error error;
+ bool prefer_file_cache = false;
if (cstr_len > 0)
{
data_buffer.resize(cstr_len);
data.SetData (&data_buffer.front(), data_buffer.size(), lldb::endian::InlHostByteOrder());
- bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), cstr_len, error);
+ bytes_read = target->ReadMemory (cstr_so_addr,
+ prefer_file_cache,
+ &data_buffer.front(),
+ cstr_len,
+ error);
if (bytes_read > 0)
{
sstr << '"';
@@ -629,7 +635,11 @@ ValueObject::GetSummaryAsCString ()
sstr << '"';
data.SetData (&data_buffer.front(), data_buffer.size(), endian::InlHostByteOrder());
- while ((bytes_read = process->ReadMemory (cstr_address, &data_buffer.front(), k_max_buf_size, error)) > 0)
+ while ((bytes_read = target->ReadMemory (cstr_so_addr,
+ prefer_file_cache,
+ &data_buffer.front(),
+ k_max_buf_size,
+ error)) > 0)
{
size_t len = strlen(&data_buffer.front());
if (len == 0)
@@ -649,7 +659,7 @@ ValueObject::GetSummaryAsCString ()
if (len < k_max_buf_size)
break;
- cstr_address += k_max_buf_size;
+ cstr_so_addr.Slide (k_max_buf_size);
}
sstr << '"';
}
diff --git a/source/Symbol/Declaration.cpp b/source/Symbol/Declaration.cpp
index 2b20a24e5..3943f02c5 100644
--- a/source/Symbol/Declaration.cpp
+++ b/source/Symbol/Declaration.cpp
@@ -46,7 +46,7 @@ Declaration::Dump(Stream *s, bool show_fullpaths) const
}
}
-void
+bool
Declaration::DumpStopContext (Stream *s, bool show_fullpaths) const
{
if (m_file)
@@ -62,15 +62,18 @@ Declaration::DumpStopContext (Stream *s, bool show_fullpaths) const
if (m_column > 0)
s->Printf(":%u", m_column);
#endif
+ return true;
}
- else
+ else if (m_line > 0)
{
s->Printf(" line %u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
if (m_column > 0)
s->Printf(":%u", m_column);
#endif
+ return true;
}
+ return false;
}
size_t
diff --git a/source/Symbol/SymbolContext.cpp b/source/Symbol/SymbolContext.cpp
index 2a56c3444..1f24f1339 100644
--- a/source/Symbol/SymbolContext.cpp
+++ b/source/Symbol/SymbolContext.cpp
@@ -110,7 +110,7 @@ SymbolContext::Clear()
symbol = NULL;
}
-void
+bool
SymbolContext::DumpStopContext
(
Stream *s,
@@ -121,6 +121,7 @@ SymbolContext::DumpStopContext
bool show_inlined_frames
) const
{
+ bool dumped_something = false;
if (show_module && module_sp)
{
if (show_fullpaths)
@@ -128,18 +129,25 @@ SymbolContext::DumpStopContext
else
*s << module_sp->GetFileSpec().GetFilename();
s->PutChar('`');
+ dumped_something = true;
}
if (function != NULL)
{
if (function->GetMangled().GetName())
+ {
+ dumped_something = true;
function->GetMangled().GetName().Dump(s);
+ }
if (addr.IsValid())
{
const addr_t function_offset = addr.GetOffset() - function->GetAddressRange().GetBaseAddress().GetOffset();
if (function_offset)
- s->Printf(" + %llu", function_offset);
+ {
+ dumped_something = true;
+ s->Printf(" + %llu", function_offset);
+ }
}
if (block != NULL)
@@ -147,11 +155,13 @@ SymbolContext::DumpStopContext
s->IndentMore();
block->DumpStopContext (s, this, NULL, show_fullpaths, show_inlined_frames);
s->IndentLess();
+ dumped_something = true;
}
else
{
if (line_entry.IsValid())
{
+ dumped_something = true;
s->PutCString(" at ");
if (line_entry.DumpStopContext(s, show_fullpaths))
return;
@@ -160,19 +170,28 @@ SymbolContext::DumpStopContext
}
else if (symbol != NULL)
{
- symbol->GetMangled().GetName().Dump(s);
+ if (symbol->GetMangled().GetName())
+ {
+ dumped_something = true;
+ symbol->GetMangled().GetName().Dump(s);
+ }
if (addr.IsValid() && symbol->GetAddressRangePtr())
{
const addr_t symbol_offset = addr.GetOffset() - symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset();
if (symbol_offset)
- s->Printf(" + %llu", symbol_offset);
+ {
+ dumped_something = true;
+ s->Printf(" + %llu", symbol_offset);
+ }
}
}
else if (addr.IsValid())
{
addr.Dump(s, exe_scope, Address::DumpStyleModuleWithFileAddress);
+ dumped_something = true;
}
+ return dumped_something;
}
void
diff --git a/source/Symbol/Variable.cpp b/source/Symbol/Variable.cpp
index a8ebe8592..64018692b 100644
--- a/source/Symbol/Variable.cpp
+++ b/source/Symbol/Variable.cpp
@@ -142,6 +142,32 @@ Variable::Dump(Stream *s, bool show_context) const
s->EOL();
}
+bool
+Variable::DumpDeclaration (Stream *s, bool show_fullpaths, bool show_module)
+{
+ bool dumped_declaration_info = false;
+ if (m_owner_scope)
+ {
+ SymbolContext sc;
+ m_owner_scope->CalculateSymbolContext(&sc);
+ sc.block = NULL;
+ sc.line_entry.Clear();
+ bool show_inlined_frames = false;
+
+ dumped_declaration_info = sc.DumpStopContext (s,
+ NULL,
+ Address(),
+ show_fullpaths,
+ show_module,
+ show_inlined_frames);
+
+ if (sc.function)
+ s->PutChar(':');
+ }
+ if (m_declaration.DumpStopContext (s, false))
+ dumped_declaration_info = true;
+ return dumped_declaration_info;
+}
size_t
Variable::MemorySize() const