diff options
author | emaste <emaste@FreeBSD.org> | 2014-11-26 16:48:12 +0000 |
---|---|---|
committer | emaste <emaste@FreeBSD.org> | 2014-11-26 16:48:12 +0000 |
commit | 0147dda7de9580d13778ecb4c9e92b83b7a63911 (patch) | |
tree | b16dc95f693ed59342b6141cd3fd9f59a6cd7e7e /contrib/llvm/tools/lldb/source/DataFormatters | |
parent | bfd4c39c61ae9b29542625bb12b6f7f4b1f8c727 (diff) | |
parent | 01ee1789d6aa7294e5966a97f8d29387f6f81699 (diff) | |
download | FreeBSD-src-0147dda7de9580d13778ecb4c9e92b83b7a63911.zip FreeBSD-src-0147dda7de9580d13778ecb4c9e92b83b7a63911.tar.gz |
Update LLDB snapshot to upstream r216948 (git 50f7fe44)
This is approximately "LLDB 3.5" although with a little bit of skew,
and will go along with the Clang 3.5 import.
Sponsored by: DARPA, AFRL
Diffstat (limited to 'contrib/llvm/tools/lldb/source/DataFormatters')
16 files changed, 682 insertions, 147 deletions
diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/CF.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/CF.cpp index a4b7a12..e131b68 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/CF.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/CF.cpp @@ -85,7 +85,7 @@ lldb_private::formatters::CFBagSummaryProvider (ValueObject& valobj, Stream& str ValueObjectSP count_sp; StreamString expr; expr.Printf("(int)CFBagGetCount((void*)0x%" PRIx64 ")",valobj.GetPointerValue()); - if (process_sp->GetTarget().EvaluateExpression(expr.GetData(), frame_sp.get(), count_sp) != eExecutionCompleted) + if (process_sp->GetTarget().EvaluateExpression(expr.GetData(), frame_sp.get(), count_sp) != eExpressionCompleted) return false; if (!count_sp) return false; @@ -160,7 +160,7 @@ lldb_private::formatters::CFBitVectorSummaryProvider (ValueObject& valobj, Strea if (error.Fail() || num_bytes == 0) return false; uint8_t *bytes = buffer_sp->GetBytes(); - for (int byte_idx = 0; byte_idx < num_bytes-1; byte_idx++) + for (uint64_t byte_idx = 0; byte_idx < num_bytes-1; byte_idx++) { uint8_t byte = bytes[byte_idx]; bool bit0 = (byte & 1) == 1; @@ -279,7 +279,7 @@ lldb_private::formatters::CFBinaryHeapSummaryProvider (ValueObject& valobj, Stre ValueObjectSP count_sp; StreamString expr; expr.Printf("(int)CFBinaryHeapGetCount((void*)0x%" PRIx64 ")",valobj.GetPointerValue()); - if (process_sp->GetTarget().EvaluateExpression(expr.GetData(), frame_sp.get(), count_sp) != eExecutionCompleted) + if (process_sp->GetTarget().EvaluateExpression(expr.GetData(), frame_sp.get(), count_sp) != eExpressionCompleted) return false; if (!count_sp) return false; diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/CXXFormatterFunctions.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/CXXFormatterFunctions.cpp index 136c8c5..ae5b35f 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/CXXFormatterFunctions.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/CXXFormatterFunctions.cpp @@ -20,8 +20,8 @@ #include "lldb/Core/ValueObjectConstResult.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" -#include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Target.h" +#include "lldb/Target/Thread.h" #include <algorithm> @@ -29,6 +29,23 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; +StackFrame* +lldb_private::formatters::GetViableFrame (ExecutionContext exe_ctx) +{ + StackFrame* frame = exe_ctx.GetFramePtr(); + if (frame) + return frame; + + Process* process = exe_ctx.GetProcessPtr(); + if (!process) + return nullptr; + + ThreadSP thread_sp(process->GetThreadList().GetSelectedThread()); + if (thread_sp) + return thread_sp->GetSelectedFrame().get(); + return nullptr; +} + bool lldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj, const char* target_type, @@ -44,7 +61,7 @@ lldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj, ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); lldb::ValueObjectSP result_sp; Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = exe_ctx.GetFramePtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); if (!target || !stack_frame) return false; @@ -78,7 +95,7 @@ lldb_private::formatters::ExtractSummaryFromObjCExpression (ValueObject &valobj, ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); lldb::ValueObjectSP result_sp; Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = exe_ctx.GetFramePtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); if (!target || !stack_frame) return false; @@ -116,7 +133,7 @@ lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); lldb::ValueObjectSP result_sp; Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = exe_ctx.GetFramePtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); if (!target || !stack_frame) return valobj_sp; @@ -153,7 +170,7 @@ lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); lldb::ValueObjectSP result_sp; Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = exe_ctx.GetFramePtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); if (!target || !stack_frame) return valobj_sp; @@ -576,7 +593,11 @@ bool lldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream) { DataExtractor data; - valobj.GetData(data); + Error error; + valobj.GetData(data, error); + + if (error.Fail()) + return false; std::string value; valobj.GetValueAsCString(lldb::eFormatUnicode16, value); @@ -590,7 +611,11 @@ bool lldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream) { DataExtractor data; - valobj.GetData(data); + Error error; + valobj.GetData(data, error); + + if (error.Fail()) + return false; std::string value; valobj.GetValueAsCString(lldb::eFormatUnicode32, value); @@ -604,7 +629,11 @@ bool lldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream) { DataExtractor data; - valobj.GetData(data); + Error error; + valobj.GetData(data, error); + + if (error.Fail()) + return false; clang::ASTContext* ast = valobj.GetClangType().GetASTContext(); @@ -954,6 +983,61 @@ ReadAsciiBufferAndDumpToStream (lldb::addr_t location, } bool +lldb_private::formatters::NSTaggedString_SummaryProvider (ObjCLanguageRuntime::ClassDescriptorSP descriptor, Stream& stream) +{ + if (!descriptor) + return false; + uint64_t len_bits = 0, data_bits = 0; + if (!descriptor->GetTaggedPointerInfo(&len_bits,&data_bits,nullptr)) + return false; + + static const int g_MaxNonBitmaskedLen = 7; //TAGGED_STRING_UNPACKED_MAXLEN + static const int g_SixbitMaxLen = 9; + static const int g_fiveBitMaxLen = 11; + + static const char *sixBitToCharLookup = "eilotrm.apdnsIc ufkMShjTRxgC4013" "bDNvwyUL2O856P-B79AFKEWV_zGJ/HYX"; + + if (len_bits > g_fiveBitMaxLen) + return false; + + // this is a fairly ugly trick - pretend that the numeric value is actually a char* + // this works under a few assumptions: + // little endian architecture + // sizeof(uint64_t) > g_MaxNonBitmaskedLen + if (len_bits <= g_MaxNonBitmaskedLen) + { + stream.Printf("@\"%s\"",(const char*)&data_bits); + return true; + } + + // if the data is bitmasked, we need to actually process the bytes + uint8_t bitmask = 0; + uint8_t shift_offset = 0; + + if (len_bits <= g_SixbitMaxLen) + { + bitmask = 0x03f; + shift_offset = 6; + } + else + { + bitmask = 0x01f; + shift_offset = 5; + } + + std::vector<uint8_t> bytes; + bytes.resize(len_bits); + for (; len_bits > 0; data_bits >>= shift_offset, --len_bits) + { + uint8_t packed = data_bits & bitmask; + bytes.insert(bytes.begin(), sixBitToCharLookup[packed]); + } + + stream.Printf("@\"%s\"",&bytes[0]); + return true; +} + +bool lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream) { ProcessSP process_sp = valobj.GetProcessSP(); @@ -982,6 +1066,12 @@ lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& if (!class_name || !*class_name) return false; + bool is_tagged_ptr = (0 == strcmp(class_name,"NSTaggedPointerString")) && descriptor->GetTaggedPointerInfo(); + // for a tagged pointer, the descriptor has everything we need + if (is_tagged_ptr) + return NSTaggedString_SummaryProvider(descriptor, stream); + + // if not a tagged pointer that we know about, try the normal route uint64_t info_bits_location = valobj_addr + ptr_size; if (process_sp->GetByteOrder() != lldb::eByteOrderLittle) info_bits_location += 3; @@ -1144,7 +1234,10 @@ lldb_private::formatters::NSAttributedStringSummaryProvider (ValueObject& valobj if (!child_ptr_sp) return false; DataExtractor data; - child_ptr_sp->GetData(data); + Error error; + child_ptr_sp->GetData(data, error); + if (error.Fail()) + return false; ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData("string_data", data, exe_ctx, type)); child_sp->GetValueAsUnsigned(0); if (child_sp) @@ -1218,7 +1311,10 @@ lldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& s else { DataExtractor data; - valobj.GetData(data); + Error error; + valobj.GetData(data, error); + if (error.Fail()) + return false; valobj_sp = ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar); } diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/Cocoa.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/Cocoa.cpp index 555954d..8e92de4 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/Cocoa.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/Cocoa.cpp @@ -342,8 +342,7 @@ lldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& stream.Printf("(long)%" PRId64,value); break; default: - stream.Printf("unexpected value:(info=%" PRIu64 ", value=%" PRIu64,i_bits,value); - break; + return false; } return true; } @@ -402,8 +401,7 @@ lldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& break; } default: - stream.Printf("unexpected value: dt=%d",data_type); - break; + return false; } return true; } diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp index 751e612..28d108f 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp @@ -21,6 +21,7 @@ #include "lldb/Interpreter/ScriptInterpreterPython.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Platform.h" +#include "llvm/ADT/STLExtras.h" using namespace lldb; using namespace lldb_private; @@ -76,8 +77,7 @@ g_format_infos[] = { eFormatVoid , 'v' , "void" } }; -static uint32_t -g_num_format_infos = sizeof(g_format_infos)/sizeof(FormatInfo); +static uint32_t g_num_format_infos = llvm::array_lengthof(g_format_infos); static bool GetFormatFromFormatChar (char format_char, Format &format) @@ -186,7 +186,11 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, } entries.push_back({type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef}); - if (clang_type.IsReferenceType()) + ConstString display_type_name(clang_type.GetDisplayTypeName()); + if (display_type_name != type_name) + entries.push_back({display_type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef}); + + for (bool is_rvalue_ref = true, j = true; j && clang_type.IsReferenceType(nullptr, &is_rvalue_ref); j = false) { ClangASTType non_ref_type = clang_type.GetNonReferenceType(); GetPossibleMatches(valobj, @@ -197,8 +201,22 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, did_strip_ptr, true, did_strip_typedef); + if (non_ref_type.IsTypedefType()) + { + ClangASTType deffed_referenced_type = non_ref_type.GetTypedefedType(); + deffed_referenced_type = is_rvalue_ref ? deffed_referenced_type.GetRValueReferenceType() : deffed_referenced_type.GetLValueReferenceType(); + GetPossibleMatches(valobj, + deffed_referenced_type, + reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, + use_dynamic, + entries, + did_strip_ptr, + did_strip_ref, + true); // this is not exactly the usual meaning of stripping typedefs + } } - else if (clang_type.IsPointerType()) + + if (clang_type.IsPointerType()) { ClangASTType non_ptr_type = clang_type.GetPointeeType(); GetPossibleMatches(valobj, @@ -209,6 +227,18 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, true, did_strip_ref, did_strip_typedef); + if (non_ptr_type.IsTypedefType()) + { + ClangASTType deffed_pointed_type = non_ptr_type.GetTypedefedType().GetPointerType(); + GetPossibleMatches(valobj, + deffed_pointed_type, + reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, + use_dynamic, + entries, + did_strip_ptr, + did_strip_ref, + true); // this is not exactly the usual meaning of stripping typedefs + } } bool canBeObjCDynamic = clang_type.IsPossibleDynamicType (NULL, false, // no C @@ -507,7 +537,7 @@ FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj) if (child_sp->GetSummaryFormat()) { // and it wants children, then bail out - if (child_sp->GetSummaryFormat()->DoesPrintChildren()) + if (child_sp->GetSummaryFormat()->DoesPrintChildren(child_sp.get())) return false; } @@ -553,11 +583,17 @@ GetTypeForCache (ValueObject& valobj, return ConstString(); } -static lldb::TypeFormatImplSP -GetHardcodedFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +lldb::TypeFormatImplSP +FormatManager::GetHardcodedFormat (ValueObject& valobj, + lldb::DynamicValueType use_dynamic) { - return lldb::TypeFormatImplSP(); + for (const auto& candidate: m_hardcoded_formats) + { + auto result = candidate(valobj,use_dynamic,*this); + if (result) + return result; + } + return nullptr; } lldb::TypeFormatImplSP @@ -591,10 +627,12 @@ FormatManager::GetFormat (ValueObject& valobj, log->Printf("[FormatManager::GetFormat] Search failed. Giving hardcoded a chance."); retval = GetHardcodedFormat(valobj, use_dynamic); } - if (valobj_type) + else if (valobj_type) { if (log) - log->Printf("[FormatManager::GetFormat] Caching %p for type %s",retval.get(),valobj_type.AsCString("<invalid>")); + log->Printf("[FormatManager::GetFormat] Caching %p for type %s", + static_cast<void*>(retval.get()), + valobj_type.AsCString("<invalid>")); m_format_cache.SetFormat(valobj_type,retval); } if (log && log->GetDebug()) @@ -602,11 +640,17 @@ FormatManager::GetFormat (ValueObject& valobj, return retval; } -static lldb::TypeSummaryImplSP -GetHardcodedSummaryFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +lldb::TypeSummaryImplSP +FormatManager::GetHardcodedSummaryFormat (ValueObject& valobj, + lldb::DynamicValueType use_dynamic) { - return lldb::TypeSummaryImplSP(); + for (const auto& candidate: m_hardcoded_summaries) + { + auto result = candidate(valobj,use_dynamic,*this); + if (result) + return result; + } + return nullptr; } lldb::TypeSummaryImplSP @@ -640,10 +684,12 @@ FormatManager::GetSummaryFormat (ValueObject& valobj, log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving hardcoded a chance."); retval = GetHardcodedSummaryFormat(valobj, use_dynamic); } - if (valobj_type) + else if (valobj_type) { if (log) - log->Printf("[FormatManager::GetSummaryFormat] Caching %p for type %s",retval.get(),valobj_type.AsCString("<invalid>")); + log->Printf("[FormatManager::GetSummaryFormat] Caching %p for type %s", + static_cast<void*>(retval.get()), + valobj_type.AsCString("<invalid>")); m_format_cache.SetSummary(valobj_type,retval); } if (log && log->GetDebug()) @@ -652,11 +698,17 @@ FormatManager::GetSummaryFormat (ValueObject& valobj, } #ifndef LLDB_DISABLE_PYTHON -static lldb::SyntheticChildrenSP -GetHardcodedSyntheticChildren (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +lldb::SyntheticChildrenSP +FormatManager::GetHardcodedSyntheticChildren (ValueObject& valobj, + lldb::DynamicValueType use_dynamic) { - return lldb::SyntheticChildrenSP(); + for (const auto& candidate: m_hardcoded_synthetics) + { + auto result = candidate(valobj,use_dynamic,*this); + if (result) + return result; + } + return nullptr; } lldb::SyntheticChildrenSP @@ -690,10 +742,12 @@ FormatManager::GetSyntheticChildren (ValueObject& valobj, log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving hardcoded a chance."); retval = GetHardcodedSyntheticChildren(valobj, use_dynamic); } - if (valobj_type) + else if (valobj_type) { if (log) - log->Printf("[FormatManager::GetSyntheticChildren] Caching %p for type %s",retval.get(),valobj_type.AsCString("<invalid>")); + log->Printf("[FormatManager::GetSyntheticChildren] Caching %p for type %s", + static_cast<void*>(retval.get()), + valobj_type.AsCString("<invalid>")); m_format_cache.SetSynthetic(valobj_type,retval); } if (log && log->GetDebug()) @@ -716,12 +770,17 @@ FormatManager::FormatManager() : m_coregraphics_category_name(ConstString("CoreGraphics")), m_coreservices_category_name(ConstString("CoreServices")), m_vectortypes_category_name(ConstString("VectorTypes")), - m_appkit_category_name(ConstString("AppKit")) + m_appkit_category_name(ConstString("AppKit")), + m_hardcoded_formats(), + m_hardcoded_summaries(), + m_hardcoded_synthetics() + { LoadSystemFormatters(); LoadLibStdcppFormatters(); LoadLibcxxFormatters(); LoadObjCFormatters(); + LoadHardcodedFormatters(); EnableCategory(m_objc_category_name,TypeCategoryMap::Last); EnableCategory(m_corefoundation_category_name,TypeCategoryMap::Last); @@ -768,28 +827,6 @@ AddStringSummary(TypeCategoryImpl::SharedPointer category_sp, #ifndef LLDB_DISABLE_PYTHON static void -AddScriptSummary(TypeCategoryImpl::SharedPointer category_sp, - const char* funct_name, - ConstString type_name, - TypeSummaryImpl::Flags flags, - bool regex = false) -{ - - std::string code(" "); - code.append(funct_name).append("(valobj,internal_dict)"); - - lldb::TypeSummaryImplSP summary_sp(new ScriptSummaryFormat(flags, - funct_name, - code.c_str())); - if (regex) - category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); - else - category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); -} -#endif - -#ifndef LLDB_DISABLE_PYTHON -static void AddCXXSummary (TypeCategoryImpl::SharedPointer category_sp, CXXFunctionSummaryFormat::Callback funct, const char* description, @@ -956,6 +993,7 @@ FormatManager::LoadLibcxxFormatters() AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator, "libc++ std::list synthetic children", ConstString("^std::__1::list<.+>(( )?&)?$"), stl_synth_flags, true); AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::map synthetic children", ConstString("^std::__1::map<.+> >(( )?&)?$"), stl_synth_flags, true); AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<std::__1::allocator<bool> >"), stl_synth_flags); + AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_synth_flags); AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::set synthetic children", ConstString("^std::__1::set<.+> >(( )?&)?$"), stl_synth_flags, true); AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::multiset synthetic children", ConstString("^std::__1::multiset<.+> >(( )?&)?$"), stl_synth_flags, true); AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::multimap synthetic children", ConstString("^std::__1::multimap<.+> >(( )?&)?$"), stl_synth_flags, true); @@ -969,12 +1007,14 @@ FormatManager::LoadLibcxxFormatters() AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, "weak_ptr synthetic children", ConstString("^(std::__1::)weak_ptr<.+>(( )?&)?$"), stl_synth_flags, true); stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(false); + AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_synth_flags); AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector summary provider", ConstString("^std::__1::vector<.+>(( )?&)?$"), stl_summary_flags, true); AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::list summary provider", ConstString("^std::__1::list<.+>(( )?&)?$"), stl_summary_flags, true); AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::map summary provider", ConstString("^std::__1::map<.+>(( )?&)?$"), stl_summary_flags, true); AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::deque summary provider", ConstString("^std::__1::deque<.+>(( )?&)?$"), stl_summary_flags, true); AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<std::__1::allocator<bool> >"), stl_summary_flags); + AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_summary_flags); AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::set summary provider", ConstString("^std::__1::set<.+>(( )?&)?$"), stl_summary_flags, true); AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::multiset summary provider", ConstString("^std::__1::multiset<.+>(( )?&)?$"), stl_summary_flags, true); AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::multimap summary provider", ConstString("^std::__1::multimap<.+>(( )?&)?$"), stl_summary_flags, true); @@ -987,6 +1027,7 @@ FormatManager::LoadLibcxxFormatters() AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator, "std::vector iterator synthetic children", ConstString("^std::__1::__wrap_iter<.+>$"), stl_synth_flags, true); + AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_summary_flags); AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator, "std::map iterator synthetic children", ConstString("^std::__1::__map_iterator<.+>$"), stl_synth_flags, true); AddFilter(libcxx_category_sp, {"__a_"}, "libc++ std::atomic filter", ConstString("^std::__1::atomic<.*>$"), stl_synth_flags, true); @@ -1253,6 +1294,7 @@ FormatManager::LoadObjCFormatters() AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSCFDictionary"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags()); AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags()); @@ -1294,6 +1336,7 @@ FormatManager::LoadObjCFormatters() AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags); AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags); AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags); + AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSMutableData"), appkit_flags); AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags); AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags); AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags); @@ -1419,3 +1462,17 @@ FormatManager::LoadObjCFormatters() ConstString("vBool32"), vector_flags); } + +void +FormatManager::LoadHardcodedFormatters() +{ + { + // insert code to load formats here + } + { + // insert code to load summaries here + } + { + // insert code to load synthetics here + } +} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxx.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxx.cpp index 6380d97..1742026 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxx.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxx.cpp @@ -139,13 +139,11 @@ lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetChildAtIndex (si return ValueObjectSP(); } bool bit_set = ((byte & mask) != 0); - ValueObjectSP retval_sp; DataBufferSP buffer_sp(new DataBufferHeap(m_bool_type.GetByteSize(),0)); if (bit_set && buffer_sp && buffer_sp->GetBytes()) *(buffer_sp->GetBytes()) = 1; // regardless of endianness, anything non-zero is true - StreamString name; name.Printf("[%zu]",idx); - DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize()); - retval_sp = ValueObject::CreateValueObjectFromData(name.GetData(), data, m_exe_ctx_ref, m_bool_type); + StreamString name; name.Printf("[%" PRIu64 "]", (uint64_t)idx); + ValueObjectSP retval_sp(ValueObject::CreateValueObjectFromData(name.GetData(), DataExtractor(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize()), m_exe_ctx_ref, m_bool_type)); if (retval_sp) m_children[idx] = retval_sp; return retval_sp; @@ -168,8 +166,6 @@ lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update() ValueObjectSP valobj_sp = m_backend.GetSP(); if (!valobj_sp) return false; - if (!valobj_sp) - return false; m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); ValueObjectSP size_sp(valobj_sp->GetChildMemberWithName(ConstString("__size_"), true)); if (!size_sp) @@ -499,7 +495,7 @@ lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::GetChildAtIndex (siz uint64_t offset = idx * m_element_size; offset = offset + m_start->GetValueAsUnsigned(0); StreamString name; - name.Printf("[%zu]",idx); + name.Printf("[%" PRIu64 "]", (uint64_t)idx); ValueObjectSP child_sp = ValueObject::CreateValueObjectFromAddress(name.GetData(), offset, m_backend.GetExecutionContextRef(), m_element_type); m_children[idx] = child_sp; return child_sp; diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxList.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxList.cpp index de2ca1b..7d6db1a 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxList.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxList.cpp @@ -33,20 +33,20 @@ public: ListEntry (const ListEntry& rhs) : m_entry_sp(rhs.m_entry_sp) {} ListEntry (ValueObject* entry) : m_entry_sp(entry ? entry->GetSP() : ValueObjectSP()) {} - ValueObjectSP + ListEntry next () { if (!m_entry_sp) - return m_entry_sp; - return m_entry_sp->GetChildMemberWithName(ConstString("__next_"), true); + return ListEntry(); + return ListEntry(m_entry_sp->GetChildMemberWithName(ConstString("__next_"), true)); } - ValueObjectSP + ListEntry prev () { if (!m_entry_sp) - return m_entry_sp; - return m_entry_sp->GetChildMemberWithName(ConstString("__prev_"), true); + return ListEntry(); + return ListEntry(m_entry_sp->GetChildMemberWithName(ConstString("__prev_"), true)); } uint64_t @@ -63,6 +63,11 @@ public: return (value() == 0); } + explicit operator bool () + { + return GetEntry().get() != nullptr && null() == false; + } + ValueObjectSP GetEntry () { @@ -130,13 +135,13 @@ protected: void next () { - m_entry.SetEntry(m_entry.next()); + m_entry = m_entry.next(); } void prev () { - m_entry.SetEntry(m_entry.prev()); + m_entry = m_entry.prev(); } private: ListEntry m_entry; @@ -161,17 +166,24 @@ lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::HasLoop() { if (g_use_loop_detect == false) return false; + // don't bother checking for a loop if we won't actually need to jump nodes + if (m_count < 2) + return false; + auto steps_left = m_count; ListEntry slow(m_head); - ListEntry fast1(m_head); - ListEntry fast2(m_head); - while (slow.next() && slow.next()->GetValueAsUnsigned(0) != m_node_address) + ListEntry fast(m_head); + while (steps_left-- > 0) { - auto slow_value = slow.value(); - fast1.SetEntry(fast2.next()); - fast2.SetEntry(fast1.next()); - if (fast1.value() == slow_value || fast2.value() == slow_value) + slow = slow.next(); + fast = fast.next(); + if (fast.next()) + fast = fast.next().next(); + else + fast = nullptr; + if (!slow || !fast) + return false; + if (slow == fast) return true; - slow.SetEntry(slow.next()); } return false; } @@ -212,10 +224,10 @@ lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::CalculateNumChildren ( return 0; uint64_t size = 2; ListEntry current(m_head); - while (current.next() && current.next()->GetValueAsUnsigned(0) != m_node_address) + while (current.next() && current.next().value() != m_node_address) { size++; - current.SetEntry(current.next()); + current = current.next(); if (size > m_list_capping_size) break; } @@ -245,9 +257,13 @@ lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::GetChildAtIndex (size_ return lldb::ValueObjectSP(); // we need to copy current_sp into a new object otherwise we will end up with all items named __value_ DataExtractor data; - current_sp->GetData(data); + Error error; + current_sp->GetData(data, error); + if (error.Fail()) + return lldb::ValueObjectSP(); + StreamString name; - name.Printf("[%zu]",idx); + name.Printf("[%" PRIu64 "]", (uint64_t)idx); return (m_children[idx] = ValueObject::CreateValueObjectFromData(name.GetData(), data, m_backend.GetExecutionContextRef(), m_element_type)); } diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxMap.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxMap.cpp index 5daa40f..e665f296 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxMap.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxMap.cpp @@ -366,9 +366,15 @@ lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetChildAtIndex (size_t // at this point we have a valid // we need to copy current_sp into a new object otherwise we will end up with all items named __value_ DataExtractor data; - iterated_sp->GetData(data); + Error error; + iterated_sp->GetData(data, error); + if (error.Fail()) + { + m_tree = NULL; + return lldb::ValueObjectSP(); + } StreamString name; - name.Printf("[%zu]",idx); + name.Printf("[%" PRIu64 "]", (uint64_t)idx); return (m_children[idx] = ValueObject::CreateValueObjectFromData(name.GetData(), data, m_backend.GetExecutionContextRef(), m_element_type)); } diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp index 05b41d0..bf68f20 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp @@ -81,9 +81,12 @@ lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::GetChildAtInde if (!val_hash.first) return lldb::ValueObjectSP(); StreamString stream; - stream.Printf("[%zu]",idx); + stream.Printf("[%" PRIu64 "]", (uint64_t)idx); DataExtractor data; - val_hash.first->GetData(data); + Error error; + val_hash.first->GetData(data, error); + if (error.Fail()) + return lldb::ValueObjectSP(); const bool thread_and_frame_only_if_stopped = true; ExecutionContext exe_ctx = val_hash.first->GetExecutionContextRef().Lock(thread_and_frame_only_if_stopped); return val_hash.first->CreateValueObjectFromData(stream.GetData(), diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibStdcpp.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibStdcpp.cpp index 08e7d58..f2d6173 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibStdcpp.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/LibStdcpp.cpp @@ -93,7 +93,7 @@ lldb_private::formatters::LibstdcppVectorBoolSyntheticFrontEnd::GetChildAtIndex target.EvaluateExpression("(bool)true", NULL, retval_sp); else target.EvaluateExpression("(bool)false", NULL, retval_sp); - StreamString name; name.Printf("[%zu]",idx); + StreamString name; name.Printf("[%" PRIu64 "]", (uint64_t)idx); if (retval_sp) retval_sp->SetName(ConstString(name.GetData())); return retval_sp; diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/NSArray.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/NSArray.cpp index d8ee9bf..1663538 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/NSArray.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/NSArray.cpp @@ -19,12 +19,214 @@ #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/ObjCLanguageRuntime.h" +#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h" #include "lldb/Target/Target.h" +#include "clang/AST/ASTContext.h" + using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; +namespace lldb_private { + namespace formatters { + class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd + { + public: + NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); + + virtual size_t + CalculateNumChildren (); + + virtual lldb::ValueObjectSP + GetChildAtIndex (size_t idx); + + virtual bool + Update() = 0; + + virtual bool + MightHaveChildren (); + + virtual size_t + GetIndexOfChildWithName (const ConstString &name); + + virtual + ~NSArrayMSyntheticFrontEnd () {} + + protected: + virtual lldb::addr_t + GetDataAddress () = 0; + + virtual uint64_t + GetUsedCount () = 0; + + virtual uint64_t + GetOffset () = 0; + + virtual uint64_t + GetSize () = 0; + + ExecutionContextRef m_exe_ctx_ref; + uint8_t m_ptr_size; + ClangASTType m_id_type; + std::vector<lldb::ValueObjectSP> m_children; + }; + + class NSArrayMSyntheticFrontEnd_109 : public NSArrayMSyntheticFrontEnd + { + private: + struct DataDescriptor_32 + { + uint32_t _used; + uint32_t _priv1 : 2 ; + uint32_t _size : 30; + uint32_t _priv2 : 2; + uint32_t _offset : 30; + uint32_t _priv3; + uint32_t _data; + }; + struct DataDescriptor_64 + { + uint64_t _used; + uint64_t _priv1 : 2 ; + uint64_t _size : 62; + uint64_t _priv2 : 2; + uint64_t _offset : 62; + uint32_t _priv3; + uint64_t _data; + }; + public: + NSArrayMSyntheticFrontEnd_109 (lldb::ValueObjectSP valobj_sp); + + virtual bool + Update(); + + virtual + ~NSArrayMSyntheticFrontEnd_109 (); + + protected: + virtual lldb::addr_t + GetDataAddress (); + + virtual uint64_t + GetUsedCount (); + + virtual uint64_t + GetOffset (); + + virtual uint64_t + GetSize (); + + private: + DataDescriptor_32 *m_data_32; + DataDescriptor_64 *m_data_64; + }; + + class NSArrayMSyntheticFrontEnd_1010 : public NSArrayMSyntheticFrontEnd + { + private: + struct DataDescriptor_32 + { + uint32_t _used; + uint32_t _offset; + uint32_t _size : 28; + uint64_t _priv1 : 4; + uint32_t _priv2; + uint32_t _data; + }; + struct DataDescriptor_64 + { + uint64_t _used; + uint64_t _offset; + uint64_t _size : 60; + uint64_t _priv1 : 4; + uint32_t _priv2; + uint64_t _data; + }; + public: + NSArrayMSyntheticFrontEnd_1010 (lldb::ValueObjectSP valobj_sp); + + virtual bool + Update(); + + virtual + ~NSArrayMSyntheticFrontEnd_1010 (); + + protected: + virtual lldb::addr_t + GetDataAddress (); + + virtual uint64_t + GetUsedCount (); + + virtual uint64_t + GetOffset (); + + virtual uint64_t + GetSize (); + + private: + DataDescriptor_32 *m_data_32; + DataDescriptor_64 *m_data_64; + }; + + class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd + { + public: + NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); + + virtual size_t + CalculateNumChildren (); + + virtual lldb::ValueObjectSP + GetChildAtIndex (size_t idx); + + virtual bool + Update(); + + virtual bool + MightHaveChildren (); + + virtual size_t + GetIndexOfChildWithName (const ConstString &name); + + virtual + ~NSArrayISyntheticFrontEnd (); + private: + ExecutionContextRef m_exe_ctx_ref; + uint8_t m_ptr_size; + uint64_t m_items; + lldb::addr_t m_data_ptr; + ClangASTType m_id_type; + std::vector<lldb::ValueObjectSP> m_children; + }; + + class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd + { + public: + NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); + + virtual size_t + CalculateNumChildren (); + + virtual lldb::ValueObjectSP + GetChildAtIndex (size_t idx); + + virtual bool + Update(); + + virtual bool + MightHaveChildren (); + + virtual size_t + GetIndexOfChildWithName (const ConstString &name); + + virtual + ~NSArrayCodeRunningSyntheticFrontEnd (); + }; + } +} + bool lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream) { @@ -90,45 +292,55 @@ lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& s } lldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp.get()), +SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_ptr_size(8), - m_data_32(NULL), - m_data_64(NULL) +m_id_type(), +m_children() { if (valobj_sp) { - clang::ASTContext *ast = valobj_sp->GetClangType().GetASTContext(); + clang::ASTContext *ast = valobj_sp->GetExecutionContextRef().GetTargetSP()->GetScratchClangASTContext()->getASTContext(); if (ast) m_id_type = ClangASTType(ast, ast->ObjCBuiltinIdTy); + if (valobj_sp->GetProcessSP()) + m_ptr_size = valobj_sp->GetProcessSP()->GetAddressByteSize(); } } +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::NSArrayMSyntheticFrontEnd_109 (lldb::ValueObjectSP valobj_sp) : +NSArrayMSyntheticFrontEnd(valobj_sp), +m_data_32(NULL), +m_data_64(NULL) +{ +} + +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::NSArrayMSyntheticFrontEnd_1010 (lldb::ValueObjectSP valobj_sp) : +NSArrayMSyntheticFrontEnd(valobj_sp), +m_data_32(NULL), +m_data_64(NULL) +{ +} + size_t lldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren () { - if (m_data_32) - return m_data_32->_used; - if (m_data_64) - return m_data_64->_used; - return 0; + return GetUsedCount(); } lldb::ValueObjectSP lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx) { - if (!m_data_32 && !m_data_64) - return lldb::ValueObjectSP(); if (idx >= CalculateNumChildren()) return lldb::ValueObjectSP(); - lldb::addr_t object_at_idx = (m_data_32 ? m_data_32->_data : m_data_64->_data); + lldb::addr_t object_at_idx = GetDataAddress(); size_t pyhs_idx = idx; - pyhs_idx += (m_data_32 ? m_data_32->offset : m_data_64->offset); - if ((m_data_32 ? m_data_32->_size : m_data_64->_size) <= pyhs_idx) - pyhs_idx -= (m_data_32 ? m_data_32->_size : m_data_64->_size); + pyhs_idx += GetOffset(); + if (GetSize() <= pyhs_idx) + pyhs_idx -= GetSize(); object_at_idx += (pyhs_idx * m_ptr_size); StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(), object_at_idx, m_exe_ctx_ref, @@ -138,7 +350,42 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx } bool -lldb_private::formatters::NSArrayMSyntheticFrontEnd::Update() +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::Update() +{ + m_children.clear(); + ValueObjectSP valobj_sp = m_backend.GetSP(); + m_ptr_size = 0; + delete m_data_32; + m_data_32 = NULL; + delete m_data_64; + m_data_64 = NULL; + if (!valobj_sp) + return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + Error error; + error.Clear(); + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return false; + m_ptr_size = process_sp->GetAddressByteSize(); + uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; + if (m_ptr_size == 4) + { + m_data_32 = new DataDescriptor_32(); + process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); + } + else + { + m_data_64 = new DataDescriptor_64(); + process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); + } + if (error.Fail()) + return false; + return false; +} + +bool +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::Update() { m_children.clear(); ValueObjectSP valobj_sp = m_backend.GetSP(); @@ -181,8 +428,6 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren () size_t lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) { - if (!m_data_32 && !m_data_64) - return UINT32_MAX; const char* item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); if (idx < UINT32_MAX && idx >= CalculateNumChildren()) @@ -190,7 +435,87 @@ lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (co return idx; } -lldb_private::formatters::NSArrayMSyntheticFrontEnd::~NSArrayMSyntheticFrontEnd () +lldb::addr_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetDataAddress () +{ + if (!m_data_32 && !m_data_64) + return LLDB_INVALID_ADDRESS; + return m_data_32 ? m_data_32->_data : + m_data_64->_data; +} + +uint64_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetUsedCount () +{ + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_used : + m_data_64->_used; +} + +uint64_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetOffset () +{ + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_offset : + m_data_64->_offset; +} + +uint64_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetSize () +{ + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_size : + m_data_64->_size; +} + +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::~NSArrayMSyntheticFrontEnd_109 () +{ + delete m_data_32; + m_data_32 = NULL; + delete m_data_64; + m_data_64 = NULL; +} + +lldb::addr_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetDataAddress () +{ + if (!m_data_32 && !m_data_64) + return LLDB_INVALID_ADDRESS; + return m_data_32 ? m_data_32->_data : + m_data_64->_data; +} + +uint64_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetUsedCount () +{ + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_used : + m_data_64->_used; +} + +uint64_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetOffset () +{ + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_offset : + m_data_64->_offset; +} + +uint64_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetSize () +{ + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_size : + m_data_64->_size; +} + +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::~NSArrayMSyntheticFrontEnd_1010 () { delete m_data_32; m_data_32 = NULL; @@ -278,7 +603,7 @@ lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx if (error.Fail()) return lldb::ValueObjectSP(); StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(), object_at_idx, m_exe_ctx_ref, m_id_type); m_children.push_back(retval_sp); return retval_sp; @@ -286,14 +611,20 @@ lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) { + if (!valobj_sp) + return nullptr; + lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); if (!process_sp) return NULL; - ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); + AppleObjCRuntime *runtime = (AppleObjCRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); if (!runtime) return NULL; - if (!valobj_sp->IsPointerType()) + ClangASTType valobj_type(valobj_sp->GetClangType()); + Flags flags(valobj_type.GetTypeInfo()); + + if (flags.IsClear(ClangASTType::eTypeIsPointer)) { Error error; valobj_sp = valobj_sp->AddressOf(error); @@ -317,7 +648,10 @@ SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCre } else if (!strcmp(class_name,"__NSArrayM")) { - return (new NSArrayMSyntheticFrontEnd(valobj_sp)); + if (runtime->GetFoundationVersion() >= 1100) + return (new NSArrayMSyntheticFrontEnd_1010(valobj_sp)); + else + return (new NSArrayMSyntheticFrontEnd_109(valobj_sp)); } else { @@ -342,7 +676,7 @@ lldb::ValueObjectSP lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx) { StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx); if (valobj_sp) valobj_sp->SetName(ConstString(idx_name.GetData())); diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/NSDictionary.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/NSDictionary.cpp index f53004d..ddd1e2e 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/NSDictionary.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/NSDictionary.cpp @@ -210,9 +210,9 @@ lldb::ValueObjectSP lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx) { StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); StreamString key_fetcher_expr; - key_fetcher_expr.Printf("(id)[(NSArray*)[(id)0x%" PRIx64 " allKeys] objectAtIndex:%zu]",m_backend.GetPointerValue(),idx); + key_fetcher_expr.Printf("(id)[(NSArray*)[(id)0x%" PRIx64 " allKeys] objectAtIndex:%" PRIu64 "]", m_backend.GetPointerValue(), (uint64_t)idx); StreamString value_fetcher_expr; value_fetcher_expr.Printf("(id)[(id)0x%" PRIx64 " objectForKey:(%s)]",m_backend.GetPointerValue(),key_fetcher_expr.GetData()); StreamString object_fetcher_expr; @@ -220,7 +220,9 @@ lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIn lldb::ValueObjectSP child_sp; EvaluateExpressionOptions options; options.SetKeepInMemory(true); - m_backend.GetTargetSP()->EvaluateExpression(object_fetcher_expr.GetData(), m_backend.GetFrameSP().get(), child_sp, + m_backend.GetTargetSP()->EvaluateExpression(object_fetcher_expr.GetData(), + GetViableFrame(m_backend.GetTargetSP().get()), + child_sp, options); if (child_sp) child_sp->SetName(ConstString(idx_name.GetData())); @@ -403,7 +405,7 @@ lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (size_ } StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); DataExtractor data(buffer_sp, m_order, m_ptr_size); dict_item.valobj_sp = ValueObject::CreateValueObjectFromData(idx_name.GetData(), data, m_exe_ctx_ref, m_pair_type); } @@ -567,7 +569,7 @@ lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (size_ } StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); DataExtractor data(buffer_sp, m_order, m_ptr_size); dict_item.valobj_sp = ValueObject::CreateValueObjectFromData(idx_name.GetData(), data, m_exe_ctx_ref, m_pair_type); } diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/NSSet.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/NSSet.cpp index e6fe2a3..3c7c003 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/NSSet.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/NSSet.cpp @@ -305,7 +305,7 @@ lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex (size_t idx) assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); } StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(), @@ -473,7 +473,7 @@ lldb_private::formatters::NSSetMSyntheticFrontEnd::GetChildAtIndex (size_t idx) assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); } StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(), @@ -519,7 +519,7 @@ lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::GetChildAtIndex (size_t if (retval_sp) { StreamString idx_name; - idx_name.Printf("[%zu]",idx); + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); retval_sp->SetName(ConstString(idx_name.GetData())); } m_children[idx] = retval_sp; diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/TypeFormat.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/TypeFormat.cpp index a72f551..0c62daf 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/TypeFormat.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/TypeFormat.cpp @@ -38,6 +38,9 @@ m_my_revision(0) { } +TypeFormatImpl::~TypeFormatImpl () +{ +} TypeFormatImpl_Format::TypeFormatImpl_Format (lldb::Format f, const TypeFormatImpl::Flags& flags) : @@ -46,6 +49,10 @@ m_format (f) { } +TypeFormatImpl_Format::~TypeFormatImpl_Format () +{ +} + bool TypeFormatImpl_Format::FormatObject (ValueObject *valobj, std::string& dest) const @@ -64,7 +71,10 @@ TypeFormatImpl_Format::FormatObject (ValueObject *valobj, const RegisterInfo *reg_info = value.GetRegisterInfo(); if (reg_info) { - valobj->GetData(data); + Error error; + valobj->GetData(data, error); + if (error.Fail()) + return false; StreamString reg_sstr; data.Dump (®_sstr, @@ -105,7 +115,12 @@ TypeFormatImpl_Format::FormatObject (ValueObject *valobj, } } else - valobj->GetData(data); + { + Error error; + valobj->GetData(data, error); + if (error.Fail()) + return false; + } StreamString sstr; clang_type.DumpTypeValue (&sstr, // The stream to use for display @@ -154,6 +169,10 @@ m_types() { } +TypeFormatImpl_EnumType::~TypeFormatImpl_EnumType () +{ +} + bool TypeFormatImpl_EnumType::FormatObject (ValueObject *valobj, std::string& dest) const @@ -203,7 +222,10 @@ TypeFormatImpl_EnumType::FormatObject (ValueObject *valobj, if (valobj_enum_type.IsValid() == false) return false; DataExtractor data; - valobj->GetData(data); + Error error; + valobj->GetData(data, error); + if (error.Fail()) + return false; ExecutionContext exe_ctx (valobj->GetExecutionContextRef()); StreamString sstr; valobj_enum_type.DumpTypeValue(&sstr, diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/TypeSummary.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/TypeSummary.cpp index 4c75b4b..e5d8017 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/TypeSummary.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/TypeSummary.cpp @@ -69,7 +69,7 @@ StringSummaryFormat::FormatObject (ValueObject *valobj, if (IsOneLiner()) { ValueObjectPrinter printer(valobj,&s,DumpValueObjectOptions()); - printer.PrintChildrenOneLiner(HideNames()); + printer.PrintChildrenOneLiner(HideNames(valobj)); retval.assign(s.GetData()); return true; } @@ -95,12 +95,12 @@ StringSummaryFormat::GetDescription () sstr.Printf ("`%s`%s%s%s%s%s%s%s", m_format.c_str(), Cascades() ? "" : " (not cascading)", - !DoesPrintChildren() ? "" : " (show children)", - !DoesPrintValue() ? " (hide value)" : "", + !DoesPrintChildren(nullptr) ? "" : " (show children)", + !DoesPrintValue(nullptr) ? " (hide value)" : "", IsOneLiner() ? " (one-line printout)" : "", SkipsPointers() ? " (skip pointers)" : "", SkipsReferences() ? " (skip references)" : "", - HideNames() ? " (hide member names)" : ""); + HideNames(nullptr) ? " (hide member names)" : ""); return sstr.GetString(); } @@ -129,14 +129,15 @@ std::string CXXFunctionSummaryFormat::GetDescription () { StreamString sstr; - sstr.Printf ("`%s (%p) `%s%s%s%s%s%s%s", m_description.c_str(),m_impl, + sstr.Printf ("`%s (%p) `%s%s%s%s%s%s%s", m_description.c_str(), + static_cast<void*>(&m_impl), Cascades() ? "" : " (not cascading)", - !DoesPrintChildren() ? "" : " (show children)", - !DoesPrintValue() ? " (hide value)" : "", + !DoesPrintChildren(nullptr) ? "" : " (show children)", + !DoesPrintValue(nullptr) ? " (hide value)" : "", IsOneLiner() ? " (one-line printout)" : "", SkipsPointers() ? " (skip pointers)" : "", SkipsReferences() ? " (skip references)" : "", - HideNames() ? " (hide member names)" : ""); + HideNames(nullptr) ? " (hide member names)" : ""); return sstr.GetString(); } @@ -198,12 +199,12 @@ ScriptSummaryFormat::GetDescription () { StreamString sstr; sstr.Printf ("%s%s%s%s%s%s%s\n%s", Cascades() ? "" : " (not cascading)", - !DoesPrintChildren() ? "" : " (show children)", - !DoesPrintValue() ? " (hide value)" : "", + !DoesPrintChildren(nullptr) ? "" : " (show children)", + !DoesPrintValue(nullptr) ? " (hide value)" : "", IsOneLiner() ? " (one-line printout)" : "", SkipsPointers() ? " (skip pointers)" : "", SkipsReferences() ? " (skip references)" : "", - HideNames() ? " (hide member names)" : "", + HideNames(nullptr) ? " (hide member names)" : "", m_python_script.c_str()); return sstr.GetString(); diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/TypeSynthetic.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/TypeSynthetic.cpp index 972be48..3949673 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/TypeSynthetic.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/TypeSynthetic.cpp @@ -57,9 +57,9 @@ CXXSyntheticChildren::GetDescription() Cascades() ? "" : " (not cascading)", SkipsPointers() ? " (skip pointers)" : "", SkipsReferences() ? " (skip references)" : "", - m_create_callback, + reinterpret_cast<void*>(reinterpret_cast<intptr_t>(m_create_callback)), m_description.c_str()); - + return sstr.GetString(); } diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp index 944d6d2..65e5e3f 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp @@ -222,7 +222,11 @@ ValueObjectPrinter::PrintTypeIfNeeded () { // Some ValueObjects don't have types (like registers sets). Only print // the type if there is one to print - ConstString qualified_type_name(m_valobj->GetQualifiedTypeName()); + ConstString qualified_type_name; + if (options.m_be_raw) + qualified_type_name = m_valobj->GetQualifiedTypeName(); + else + qualified_type_name = m_valobj->GetDisplayTypeName(); if (qualified_type_name) m_stream->Printf("(%s) ", qualified_type_name.GetCString()); else @@ -341,7 +345,7 @@ ValueObjectPrinter::PrintValueAndSummaryIfNeeded (bool& value_printed, // the value if this thing is nil // (but show the value if the user passes a format explicitly) TypeSummaryImpl* entry = GetSummaryFormatter(); - if (!IsNil() && !m_value.empty() && (entry == NULL || (entry->DoesPrintValue() || options.m_format != eFormatDefault) || m_summary.empty()) && !options.m_hide_value) + if (!IsNil() && !m_value.empty() && (entry == NULL || (entry->DoesPrintValue(m_valobj) || options.m_format != eFormatDefault) || m_summary.empty()) && !options.m_hide_value) { m_stream->Printf(" %s", m_value.c_str()); value_printed = true; @@ -426,7 +430,7 @@ ValueObjectPrinter::ShouldPrintChildren (bool is_failed_description, TypeSummaryImpl* entry = GetSummaryFormatter(); - return (!entry || entry->DoesPrintChildren() || m_summary.empty()); + return (!entry || entry->DoesPrintChildren(m_valobj) || m_summary.empty()); } return false; } |