diff options
author | Ed Maste <emaste@FreeBSD.org> | 2015-07-03 16:57:06 +0000 |
---|---|---|
committer | Ed Maste <emaste@FreeBSD.org> | 2015-07-03 16:57:06 +0000 |
commit | 5e95aa85bb660d45e9905ef1d7180b2678280660 (patch) | |
tree | 3c2e41c3be19b7fc7666ed45a5f91ec3b6e35f2a /source/Core/FormatEntity.cpp | |
parent | 12bd4897ff0678fa663e09d78ebc22dd255ceb86 (diff) |
Import LLDB as of upstream SVN 241361 (git 612c075f)vendor/lldb/lldb-r241361
Notes
Notes:
svn path=/vendor/lldb/dist/; revision=285101
svn path=/vendor/lldb/lldb-r241361/; revision=285102; tag=vendor/lldb/lldb-r241361
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 48b2c2ddbf72..2ebe95747bc0 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()) { |