diff options
| author | Greg Clayton <gclayton@apple.com> | 2011-07-10 19:21:23 +0000 | 
|---|---|---|
| committer | Greg Clayton <gclayton@apple.com> | 2011-07-10 19:21:23 +0000 | 
| commit | 45ba8543990752e43b18825109ee4b5d2524f6a1 (patch) | |
| tree | 60a20c98262e4aa8bf3d2e577a2922541c8ee27b | |
| parent | e3531fcf884c1a43f6a5826fe5e5f94db790e998 (diff) | |
| download | bcm5719-llvm-45ba8543990752e43b18825109ee4b5d2524f6a1.tar.gz bcm5719-llvm-45ba8543990752e43b18825109ee4b5d2524f6a1.zip  | |
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.
llvm-svn: 134878
| -rw-r--r-- | lldb/include/lldb/Symbol/Declaration.h | 2 | ||||
| -rw-r--r-- | lldb/include/lldb/Symbol/SymbolContext.h | 2 | ||||
| -rw-r--r-- | lldb/include/lldb/Symbol/Variable.h | 5 | ||||
| -rw-r--r-- | lldb/source/Commands/CommandObjectFrame.cpp | 6 | ||||
| -rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 14 | ||||
| -rw-r--r-- | lldb/source/Core/ValueObject.cpp | 20 | ||||
| -rw-r--r-- | lldb/source/Symbol/Declaration.cpp | 7 | ||||
| -rw-r--r-- | lldb/source/Symbol/SymbolContext.cpp | 27 | ||||
| -rw-r--r-- | lldb/source/Symbol/Variable.cpp | 26 | 
9 files changed, 89 insertions, 20 deletions
diff --git a/lldb/include/lldb/Symbol/Declaration.h b/lldb/include/lldb/Symbol/Declaration.h index 1f6d697aa64..f014571595f 100644 --- a/lldb/include/lldb/Symbol/Declaration.h +++ b/lldb/include/lldb/Symbol/Declaration.h @@ -141,7 +141,7 @@ public:      void      Dump (Stream *s, bool show_fullpaths) const; -    void +    bool      DumpStopContext (Stream *s, bool show_fullpaths) const;      //------------------------------------------------------------------      /// Get accessor for the declaration column number. diff --git a/lldb/include/lldb/Symbol/SymbolContext.h b/lldb/include/lldb/Symbol/SymbolContext.h index feceb64b587..c653486c6b6 100644 --- a/lldb/include/lldb/Symbol/SymbolContext.h +++ b/lldb/include/lldb/Symbol/SymbolContext.h @@ -160,7 +160,7 @@ public:      /// @param[in] so_addr      ///     The resolved section offset address.      //------------------------------------------------------------------ -    void +    bool      DumpStopContext (Stream *s,                       ExecutionContextScope *exe_scope,                       const Address &so_addr, diff --git a/lldb/include/lldb/Symbol/Variable.h b/lldb/include/lldb/Symbol/Variable.h index d2419ce87da..dec793277cd 100644 --- a/lldb/include/lldb/Symbol/Variable.h +++ b/lldb/include/lldb/Symbol/Variable.h @@ -44,6 +44,11 @@ public:      void      Dump(Stream *s, bool show_context) const; +    bool +    DumpDeclaration (Stream *s,  +                     bool show_fullpaths,  +                     bool show_module); +          const Declaration&      GetDeclaration() const      { diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp index d184e0038d4..f82c06bcc15 100644 --- a/lldb/source/Commands/CommandObjectFrame.cpp +++ b/lldb/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/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index 510fe488a46..b957314cbd4 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/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/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 09cbd8c60f9..5c548dfbb97 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/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/lldb/source/Symbol/Declaration.cpp b/lldb/source/Symbol/Declaration.cpp index 2b20a24e514..3943f02c547 100644 --- a/lldb/source/Symbol/Declaration.cpp +++ b/lldb/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/lldb/source/Symbol/SymbolContext.cpp b/lldb/source/Symbol/SymbolContext.cpp index 2a56c3444c2..1f24f1339bd 100644 --- a/lldb/source/Symbol/SymbolContext.cpp +++ b/lldb/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/lldb/source/Symbol/Variable.cpp b/lldb/source/Symbol/Variable.cpp index a8ebe85921d..64018692b7c 100644 --- a/lldb/source/Symbol/Variable.cpp +++ b/lldb/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  | 

