diff options
Diffstat (limited to 'source/Core/FormatEntity.cpp')
| -rw-r--r-- | source/Core/FormatEntity.cpp | 66 | 
1 files changed, 53 insertions, 13 deletions
| diff --git a/source/Core/FormatEntity.cpp b/source/Core/FormatEntity.cpp index 48b2c2ddbf728..2ebe95747bc02 100644 --- a/source/Core/FormatEntity.cpp +++ b/source/Core/FormatEntity.cpp @@ -13,6 +13,7 @@  #include "lldb/Core/Address.h"  #include "lldb/Core/Debugger.h" +#include "lldb/Core/Language.h"  #include "lldb/Core/Module.h"  #include "lldb/Core/Stream.h"  #include "lldb/Core/StreamString.h" @@ -20,6 +21,7 @@  #include "lldb/Core/ValueObjectVariable.h"  #include "lldb/DataFormatters/DataVisualization.h"  #include "lldb/DataFormatters/FormatManager.h" +#include "lldb/Expression/ClangExpressionVariable.h"  #include "lldb/Host/FileSpec.h"  #include "lldb/Interpreter/CommandInterpreter.h"  #include "lldb/Symbol/Block.h" @@ -94,7 +96,9 @@ static FormatEntity::Entry::Definition g_function_child_entries[] =      ENTRY ("addr-offset"         , FunctionAddrOffset     , UInt64),      ENTRY ("concrete-only-addr-offset-no-padding", FunctionAddrOffsetConcrete, UInt64),      ENTRY ("line-offset"         , FunctionLineOffset     , UInt64), -    ENTRY ("pc-offset"           , FunctionPCOffset       , UInt64) +    ENTRY ("pc-offset"           , FunctionPCOffset       , UInt64), +    ENTRY ("initial-function"    , FunctionInitial        , None), +    ENTRY ("changed"             , FunctionChanged        , None)  };  static FormatEntity::Entry::Definition g_line_child_entries[] = @@ -207,6 +211,7 @@ static FormatEntity::Entry::Definition g_top_level_entries[] =      ENTRY_CHILDREN          ("ansi"                , Invalid                , None      , g_ansi_entries),      ENTRY                   ("current-pc-arrow"    , CurrentPCArrow         , CString   ),      ENTRY_CHILDREN          ("file"                , File                   , CString   , g_file_child_entries), +    ENTRY                   ("language"            , Lang                   , CString),      ENTRY_CHILDREN          ("frame"               , Invalid                , None      , g_frame_child_entries),      ENTRY_CHILDREN          ("function"            , Invalid                , None      , g_function_child_entries),      ENTRY_CHILDREN          ("line"                , Invalid                , None      , g_line_child_entries), @@ -318,6 +323,7 @@ FormatEntity::Entry::TypeToCString (Type t)      ENUM_TO_CSTR(ScriptTarget);      ENUM_TO_CSTR(ModuleFile);      ENUM_TO_CSTR(File); +    ENUM_TO_CSTR(Lang);      ENUM_TO_CSTR(FrameIndex);      ENUM_TO_CSTR(FrameRegisterPC);      ENUM_TO_CSTR(FrameRegisterSP); @@ -335,6 +341,8 @@ FormatEntity::Entry::TypeToCString (Type t)      ENUM_TO_CSTR(FunctionAddrOffsetConcrete);      ENUM_TO_CSTR(FunctionLineOffset);      ENUM_TO_CSTR(FunctionPCOffset); +    ENUM_TO_CSTR(FunctionInitial); +    ENUM_TO_CSTR(FunctionChanged);      ENUM_TO_CSTR(LineEntryFile);      ENUM_TO_CSTR(LineEntryLineNumber);      ENUM_TO_CSTR(LineEntryStartAddress); @@ -444,7 +452,8 @@ DumpAddressOffsetFromFunction (Stream &s,                                 const ExecutionContext *exe_ctx,                                 const Address &format_addr,                                 bool concrete_only, -                               bool no_padding) +                               bool no_padding, +                               bool print_zero_offsets)  {      if (format_addr.IsValid())      { @@ -468,7 +477,7 @@ DumpAddressOffsetFromFunction (Stream &s,                  }              }              else if (sc->symbol && sc->symbol->ValueIsAddress()) -                func_addr = sc->symbol->GetAddress(); +                func_addr = sc->symbol->GetAddressRef();          }          if (func_addr.IsValid()) @@ -479,10 +488,15 @@ DumpAddressOffsetFromFunction (Stream &s,              {                  addr_t func_file_addr = func_addr.GetFileAddress();                  addr_t addr_file_addr = format_addr.GetFileAddress(); -                if (addr_file_addr > func_file_addr) +                if (addr_file_addr > func_file_addr +                    || (addr_file_addr == func_file_addr && print_zero_offsets)) +                {                      s.Printf("%s+%s%" PRIu64, addr_offset_padding, addr_offset_padding, addr_file_addr - func_file_addr); +                }                  else if (addr_file_addr < func_file_addr) +                {                      s.Printf("%s-%s%" PRIu64, addr_offset_padding, addr_offset_padding, func_file_addr - addr_file_addr); +                }                  return true;              }              else @@ -492,10 +506,15 @@ DumpAddressOffsetFromFunction (Stream &s,                  {                      addr_t func_load_addr = func_addr.GetLoadAddress (target);                      addr_t addr_load_addr = format_addr.GetLoadAddress (target); -                    if (addr_load_addr > func_load_addr) +                    if (addr_load_addr > func_load_addr +                        || (addr_load_addr == func_load_addr && print_zero_offsets)) +                    {                          s.Printf("%s+%s%" PRIu64, addr_offset_padding, addr_offset_padding, addr_load_addr - func_load_addr); +                    }                      else if (addr_load_addr < func_load_addr) +                    {                          s.Printf("%s-%s%" PRIu64, addr_offset_padding, addr_offset_padding, func_load_addr - addr_load_addr); +                    }                      return true;                  }              } @@ -750,7 +769,7 @@ DumpValue (Stream &s,      ValueObject::ExpressionPathAftermath what_next = (do_deref_pointer ?                                                        ValueObject::eExpressionPathAftermathDereference : ValueObject::eExpressionPathAftermathNothing);      ValueObject::GetValueForExpressionPathOptions options; -    options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().DoAllowSyntheticChildren(); +    options.DontCheckDotVsArrowSyntax().DoAllowBitfieldSyntax().DoAllowFragileIVar().SetSyntheticChildrenTraversal(ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal::Both);      ValueObject* target = NULL;      const char* var_name_final_if_array_range = NULL;      size_t close_bracket_index = llvm::StringRef::npos; @@ -935,11 +954,11 @@ DumpValue (Stream &s,              return false;          if (log)              log->Printf("[Debugger::FormatPrompt] handle as array"); +        StreamString special_directions_stream;          llvm::StringRef special_directions;          if (close_bracket_index != llvm::StringRef::npos && subpath.size() > close_bracket_index)          {              ConstString additional_data (subpath.drop_front(close_bracket_index+1)); -            StreamString special_directions_stream;              special_directions_stream.Printf("${%svar%s",                                               do_deref_pointer ? "*" : "",                                               additional_data.GetCString()); @@ -1283,13 +1302,11 @@ FormatEntity::Format (const Entry &entry,                          // Watch for the special "tid" format...                          if (entry.printf_format == "tid")                          { -                            bool handled = false;                              Target &target = thread->GetProcess()->GetTarget();                              ArchSpec arch (target.GetArchitecture ());                              llvm::Triple::OSType ostype = arch.IsValid() ? arch.GetTriple().getOS() : llvm::Triple::UnknownOS;                              if ((ostype == llvm::Triple::FreeBSD) || (ostype == llvm::Triple::Linux))                              { -                                handled = true;                                  format = "%" PRIu64;                              }                          } @@ -1501,6 +1518,23 @@ FormatEntity::Format (const Entry &entry,              }              return false; +        case Entry::Type::Lang: +            if (sc) +            { +                CompileUnit *cu = sc->comp_unit; +                if (cu) +                { +                    Language lang(cu->GetLanguage()); +                    const char *lang_name = lang.AsCString(); +                    if (lang_name) +                    { +                        s.PutCString(lang_name); +                        return true; +                    } +                } +            } +            return false; +          case Entry::Type::FrameIndex:              if (exe_ctx)              { @@ -1803,7 +1837,7 @@ FormatEntity::Format (const Entry &entry,          case Entry::Type::FunctionAddrOffset:              if (addr)              { -                if (DumpAddressOffsetFromFunction (s, sc, exe_ctx, *addr, false, false)) +                if (DumpAddressOffsetFromFunction (s, sc, exe_ctx, *addr, false, false, false))                      return true;              }              return false; @@ -1811,13 +1845,13 @@ FormatEntity::Format (const Entry &entry,          case Entry::Type::FunctionAddrOffsetConcrete:              if (addr)              { -                if (DumpAddressOffsetFromFunction (s, sc, exe_ctx, *addr, true, true)) +                if (DumpAddressOffsetFromFunction (s, sc, exe_ctx, *addr, true, true, true))                      return true;              }              return false;          case Entry::Type::FunctionLineOffset: -            if (DumpAddressOffsetFromFunction (s, sc, exe_ctx, sc->line_entry.range.GetBaseAddress(), false, false)) +            if (DumpAddressOffsetFromFunction (s, sc, exe_ctx, sc->line_entry.range.GetBaseAddress(), false, false, false))                  return true;              return false; @@ -1827,12 +1861,18 @@ FormatEntity::Format (const Entry &entry,                  StackFrame *frame = exe_ctx->GetFramePtr();                  if (frame)                  { -                    if (DumpAddressOffsetFromFunction (s, sc, exe_ctx, frame->GetFrameCodeAddress(), false, false)) +                    if (DumpAddressOffsetFromFunction (s, sc, exe_ctx, frame->GetFrameCodeAddress(), false, false, false))                          return true;                  }              }              return false; +        case Entry::Type::FunctionChanged: +            return function_changed == true; + +        case Entry::Type::FunctionInitial: +            return initial_function == true; +          case Entry::Type::LineEntryFile:              if (sc && sc->line_entry.IsValid())              { | 
