diff options
Diffstat (limited to 'contrib/llvm/tools/lldb/source/DataFormatters')
29 files changed, 2163 insertions, 7059 deletions
diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/CF.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/CF.cpp deleted file mode 100644 index 6ab9013268bd..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/CF.cpp +++ /dev/null @@ -1,297 +0,0 @@ -//===-- CF.cpp ----------------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -bool -lldb_private::formatters::CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - time_t epoch = GetOSXEpoch(); - epoch = epoch + (time_t)valobj.GetValueAsUnsigned(0); - tm *tm_date = localtime(&epoch); - if (!tm_date) - return false; - std::string buffer(1024,0); - if (strftime (&buffer[0], 1023, "%Z", tm_date) == 0) - return false; - stream.Printf("%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year+1900, tm_date->tm_mon+1, tm_date->tm_mday, tm_date->tm_hour, tm_date->tm_min, tm_date->tm_sec, buffer.c_str()); - return true; -} - -bool -lldb_private::formatters::CFBagSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint32_t count = 0; - - bool is_type_ok = false; // check to see if this is a CFBag we know about - if (descriptor->IsCFType()) - { - ConstString type_name(valobj.GetTypeName()); - if (type_name == ConstString("__CFBag") || type_name == ConstString("const struct __CFBag")) - { - if (valobj.IsPointerType()) - is_type_ok = true; - } - } - - if (is_type_ok == false) - { - StackFrameSP frame_sp(valobj.GetFrameSP()); - if (!frame_sp) - return false; - 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) != eExpressionCompleted) - return false; - if (!count_sp) - return false; - count = count_sp->GetValueAsUnsigned(0); - } - else - { - uint32_t offset = 2*ptr_size+4 + valobj_addr; - Error error; - count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0, error); - if (error.Fail()) - return false; - } - stream.Printf("@\"%u value%s\"", - count,(count == 1 ? "" : "s")); - return true; -} - -bool -lldb_private::formatters::CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint32_t count = 0; - - bool is_type_ok = false; // check to see if this is a CFBag we know about - if (descriptor->IsCFType()) - { - ConstString type_name(valobj.GetTypeName()); - if (type_name == ConstString("__CFMutableBitVector") || type_name == ConstString("__CFBitVector") || type_name == ConstString("CFMutableBitVectorRef") || type_name == ConstString("CFBitVectorRef")) - { - if (valobj.IsPointerType()) - is_type_ok = true; - } - } - - if (is_type_ok == false) - return false; - - Error error; - count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+2*ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - uint64_t num_bytes = count / 8 + ((count & 7) ? 1 : 0); - addr_t data_ptr = process_sp->ReadPointerFromMemory(valobj_addr+2*ptr_size+2*ptr_size, error); - if (error.Fail()) - return false; - // make sure we do not try to read huge amounts of data - if (num_bytes > 1024) - num_bytes = 1024; - DataBufferSP buffer_sp(new DataBufferHeap(num_bytes,0)); - num_bytes = process_sp->ReadMemory(data_ptr, buffer_sp->GetBytes(), num_bytes, error); - if (error.Fail() || num_bytes == 0) - return false; - uint8_t *bytes = buffer_sp->GetBytes(); - for (uint64_t byte_idx = 0; byte_idx < num_bytes-1; byte_idx++) - { - uint8_t byte = bytes[byte_idx]; - bool bit0 = (byte & 1) == 1; - bool bit1 = (byte & 2) == 2; - bool bit2 = (byte & 4) == 4; - bool bit3 = (byte & 8) == 8; - bool bit4 = (byte & 16) == 16; - bool bit5 = (byte & 32) == 32; - bool bit6 = (byte & 64) == 64; - bool bit7 = (byte & 128) == 128; - stream.Printf("%c%c%c%c %c%c%c%c ", - (bit7 ? '1' : '0'), - (bit6 ? '1' : '0'), - (bit5 ? '1' : '0'), - (bit4 ? '1' : '0'), - (bit3 ? '1' : '0'), - (bit2 ? '1' : '0'), - (bit1 ? '1' : '0'), - (bit0 ? '1' : '0')); - count -= 8; - } - { - // print the last byte ensuring we do not print spurious bits - uint8_t byte = bytes[num_bytes-1]; - bool bit0 = (byte & 1) == 1; - bool bit1 = (byte & 2) == 2; - bool bit2 = (byte & 4) == 4; - bool bit3 = (byte & 8) == 8; - bool bit4 = (byte & 16) == 16; - bool bit5 = (byte & 32) == 32; - bool bit6 = (byte & 64) == 64; - bool bit7 = (byte & 128) == 128; - if (count) - { - stream.Printf("%c",bit7 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit6 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit5 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit4 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit3 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit2 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit1 ? '1' : '0'); - count -= 1; - } - if (count) - stream.Printf("%c",bit0 ? '1' : '0'); - } - return true; -} - -bool -lldb_private::formatters::CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint32_t count = 0; - - bool is_type_ok = false; // check to see if this is a CFBinaryHeap we know about - if (descriptor->IsCFType()) - { - ConstString type_name(valobj.GetTypeName()); - if (type_name == ConstString("__CFBinaryHeap") || type_name == ConstString("const struct __CFBinaryHeap")) - { - if (valobj.IsPointerType()) - is_type_ok = true; - } - } - - if (is_type_ok == false) - { - StackFrameSP frame_sp(valobj.GetFrameSP()); - if (!frame_sp) - return false; - 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) != eExpressionCompleted) - return false; - if (!count_sp) - return false; - count = count_sp->GetValueAsUnsigned(0); - } - else - { - uint32_t offset = 2*ptr_size; - Error error; - count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0, error); - if (error.Fail()) - return false; - } - stream.Printf("@\"%u item%s\"", - count,(count == 1 ? "" : "s")); - return true; -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/CXXFormatterFunctions.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/CXXFormatterFunctions.cpp deleted file mode 100644 index 49eacee42f78..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/CXXFormatterFunctions.cpp +++ /dev/null @@ -1,1228 +0,0 @@ -//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" -#include "lldb/DataFormatters/StringPrinter.h" -#include "lldb/DataFormatters/TypeSummary.h" - -#include "llvm/Support/ConvertUTF.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#include "lldb/Core/ValueObjectConstResult.h" -#include "lldb/Host/Endian.h" -#include "lldb/Symbol/ClangASTContext.h" -#include "lldb/Target/SectionLoadList.h" -#include "lldb/Target/Target.h" -#include "lldb/Target/Thread.h" - -#include "lldb/Utility/ProcessStructReader.h" - -#include <algorithm> - -#if __ANDROID_NDK__ -#include <sys/types.h> -#endif - -#include "lldb/Host/Time.h" - -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, - const char* selector, - uint64_t &value) -{ - if (!target_type || !*target_type) - return false; - if (!selector || !*selector) - return false; - StreamString expr; - expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - lldb::ValueObjectSP result_sp; - Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = GetViableFrame(exe_ctx); - if (!target || !stack_frame) - return false; - - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(true); - - target->EvaluateExpression(expr.GetData(), - stack_frame, - result_sp, - options); - if (!result_sp) - return false; - value = result_sp->GetValueAsUnsigned(0); - return true; -} - -bool -lldb_private::formatters::ExtractSummaryFromObjCExpression (ValueObject &valobj, - const char* target_type, - const char* selector, - Stream &stream) -{ - if (!target_type || !*target_type) - return false; - if (!selector || !*selector) - return false; - StreamString expr; - expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - lldb::ValueObjectSP result_sp; - Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = GetViableFrame(exe_ctx); - if (!target || !stack_frame) - return false; - - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(true); - options.SetUseDynamic(lldb::eDynamicCanRunTarget); - - target->EvaluateExpression(expr.GetData(), - stack_frame, - result_sp, - options); - if (!result_sp) - return false; - stream.Printf("%s",result_sp->GetSummaryAsCString()); - return true; -} - -lldb::ValueObjectSP -lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, - const char* return_type, - const char* selector, - uint64_t index) -{ - lldb::ValueObjectSP valobj_sp; - if (!return_type || !*return_type) - return valobj_sp; - if (!selector || !*selector) - return valobj_sp; - StreamString expr_path_stream; - valobj.GetExpressionPath(expr_path_stream, false); - StreamString expr; - expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index); - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - lldb::ValueObjectSP result_sp; - Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = GetViableFrame(exe_ctx); - if (!target || !stack_frame) - return valobj_sp; - - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(true); - options.SetUseDynamic(lldb::eDynamicCanRunTarget); - - target->EvaluateExpression(expr.GetData(), - stack_frame, - valobj_sp, - options); - return valobj_sp; -} - -lldb::ValueObjectSP -lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, - const char* return_type, - const char* selector, - const char* key) -{ - lldb::ValueObjectSP valobj_sp; - if (!return_type || !*return_type) - return valobj_sp; - if (!selector || !*selector) - return valobj_sp; - if (!key || !*key) - return valobj_sp; - StreamString expr_path_stream; - valobj.GetExpressionPath(expr_path_stream, false); - StreamString expr; - expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key); - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - lldb::ValueObjectSP result_sp; - Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = GetViableFrame(exe_ctx); - if (!target || !stack_frame) - return valobj_sp; - - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(true); - options.SetUseDynamic(lldb::eDynamicCanRunTarget); - - target->EvaluateExpression(expr.GetData(), - stack_frame, - valobj_sp, - options); - return valobj_sp; -} - -bool -lldb_private::formatters::FunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - std::string destination; - StreamString sstr; - AddressType func_ptr_address_type = eAddressTypeInvalid; - addr_t func_ptr_address = valobj.GetPointerValue (&func_ptr_address_type); - if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) - { - switch (func_ptr_address_type) - { - case eAddressTypeInvalid: - case eAddressTypeFile: - case eAddressTypeHost: - break; - - case eAddressTypeLoad: - { - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - - Address so_addr; - Target *target = exe_ctx.GetTargetPtr(); - if (target && target->GetSectionLoadList().IsEmpty() == false) - { - if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) - { - so_addr.Dump (&sstr, - exe_ctx.GetBestExecutionContextScope(), - Address::DumpStyleResolvedDescription, - Address::DumpStyleSectionNameOffset); - } - } - } - break; - } - } - if (sstr.GetSize() > 0) - { - stream.Printf("(%s)", sstr.GetData()); - return true; - } - else - return false; -} - -bool -lldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(valobj_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken('u'); - - if (!ReadStringAndDumpToStream<StringElementType::UTF16>(options)) - { - stream.Printf("Summary Unavailable"); - return true; - } - - return true; -} - -bool -lldb_private::formatters::Char32StringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(valobj_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken('U'); - - if (!ReadStringAndDumpToStream<StringElementType::UTF32>(options)) - { - stream.Printf("Summary Unavailable"); - return true; - } - - return true; -} - -bool -lldb_private::formatters::WCharStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - lldb::addr_t data_addr = 0; - - if (valobj.IsPointerType()) - data_addr = valobj.GetValueAsUnsigned(0); - else if (valobj.IsArrayType()) - data_addr = valobj.GetAddressOf(); - - if (data_addr == 0 || data_addr == LLDB_INVALID_ADDRESS) - return false; - - clang::ASTContext* ast = valobj.GetClangType().GetASTContext(); - - if (!ast) - return false; - - ClangASTType wchar_clang_type = ClangASTContext::GetBasicType(ast, lldb::eBasicTypeWChar); - const uint32_t wchar_size = wchar_clang_type.GetBitSize(nullptr); // Safe to pass NULL for exe_scope here - - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(data_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken('L'); - - switch (wchar_size) - { - case 8: - return ReadStringAndDumpToStream<StringElementType::UTF8>(options); - case 16: - return ReadStringAndDumpToStream<StringElementType::UTF16>(options); - case 32: - return ReadStringAndDumpToStream<StringElementType::UTF32>(options); - default: - stream.Printf("size for wchar_t is not valid"); - return true; - } - return true; -} - -bool -lldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - DataExtractor data; - Error error; - valobj.GetData(data, error); - - if (error.Fail()) - return false; - - std::string value; - valobj.GetValueAsCString(lldb::eFormatUnicode16, value); - if (!value.empty()) - stream.Printf("%s ", value.c_str()); - - ReadBufferAndDumpToStreamOptions options(valobj); - options.SetData(data); - options.SetStream(&stream); - options.SetPrefixToken('u'); - options.SetQuote('\''); - options.SetSourceSize(1); - - return ReadBufferAndDumpToStream<StringElementType::UTF16>(options); -} - -bool -lldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - DataExtractor data; - Error error; - valobj.GetData(data, error); - - if (error.Fail()) - return false; - - std::string value; - valobj.GetValueAsCString(lldb::eFormatUnicode32, value); - if (!value.empty()) - stream.Printf("%s ", value.c_str()); - - ReadBufferAndDumpToStreamOptions options(valobj); - options.SetData(data); - options.SetStream(&stream); - options.SetPrefixToken('U'); - options.SetQuote('\''); - options.SetSourceSize(1); - - return ReadBufferAndDumpToStream<StringElementType::UTF32>(options); -} - -bool -lldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - DataExtractor data; - Error error; - valobj.GetData(data, error); - - if (error.Fail()) - return false; - - ReadBufferAndDumpToStreamOptions options(valobj); - options.SetData(data); - options.SetStream(&stream); - options.SetPrefixToken('L'); - options.SetQuote('\''); - options.SetSourceSize(1); - - return ReadBufferAndDumpToStream<StringElementType::UTF16>(options); -} - -// the field layout in a libc++ string (cap, side, data or data, size, cap) -enum LibcxxStringLayoutMode -{ - eLibcxxStringLayoutModeCSD = 0, - eLibcxxStringLayoutModeDSC = 1, - eLibcxxStringLayoutModeInvalid = 0xffff -}; - -// this function abstracts away the layout and mode details of a libc++ string -// and returns the address of the data and the size ready for callers to consume -static bool -ExtractLibcxxStringInfo (ValueObject& valobj, - ValueObjectSP &location_sp, - uint64_t& size) -{ - ValueObjectSP D(valobj.GetChildAtIndexPath({0,0,0,0})); - if (!D) - return false; - - ValueObjectSP layout_decider(D->GetChildAtIndexPath({0,0})); - - // this child should exist - if (!layout_decider) - return false; - - ConstString g_data_name("__data_"); - ConstString g_size_name("__size_"); - bool short_mode = false; // this means the string is in short-mode and the data is stored inline - LibcxxStringLayoutMode layout = (layout_decider->GetName() == g_data_name) ? eLibcxxStringLayoutModeDSC : eLibcxxStringLayoutModeCSD; - uint64_t size_mode_value = 0; - - if (layout == eLibcxxStringLayoutModeDSC) - { - ValueObjectSP size_mode(D->GetChildAtIndexPath({1,1,0})); - if (!size_mode) - return false; - - if (size_mode->GetName() != g_size_name) - { - // we are hitting the padding structure, move along - size_mode = D->GetChildAtIndexPath({1,1,1}); - if (!size_mode) - return false; - } - - size_mode_value = (size_mode->GetValueAsUnsigned(0)); - short_mode = ((size_mode_value & 0x80) == 0); - } - else - { - ValueObjectSP size_mode(D->GetChildAtIndexPath({1,0,0})); - if (!size_mode) - return false; - - size_mode_value = (size_mode->GetValueAsUnsigned(0)); - short_mode = ((size_mode_value & 1) == 0); - } - - if (short_mode) - { - ValueObjectSP s(D->GetChildAtIndex(1, true)); - if (!s) - return false; - location_sp = s->GetChildAtIndex((layout == eLibcxxStringLayoutModeDSC) ? 0 : 1, true); - size = (layout == eLibcxxStringLayoutModeDSC) ? size_mode_value : ((size_mode_value >> 1) % 256); - return (location_sp.get() != nullptr); - } - else - { - ValueObjectSP l(D->GetChildAtIndex(0, true)); - if (!l) - return false; - // we can use the layout_decider object as the data pointer - location_sp = (layout == eLibcxxStringLayoutModeDSC) ? layout_decider : l->GetChildAtIndex(2, true); - ValueObjectSP size_vo(l->GetChildAtIndex(1, true)); - if (!size_vo || !location_sp) - return false; - size = size_vo->GetValueAsUnsigned(0); - return true; - } -} - -bool -lldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - uint64_t size = 0; - ValueObjectSP location_sp((ValueObject*)nullptr); - if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) - return false; - if (size == 0) - { - stream.Printf("L\"\""); - return true; - } - if (!location_sp) - return false; - return WCharStringSummaryProvider(*location_sp.get(), stream, options); -} - -bool -lldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& summary_options) -{ - uint64_t size = 0; - ValueObjectSP location_sp((ValueObject*)nullptr); - - if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) - return false; - - if (size == 0) - { - stream.Printf("\"\""); - return true; - } - - if (!location_sp) - return false; - - DataExtractor extractor; - if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) - size = std::min<decltype(size)>(size, valobj.GetTargetSP()->GetMaximumSizeOfStringSummary()); - location_sp->GetPointeeData(extractor, 0, size); - - ReadBufferAndDumpToStreamOptions options(valobj); - options.SetData(extractor); // none of this matters for a string - pass some defaults - options.SetStream(&stream); - options.SetPrefixToken(0); - options.SetQuote('"'); - options.SetSourceSize(size); - lldb_private::formatters::ReadBufferAndDumpToStream<lldb_private::formatters::StringElementType::ASCII>(options); - - return true; -} - -bool -lldb_private::formatters::ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptorFromISA(valobj.GetValueAsUnsigned(0))); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - stream.Printf("%s",class_name); - return true; -} - -class ObjCClassSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd -{ -public: - ObjCClassSyntheticChildrenFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp.get()) - { - } - - virtual size_t - CalculateNumChildren () - { - return 0; - } - - virtual lldb::ValueObjectSP - GetChildAtIndex (size_t idx) - { - return lldb::ValueObjectSP(); - } - - virtual bool - Update() - { - return false; - } - - virtual bool - MightHaveChildren () - { - return false; - } - - virtual size_t - GetIndexOfChildWithName (const ConstString &name) - { - return UINT32_MAX; - } - - virtual - ~ObjCClassSyntheticChildrenFrontEnd () - { - } -}; - -SyntheticChildrenFrontEnd* -lldb_private::formatters::ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return new ObjCClassSyntheticChildrenFrontEnd(valobj_sp); -} - -template<bool needs_at> -bool -lldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - bool is_64bit = (process_sp->GetAddressByteSize() == 8); - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint64_t value = 0; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"NSConcreteData") || - !strcmp(class_name,"NSConcreteMutableData") || - !strcmp(class_name,"__NSCFData")) - { - uint32_t offset = (is_64bit ? 16 : 8); - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error); - if (error.Fail()) - return false; - } - else - { - if (!ExtractValueFromObjCExpression(valobj, "int", "length", value)) - return false; - } - - stream.Printf("%s%" PRIu64 " byte%s%s", - (needs_at ? "@\"" : ""), - value, - (value != 1 ? "s" : ""), - (needs_at ? "\"" : "")); - - return true; -} - -static bool -ReadAsciiBufferAndDumpToStream (lldb::addr_t location, - lldb::ProcessSP& process_sp, - Stream& dest, - uint32_t size = 0, - Error* error = NULL, - size_t *data_read = NULL, - char prefix_token = '@', - char quote = '"') -{ - Error my_error; - size_t my_data_read; - if (!process_sp || location == 0) - return false; - - if (!size) - size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); - else - size = std::min(size,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); - - lldb::DataBufferSP buffer_sp(new DataBufferHeap(size,0)); - - my_data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), size, my_error); - - if (error) - *error = my_error; - if (data_read) - *data_read = my_data_read; - - if (my_error.Fail()) - return false; - - dest.Printf("%c%c",prefix_token,quote); - - if (my_data_read) - dest.Printf("%s",(char*)buffer_sp->GetBytes()); - - dest.Printf("%c",quote); - - return true; -} - -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; -} - -static ClangASTType -GetNSPathStore2Type (Target &target) -{ - static ConstString g_type_name("__lldb_autogen_nspathstore2"); - - ClangASTContext *ast_ctx = target.GetScratchClangASTContext(); - - if (!ast_ctx) - return ClangASTType(); - - ClangASTType voidstar = ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType(); - ClangASTType uint32 = ast_ctx->GetIntTypeFromBitSize(32, false); - - return ast_ctx->GetOrCreateStructForIdentifier(g_type_name, { - {"isa",voidstar}, - {"lengthAndRef",uint32}, - {"buffer",voidstar} - }); -} - -bool -lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& summary_options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - 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; - - Error error; - - uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error); - if (error.Fail()) - return false; - - bool is_mutable = (info_bits & 1) == 1; - bool is_inline = (info_bits & 0x60) == 0; - bool has_explicit_length = (info_bits & (1 | 4)) != 4; - bool is_unicode = (info_bits & 0x10) == 0x10; - bool is_special = strcmp(class_name,"NSPathStore2") == 0; - bool has_null = (info_bits & 8) == 8; - - size_t explicit_length = 0; - if (!has_null && has_explicit_length && !is_special) - { - lldb::addr_t explicit_length_offset = 2*ptr_size; - if (is_mutable && !is_inline) - explicit_length_offset = explicit_length_offset + ptr_size; // notInlineMutable.length; - else if (is_inline) - explicit_length = explicit_length + 0; // inline1.length; - else if (!is_inline && !is_mutable) - explicit_length_offset = explicit_length_offset + ptr_size; // notInlineImmutable1.length; - else - explicit_length_offset = 0; - - if (explicit_length_offset) - { - explicit_length_offset = valobj_addr + explicit_length_offset; - explicit_length = process_sp->ReadUnsignedIntegerFromMemory(explicit_length_offset, 4, 0, error); - } - } - - if (strcmp(class_name,"NSString") && - strcmp(class_name,"CFStringRef") && - strcmp(class_name,"CFMutableStringRef") && - strcmp(class_name,"__NSCFConstantString") && - strcmp(class_name,"__NSCFString") && - strcmp(class_name,"NSCFConstantString") && - strcmp(class_name,"NSCFString") && - strcmp(class_name,"NSPathStore2")) - { - // not one of us - but tell me class name - stream.Printf("class name = %s",class_name); - return true; - } - - if (is_mutable) - { - uint64_t location = 2 * ptr_size + valobj_addr; - location = process_sp->ReadPointerFromMemory(location, error); - if (error.Fail()) - return false; - if (has_explicit_length && is_unicode) - { - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken('@'); - options.SetQuote('"'); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(false); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - return ReadStringAndDumpToStream<StringElementType::UTF16>(options); - } - else - { - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(location+1); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken('@'); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(false); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - return ReadStringAndDumpToStream<StringElementType::ASCII>(options); - } - } - else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable) - { - uint64_t location = 3 * ptr_size + valobj_addr; - return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); - } - else if (is_unicode) - { - uint64_t location = valobj_addr + 2*ptr_size; - if (is_inline) - { - if (!has_explicit_length) - { - stream.Printf("found new combo"); - return true; - } - else - location += ptr_size; - } - else - { - location = process_sp->ReadPointerFromMemory(location, error); - if (error.Fail()) - return false; - } - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken('@'); - options.SetQuote('"'); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(has_explicit_length == false); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - return ReadStringAndDumpToStream<StringElementType::UTF16> (options); - } - else if (is_special) - { - ProcessStructReader reader(valobj.GetProcessSP().get(), valobj.GetValueAsUnsigned(0), GetNSPathStore2Type(*valobj.GetTargetSP())); - explicit_length = reader.GetField<uint32_t>(ConstString("lengthAndRef")) >> 20; - lldb::addr_t location = valobj.GetValueAsUnsigned(0) + ptr_size + 4; - - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken('@'); - options.SetQuote('"'); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(has_explicit_length == false); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - return ReadStringAndDumpToStream<StringElementType::UTF16> (options); - } - else if (is_inline) - { - uint64_t location = valobj_addr + 2*ptr_size; - if (!has_explicit_length) - location++; - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken('@'); - options.SetSourceSize(explicit_length); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - return ReadStringAndDumpToStream<StringElementType::ASCII>(options); - } - else - { - uint64_t location = valobj_addr + 2*ptr_size; - location = process_sp->ReadPointerFromMemory(location, error); - if (error.Fail()) - return false; - if (has_explicit_length && !has_null) - explicit_length++; // account for the fact that there is no NULL and we need to have one added - ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetPrefixToken('@'); - options.SetStream(&stream); - options.SetSourceSize(explicit_length); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - return ReadStringAndDumpToStream<StringElementType::ASCII>(options); - } -} - -bool -lldb_private::formatters::NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - TargetSP target_sp(valobj.GetTargetSP()); - if (!target_sp) - return false; - uint32_t addr_size = target_sp->GetArchitecture().GetAddressByteSize(); - uint64_t pointer_value = valobj.GetValueAsUnsigned(0); - if (!pointer_value) - return false; - pointer_value += addr_size; - ClangASTType type(valobj.GetClangType()); - ExecutionContext exe_ctx(target_sp,false); - ValueObjectSP child_ptr_sp(valobj.CreateValueObjectFromAddress("string_ptr", pointer_value, exe_ctx, type)); - if (!child_ptr_sp) - return false; - DataExtractor 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) - return NSStringSummaryProvider(*child_sp, stream, options); - return false; -} - -bool -lldb_private::formatters::NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - return NSAttributedStringSummaryProvider(valobj, stream, options); -} - -bool -lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - stream.Printf("%s",valobj.GetObjectDescription()); - return true; -} - -bool -lldb_private::formatters::ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - const uint32_t type_info = valobj.GetClangType().GetTypeInfo(); - - ValueObjectSP real_guy_sp = valobj.GetSP(); - - if (type_info & eTypeIsPointer) - { - Error err; - real_guy_sp = valobj.Dereference(err); - if (err.Fail() || !real_guy_sp) - return false; - } - else if (type_info & eTypeIsReference) - { - real_guy_sp = valobj.GetChildAtIndex(0, true); - if (!real_guy_sp) - return false; - } - uint64_t value = real_guy_sp->GetValueAsUnsigned(0); - if (value == 0) - { - stream.Printf("NO"); - return true; - } - stream.Printf("YES"); - return true; -} - -template <bool is_sel_ptr> -bool -lldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - lldb::ValueObjectSP valobj_sp; - - ClangASTType charstar (valobj.GetClangType().GetBasicTypeFromAST(eBasicTypeChar).GetPointerType()); - - if (!charstar) - return false; - - ExecutionContext exe_ctx(valobj.GetExecutionContextRef()); - - if (is_sel_ptr) - { - lldb::addr_t data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - if (data_address == LLDB_INVALID_ADDRESS) - return false; - valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address, exe_ctx, charstar); - } - else - { - DataExtractor data; - Error error; - valobj.GetData(data, error); - if (error.Fail()) - return false; - valobj_sp = ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar); - } - - if (!valobj_sp) - return false; - - stream.Printf("%s",valobj_sp->GetSummaryAsCString()); - return true; -} - -// POSIX has an epoch on Jan-1-1970, but Cocoa prefers Jan-1-2001 -// this call gives the POSIX equivalent of the Cocoa epoch -time_t -lldb_private::formatters::GetOSXEpoch () -{ - static time_t epoch = 0; - if (!epoch) - { -#ifndef _WIN32 - tzset(); - tm tm_epoch; - tm_epoch.tm_sec = 0; - tm_epoch.tm_hour = 0; - tm_epoch.tm_min = 0; - tm_epoch.tm_mon = 0; - tm_epoch.tm_mday = 1; - tm_epoch.tm_year = 2001-1900; // for some reason, we need to subtract 1900 from this field. not sure why. - tm_epoch.tm_isdst = -1; - tm_epoch.tm_gmtoff = 0; - tm_epoch.tm_zone = NULL; - epoch = timegm(&tm_epoch); -#endif - } - return epoch; -} - -size_t -lldb_private::formatters::ExtractIndexFromString (const char* item_name) -{ - if (!item_name || !*item_name) - return UINT32_MAX; - if (*item_name != '[') - return UINT32_MAX; - item_name++; - char* endptr = NULL; - unsigned long int idx = ::strtoul(item_name, &endptr, 0); - if (idx == 0 && endptr == item_name) - return UINT32_MAX; - if (idx == ULONG_MAX) - return UINT32_MAX; - return idx; -} - -lldb_private::formatters::VectorIteratorSyntheticFrontEnd::VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp, - ConstString item_name) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_exe_ctx_ref(), -m_item_name(item_name), -m_item_sp() -{ - if (valobj_sp) - Update(); -} - -bool -lldb_private::formatters::VectorIteratorSyntheticFrontEnd::Update() -{ - m_item_sp.reset(); - - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - - if (!valobj_sp) - return false; - - ValueObjectSP item_ptr(valobj_sp->GetChildMemberWithName(m_item_name,true)); - if (!item_ptr) - return false; - if (item_ptr->GetValueAsUnsigned(0) == 0) - return false; - Error err; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - m_item_sp = CreateValueObjectFromAddress("item", item_ptr->GetValueAsUnsigned(0), m_exe_ctx_ref, item_ptr->GetClangType().GetPointeeType()); - if (err.Fail()) - m_item_sp.reset(); - return false; -} - -size_t -lldb_private::formatters::VectorIteratorSyntheticFrontEnd::CalculateNumChildren () -{ - return 1; -} - -lldb::ValueObjectSP -lldb_private::formatters::VectorIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (idx == 0) - return m_item_sp; - return lldb::ValueObjectSP(); -} - -bool -lldb_private::formatters::VectorIteratorSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (name == ConstString("item")) - return 0; - return UINT32_MAX; -} - -lldb_private::formatters::VectorIteratorSyntheticFrontEnd::~VectorIteratorSyntheticFrontEnd () -{ -} - -template bool -lldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&) ; - -template bool -lldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&) ; - -template bool -lldb_private::formatters::ObjCSELSummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&) ; - -template bool -lldb_private::formatters::ObjCSELSummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&) ; diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/CXXFunctionPointer.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/CXXFunctionPointer.cpp new file mode 100644 index 000000000000..c9e0ccb29698 --- /dev/null +++ b/contrib/llvm/tools/lldb/source/DataFormatters/CXXFunctionPointer.cpp @@ -0,0 +1,66 @@ +//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/DataFormatters/CXXFunctionPointer.h" + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#include "lldb/Target/SectionLoadList.h" +#include "lldb/Target/Target.h" + +#include <string> + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::formatters; + +bool +lldb_private::formatters::CXXFunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) +{ + std::string destination; + StreamString sstr; + AddressType func_ptr_address_type = eAddressTypeInvalid; + addr_t func_ptr_address = valobj.GetPointerValue (&func_ptr_address_type); + if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) + { + switch (func_ptr_address_type) + { + case eAddressTypeInvalid: + case eAddressTypeFile: + case eAddressTypeHost: + break; + + case eAddressTypeLoad: + { + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + + Address so_addr; + Target *target = exe_ctx.GetTargetPtr(); + if (target && target->GetSectionLoadList().IsEmpty() == false) + { + if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) + { + so_addr.Dump (&sstr, + exe_ctx.GetBestExecutionContextScope(), + Address::DumpStyleResolvedDescription, + Address::DumpStyleSectionNameOffset); + } + } + } + break; + } + } + if (sstr.GetSize() > 0) + { + stream.Printf("(%s)", sstr.GetData()); + return true; + } + else + return false; +} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/Cocoa.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/Cocoa.cpp deleted file mode 100644 index 28f3d4f1d41b..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/Cocoa.cpp +++ /dev/null @@ -1,561 +0,0 @@ -//===-- Cocoa.cpp -------------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -bool -lldb_private::formatters::NSBundleSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"NSBundle")) - { - uint64_t offset = 5 * ptr_size; - ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset, valobj.GetClangType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID), true)); - - StreamString summary_stream; - bool was_nsstring_ok = NSStringSummaryProvider(*text.get(), summary_stream, options); - if (was_nsstring_ok && summary_stream.GetSize() > 0) - { - stream.Printf("%s",summary_stream.GetData()); - return true; - } - } - // this is either an unknown subclass or an NSBundle that comes from [NSBundle mainBundle] - // which is encoded differently and needs to be handled by running code - return ExtractSummaryFromObjCExpression(valobj, "NSString*", "bundlePath", stream); -} - -bool -lldb_private::formatters::NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"__NSTimeZone")) - { - uint64_t offset = ptr_size; - ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset, valobj.GetClangType(), true)); - StreamString summary_stream; - bool was_nsstring_ok = NSStringSummaryProvider(*text.get(), summary_stream, options); - if (was_nsstring_ok && summary_stream.GetSize() > 0) - { - stream.Printf("%s",summary_stream.GetData()); - return true; - } - } - return ExtractSummaryFromObjCExpression(valobj, "NSString*", "name", stream); -} - -bool -lldb_private::formatters::NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"NSConcreteNotification")) - { - uint64_t offset = ptr_size; - ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset, valobj.GetClangType(), true)); - StreamString summary_stream; - bool was_nsstring_ok = NSStringSummaryProvider(*text.get(), summary_stream, options); - if (was_nsstring_ok && summary_stream.GetSize() > 0) - { - stream.Printf("%s",summary_stream.GetData()); - return true; - } - } - // this is either an unknown subclass or an NSBundle that comes from [NSBundle mainBundle] - // which is encoded differently and needs to be handled by running code - return ExtractSummaryFromObjCExpression(valobj, "NSString*", "name", stream); -} - -bool -lldb_private::formatters::NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - uint64_t port_number = 0; - - do - { - if (!strcmp(class_name,"NSMachPort")) - { - uint64_t offset = (ptr_size == 4 ? 12 : 20); - Error error; - port_number = process_sp->ReadUnsignedIntegerFromMemory(offset+valobj_addr, 4, 0, error); - if (error.Success()) - break; - } - if (!ExtractValueFromObjCExpression(valobj, "int", "machPort", port_number)) - return false; - } while (false); - - stream.Printf("mach port: %u",(uint32_t)(port_number & 0x00000000FFFFFFFF)); - return true; -} - -bool -lldb_private::formatters::NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - uint64_t count = 0; - - do { - if (!strcmp(class_name,"NSIndexSet") || !strcmp(class_name,"NSMutableIndexSet")) - { - Error error; - uint32_t mode = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+ptr_size, 4, 0, error); - if (error.Fail()) - return false; - // this means the set is empty - count = 0 - if ((mode & 1) == 1) - { - count = 0; - break; - } - if ((mode & 2) == 2) - mode = 1; // this means the set only has one range - else - mode = 2; // this means the set has multiple ranges - if (mode == 1) - { - count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+3*ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - } - else - { - // read a pointer to the data at 2*ptr_size - count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+2*ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - // read the data at 2*ptr_size from the first location - count = process_sp->ReadUnsignedIntegerFromMemory(count+2*ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - } - } - else - { - if (!ExtractValueFromObjCExpression(valobj, "unsigned long long int", "count", count)) - return false; - } - } while (false); - stream.Printf("%" PRIu64 " index%s", - count, - (count == 1 ? "" : "es")); - return true; -} - -bool -lldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"NSNumber") || !strcmp(class_name,"__NSCFNumber")) - { - uint64_t value = 0; - uint64_t i_bits = 0; - if (descriptor->GetTaggedPointerInfo(&i_bits,&value)) - { - switch (i_bits) - { - case 0: - stream.Printf("(char)%hhd",(char)value); - break; - case 1: - case 4: - stream.Printf("(short)%hd",(short)value); - break; - case 2: - case 8: - stream.Printf("(int)%d",(int)value); - break; - case 3: - case 12: - stream.Printf("(long)%" PRId64,value); - break; - default: - return false; - } - return true; - } - else - { - Error error; - uint8_t data_type = (process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 1, 0, error) & 0x1F); - uint64_t data_location = valobj_addr + 2*ptr_size; - uint64_t value = 0; - if (error.Fail()) - return false; - switch (data_type) - { - case 1: // 0B00001 - value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 1, 0, error); - if (error.Fail()) - return false; - stream.Printf("(char)%hhd",(char)value); - break; - case 2: // 0B0010 - value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 2, 0, error); - if (error.Fail()) - return false; - stream.Printf("(short)%hd",(short)value); - break; - case 3: // 0B0011 - value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error); - if (error.Fail()) - return false; - stream.Printf("(int)%d",(int)value); - break; - case 17: // 0B10001 - data_location += 8; - case 4: // 0B0100 - value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error); - if (error.Fail()) - return false; - stream.Printf("(long)%" PRId64,value); - break; - case 5: // 0B0101 - { - uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error); - if (error.Fail()) - return false; - float flt_value = *((float*)&flt_as_int); - stream.Printf("(float)%f",flt_value); - break; - } - case 6: // 0B0110 - { - uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error); - if (error.Fail()) - return false; - double dbl_value = *((double*)&dbl_as_lng); - stream.Printf("(double)%g",dbl_value); - break; - } - default: - return false; - } - return true; - } - } - else - { - return ExtractSummaryFromObjCExpression(valobj, "NSString*", "stringValue", stream); - } -} - -bool -lldb_private::formatters::NSURLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (strcmp(class_name, "NSURL") == 0) - { - uint64_t offset_text = ptr_size + ptr_size + 8; // ISA + pointer + 8 bytes of data (even on 32bit) - uint64_t offset_base = offset_text + ptr_size; - ClangASTType type(valobj.GetClangType()); - ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset_text, type, true)); - ValueObjectSP base(valobj.GetSyntheticChildAtOffset(offset_base, type, true)); - if (!text) - return false; - if (text->GetValueAsUnsigned(0) == 0) - return false; - StreamString summary; - if (!NSStringSummaryProvider(*text, summary, options)) - return false; - if (base && base->GetValueAsUnsigned(0)) - { - if (summary.GetSize() > 0) - summary.GetString().resize(summary.GetSize()-1); - summary.Printf(" -- "); - StreamString base_summary; - if (NSURLSummaryProvider(*base, base_summary, options) && base_summary.GetSize() > 0) - summary.Printf("%s",base_summary.GetSize() > 2 ? base_summary.GetData() + 2 : base_summary.GetData()); - } - if (summary.GetSize()) - { - stream.Printf("%s",summary.GetData()); - return true; - } - } - else - { - return ExtractSummaryFromObjCExpression(valobj, "NSString*", "description", stream); - } - return false; -} - -bool -lldb_private::formatters::NSDateSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint64_t date_value_bits = 0; - double date_value = 0.0; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (strcmp(class_name,"NSDate") == 0 || - strcmp(class_name,"__NSDate") == 0 || - strcmp(class_name,"__NSTaggedDate") == 0) - { - uint64_t info_bits=0,value_bits = 0; - if (descriptor->GetTaggedPointerInfo(&info_bits,&value_bits)) - { - date_value_bits = ((value_bits << 8) | (info_bits << 4)); - date_value = *((double*)&date_value_bits); - } - else - { - Error error; - date_value_bits = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+ptr_size, 8, 0, error); - date_value = *((double*)&date_value_bits); - if (error.Fail()) - return false; - } - } - else if (!strcmp(class_name,"NSCalendarDate")) - { - Error error; - date_value_bits = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+2*ptr_size, 8, 0, error); - date_value = *((double*)&date_value_bits); - if (error.Fail()) - return false; - } - else - { - if (ExtractValueFromObjCExpression(valobj, "NSTimeInterval", "ExtractValueFromObjCExpression", date_value_bits) == false) - return false; - date_value = *((double*)&date_value_bits); - } - if (date_value == -63114076800) - { - stream.Printf("0001-12-30 00:00:00 +0000"); - return true; - } - // this snippet of code assumes that time_t == seconds since Jan-1-1970 - // this is generally true and POSIXly happy, but might break if a library - // vendor decides to get creative - time_t epoch = GetOSXEpoch(); - epoch = epoch + (time_t)date_value; - tm *tm_date = gmtime(&epoch); - if (!tm_date) - return false; - std::string buffer(1024,0); - if (strftime (&buffer[0], 1023, "%Z", tm_date) == 0) - return false; - stream.Printf("%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year+1900, tm_date->tm_mon+1, tm_date->tm_mday, tm_date->tm_hour, tm_date->tm_min, tm_date->tm_sec, buffer.c_str()); - return true; -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/CoreMedia.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/CoreMedia.cpp deleted file mode 100644 index 5c33c0b69f72..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/CoreMedia.cpp +++ /dev/null @@ -1,85 +0,0 @@ -//===-- CoreMedia.cpp --------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/Flags.h" -#include "lldb/Symbol/ClangASTContext.h" - -#include <inttypes.h> - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -bool -lldb_private::formatters::CMTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ClangASTContext *ast_ctx = ClangASTContext::GetASTContext(valobj.GetClangType().GetASTContext()); - if (!ast_ctx) - return false; - - // fetch children by offset to compensate for potential lack of debug info - auto int64_ty = ast_ctx->GetIntTypeFromBitSize(64, true); - auto int32_ty = ast_ctx->GetIntTypeFromBitSize(32, true); - - auto value_sp(valobj.GetSyntheticChildAtOffset(0, int64_ty, true)); - auto timescale_sp(valobj.GetSyntheticChildAtOffset(8, int32_ty, true)); - auto flags_sp(valobj.GetSyntheticChildAtOffset(12, int32_ty, true)); - - if (!value_sp || !timescale_sp || !flags_sp) - return false; - - auto value = value_sp->GetValueAsUnsigned(0); - auto timescale = (int32_t)timescale_sp->GetValueAsUnsigned(0); // the timescale specifies the fraction of a second each unit in the numerator occupies - auto flags = Flags(flags_sp->GetValueAsUnsigned(0) & 0x00000000000000FF); // the flags I need sit in the LSB - - const unsigned int FlagPositiveInf = 4; - const unsigned int FlagNegativeInf = 8; - const unsigned int FlagIndefinite = 16; - - if (flags.AnySet(FlagIndefinite)) - { - stream.Printf("indefinite"); - return true; - } - - if (flags.AnySet(FlagPositiveInf)) - { - stream.Printf("+oo"); - return true; - } - - if (flags.AnySet(FlagNegativeInf)) - { - stream.Printf("-oo"); - return true; - } - - if (timescale == 0) - return false; - - switch (timescale) - { - case 0: - return false; - case 1: - stream.Printf("%" PRId64 " seconds", value); - return true; - case 2: - stream.Printf("%" PRId64 " half seconds", value); - return true; - case 3: - stream.Printf("%" PRId64 " third%sof a second", value, value == 1 ? " " : "s "); - return true; - default: - stream.Printf("%" PRId64 " %" PRId32 "th%sof a second", value, timescale, value == 1 ? " " : "s "); - return true; - } -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/DataVisualization.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/DataVisualization.cpp index 361254185b31..14cf13d2f185 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/DataVisualization.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/DataVisualization.cpp @@ -14,8 +14,6 @@ // Other libraries and framework includes // Project includes -#include "lldb/Core/Debugger.h" - using namespace lldb; using namespace lldb_private; @@ -133,6 +131,14 @@ DataVisualization::Categories::GetCategory (const ConstString &category, lldb::T return (entry.get() != NULL); } +bool +DataVisualization::Categories::GetCategory (lldb::LanguageType language, lldb::TypeCategoryImplSP &entry) +{ + if (LanguageCategory *lang_category = GetFormatManager().GetCategoryForLanguage(language)) + entry = lang_category->GetCategory(); + return (entry.get() != nullptr); +} + void DataVisualization::Categories::Add (const ConstString &category) { @@ -164,7 +170,14 @@ DataVisualization::Categories::Enable (const ConstString& category, { if (GetFormatManager().GetCategory(category)->IsEnabled()) GetFormatManager().DisableCategory(category); - GetFormatManager().EnableCategory(category, pos); + GetFormatManager().EnableCategory(category, pos, std::initializer_list<lldb::LanguageType>()); +} + +void +DataVisualization::Categories::Enable (lldb::LanguageType lang_type) +{ + if (LanguageCategory* lang_category = GetFormatManager().GetCategoryForLanguage(lang_type)) + lang_category->Enable(); } void @@ -175,6 +188,13 @@ DataVisualization::Categories::Disable (const ConstString& category) } void +DataVisualization::Categories::Disable (lldb::LanguageType lang_type) +{ + if (LanguageCategory* lang_category = GetFormatManager().GetCategoryForLanguage(lang_type)) + lang_category->Disable(); +} + +void DataVisualization::Categories::Enable (const lldb::TypeCategoryImplSP& category, TypeCategoryMap::Position pos) { @@ -206,9 +226,9 @@ DataVisualization::Categories::DisableStar () } void -DataVisualization::Categories::LoopThrough (FormatManager::CategoryCallback callback, void* callback_baton) +DataVisualization::Categories::ForEach (TypeCategoryMap::ForEachCallback callback) { - GetFormatManager().LoopThroughCategories(callback, callback_baton); + GetFormatManager().ForEachCategory(callback); } uint32_t @@ -248,9 +268,9 @@ DataVisualization::NamedSummaryFormats::Clear () } void -DataVisualization::NamedSummaryFormats::LoopThrough (TypeSummaryImpl::SummaryCallback callback, void* callback_baton) +DataVisualization::NamedSummaryFormats::ForEach (std::function<bool(ConstString, const lldb::TypeSummaryImplSP&)> callback) { - GetFormatManager().GetNamedSummaryContainer().LoopThrough(callback, callback_baton); + GetFormatManager().GetNamedSummaryContainer().ForEach(callback); } uint32_t diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/DumpValueObjectOptions.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/DumpValueObjectOptions.cpp new file mode 100644 index 000000000000..f3de1257bb80 --- /dev/null +++ b/contrib/llvm/tools/lldb/source/DataFormatters/DumpValueObjectOptions.cpp @@ -0,0 +1,245 @@ +//===-- DumpValueObjectOptions.cpp -----------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/DataFormatters/DumpValueObjectOptions.h" + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Core/ValueObject.h" + +using namespace lldb; +using namespace lldb_private; + +DumpValueObjectOptions::DumpValueObjectOptions() : + m_summary_sp(), + m_root_valobj_name(), + m_max_ptr_depth(PointerDepth{PointerDepth::Mode::Default,0}), + m_decl_printing_helper(), + m_use_synthetic(true), + m_scope_already_checked(false), + m_flat_output(false), + m_ignore_cap(false), + m_show_types(false), + m_show_location(false), + m_use_objc(false), + m_hide_root_type(false), + m_hide_name(false), + m_hide_value(false), + m_run_validator(false), + m_use_type_display_name(true), + m_allow_oneliner_mode(true), + m_hide_pointer_value(false), + m_reveal_empty_aggregates(true) +{} + + +DumpValueObjectOptions::DumpValueObjectOptions (ValueObject& valobj) : + DumpValueObjectOptions() +{ + m_use_dynamic = valobj.GetDynamicValueType(); + m_use_synthetic = valobj.IsSynthetic(); + m_varformat_language = valobj.GetPreferredDisplayLanguage(); +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetMaximumPointerDepth(PointerDepth depth) +{ + m_max_ptr_depth = depth; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetMaximumDepth(uint32_t depth) +{ + m_max_depth = depth; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetDeclPrintingHelper(DeclPrintingHelper helper) +{ + m_decl_printing_helper = helper; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetShowTypes(bool show) +{ + m_show_types = show; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetShowLocation(bool show) +{ + m_show_location = show; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetUseObjectiveC(bool use) +{ + m_use_objc = use; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetShowSummary(bool show) +{ + if (show == false) + SetOmitSummaryDepth(UINT32_MAX); + else + SetOmitSummaryDepth(0); + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetUseDynamicType(lldb::DynamicValueType dyn) +{ + m_use_dynamic = dyn; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetUseSyntheticValue(bool use_synthetic) +{ + m_use_synthetic = use_synthetic; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetScopeChecked(bool check) +{ + m_scope_already_checked = check; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetFlatOutput(bool flat) +{ + m_flat_output = flat; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetOmitSummaryDepth(uint32_t depth) +{ + m_omit_summary_depth = depth; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetIgnoreCap(bool ignore) +{ + m_ignore_cap = ignore; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetRawDisplay() +{ + SetUseSyntheticValue(false); + SetOmitSummaryDepth(UINT32_MAX); + SetIgnoreCap(true); + SetHideName(false); + SetHideValue(false); + SetUseTypeDisplayName(false); + SetAllowOnelinerMode(false); + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetFormat (lldb::Format format) +{ + m_format = format; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetSummary (lldb::TypeSummaryImplSP summary) +{ + m_summary_sp = summary; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetRootValueObjectName (const char* name) +{ + if (name) + m_root_valobj_name.assign(name); + else + m_root_valobj_name.clear(); + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetHideRootType (bool hide_root_type) +{ + m_hide_root_type = hide_root_type; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetHideName (bool hide_name) +{ + m_hide_name = hide_name; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetHideValue (bool hide_value) +{ + m_hide_value = hide_value; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetHidePointerValue (bool hide) +{ + m_hide_pointer_value = hide; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetVariableFormatDisplayLanguage (lldb::LanguageType lang) +{ + m_varformat_language = lang; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetRunValidator (bool run) +{ + m_run_validator = run; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetUseTypeDisplayName (bool dis) +{ + m_use_type_display_name = dis; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetAllowOnelinerMode (bool oneliner) +{ + m_allow_oneliner_mode = oneliner; + return *this; +} + +DumpValueObjectOptions& +DumpValueObjectOptions::SetRevealEmptyAggregates (bool reveal) +{ + m_reveal_empty_aggregates = reveal; + return *this; +} + diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/FormatClasses.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/FormatClasses.cpp index f27b45b30491..2e4acd175f1f 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/FormatClasses.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/FormatClasses.cpp @@ -9,6 +9,8 @@ #include "lldb/DataFormatters/FormatClasses.h" +#include "lldb/DataFormatters/FormatManager.h" + // C Includes // C++ Includes @@ -20,3 +22,48 @@ using namespace lldb; using namespace lldb_private; +FormattersMatchData::FormattersMatchData (ValueObject& valobj, lldb::DynamicValueType use_dynamic) : + m_valobj(valobj), + m_dynamic_value_type(use_dynamic), + m_formatters_match_vector({},false), + m_type_for_cache(), + m_candidate_languages() +{ + m_type_for_cache = FormatManager::GetTypeForCache(valobj, use_dynamic); + m_candidate_languages = FormatManager::GetCandidateLanguages(valobj); +} + +FormattersMatchVector +FormattersMatchData::GetMatchesVector () +{ + if (!m_formatters_match_vector.second) + { + m_formatters_match_vector.second = true; + m_formatters_match_vector.first = FormatManager::GetPossibleMatches(m_valobj, m_dynamic_value_type); + } + return m_formatters_match_vector.first; +} + +ConstString +FormattersMatchData::GetTypeForCache () +{ + return m_type_for_cache; +} + +CandidateLanguagesVector +FormattersMatchData::GetCandidateLanguages () +{ + return m_candidate_languages; +} + +ValueObject& +FormattersMatchData::GetValueObject () +{ + return m_valobj; +} + +lldb::DynamicValueType +FormattersMatchData::GetDynamicValueType () +{ + return m_dynamic_value_type; +} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp index 4e0fffbe6a1a..35a0468306fa 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/FormatManager.cpp @@ -9,20 +9,23 @@ #include "lldb/DataFormatters/FormatManager.h" +#include "llvm/ADT/STLExtras.h" + // C Includes // C++ Includes // Other libraries and framework includes // Project includes #include "lldb/Core/Debugger.h" -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/Core/Log.h" +#include "lldb/DataFormatters/FormattersHelpers.h" +#include "lldb/DataFormatters/LanguageCategory.h" #include "lldb/Target/ExecutionContext.h" -#include "lldb/Target/Platform.h" -#include "llvm/ADT/STLExtras.h" +#include "lldb/Target/Language.h" using namespace lldb; using namespace lldb_private; - +using namespace lldb_private::formatters; struct FormatInfo { @@ -63,6 +66,7 @@ g_format_infos[] = { eFormatVectorOfUInt32 , '\0' , "uint32_t[]" }, { eFormatVectorOfSInt64 , '\0' , "int64_t[]" }, { eFormatVectorOfUInt64 , '\0' , "uint64_t[]" }, + { eFormatVectorOfFloat16, '\0' , "float16[]" }, { eFormatVectorOfFloat32, '\0' , "float32[]" }, { eFormatVectorOfFloat64, '\0' , "float64[]" }, { eFormatVectorOfUInt128, '\0' , "uint128_t[]" }, @@ -119,6 +123,19 @@ GetFormatFromFormatName (const char *format_name, bool partial_match_ok, Format return false; } +void +FormatManager::Changed () +{ + ++m_last_revision; + m_format_cache.Clear (); + Mutex::Locker lang_locker(m_language_categories_mutex); + for (auto& iter : m_language_categories_map) + { + if (iter.second) + iter.second->GetFormatCache().Clear(); + } +} + bool FormatManager::GetFormatFromCString (const char *format_cstr, bool partial_match_ok, @@ -161,8 +178,32 @@ FormatManager::GetFormatAsCString (Format format) } void +FormatManager::EnableAllCategories () +{ + m_categories_map.EnableAllCategories (); + Mutex::Locker lang_locker(m_language_categories_mutex); + for (auto& iter : m_language_categories_map) + { + if (iter.second) + iter.second->Enable(); + } +} + +void +FormatManager::DisableAllCategories () +{ + m_categories_map.DisableAllCategories (); + Mutex::Locker lang_locker(m_language_categories_mutex); + for (auto& iter : m_language_categories_map) + { + if (iter.second) + iter.second->Disable(); + } +} + +void FormatManager::GetPossibleMatches (ValueObject& valobj, - ClangASTType clang_type, + CompilerType compiler_type, uint32_t reason, lldb::DynamicValueType use_dynamic, FormattersMatchVector& entries, @@ -171,8 +212,8 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, bool did_strip_typedef, bool root_level) { - clang_type = clang_type.RemoveFastQualifiers(); - ConstString type_name(clang_type.GetConstTypeName()); + compiler_type = compiler_type.GetTypeForFormatters(); + ConstString type_name(compiler_type.GetConstTypeName()); if (valobj.GetBitfieldBitSize() > 0) { StreamString sstring; @@ -181,15 +222,19 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, entries.push_back({bitfieldname,0,did_strip_ptr,did_strip_ref,did_strip_typedef}); reason |= lldb_private::eFormatterChoiceCriterionStrippedBitField; } - entries.push_back({type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef}); - 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}); + if (!compiler_type.IsMeaninglessWithoutDynamicResolution()) + { + entries.push_back({type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef}); + + ConstString display_type_name(compiler_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) + for (bool is_rvalue_ref = true, j = true; j && compiler_type.IsReferenceType(nullptr, &is_rvalue_ref); j = false) { - ClangASTType non_ref_type = clang_type.GetNonReferenceType(); + CompilerType non_ref_type = compiler_type.GetNonReferenceType(); GetPossibleMatches(valobj, non_ref_type, reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference, @@ -200,7 +245,7 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, did_strip_typedef); if (non_ref_type.IsTypedefType()) { - ClangASTType deffed_referenced_type = non_ref_type.GetTypedefedType(); + CompilerType 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, @@ -213,9 +258,9 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, } } - if (clang_type.IsPointerType()) + if (compiler_type.IsPointerType()) { - ClangASTType non_ptr_type = clang_type.GetPointeeType(); + CompilerType non_ptr_type = compiler_type.GetPointeeType(); GetPossibleMatches(valobj, non_ptr_type, reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference, @@ -226,7 +271,7 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, did_strip_typedef); if (non_ptr_type.IsTypedefType()) { - ClangASTType deffed_pointed_type = non_ptr_type.GetTypedefedType().GetPointerType(); + CompilerType deffed_pointed_type = non_ptr_type.GetTypedefedType().GetPointerType(); GetPossibleMatches(valobj, deffed_pointed_type, reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, @@ -237,45 +282,26 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, true); // this is not exactly the usual meaning of stripping typedefs } } - bool canBeObjCDynamic = clang_type.IsPossibleDynamicType (NULL, - false, // no C - true); // yes ObjC - if (canBeObjCDynamic) + for (lldb::LanguageType language_type : GetCandidateLanguages(valobj)) { - if (use_dynamic != lldb::eNoDynamicValues) + if (Language* language = Language::FindPlugin(language_type)) { - do + for (ConstString candidate : language->GetPossibleFormattersMatches(valobj, use_dynamic)) { - lldb::ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - break; - ObjCLanguageRuntime* runtime = process_sp->GetObjCLanguageRuntime(); - if (runtime == nullptr) - break; - ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (runtime->GetClassDescriptor(valobj)); - if (!objc_class_sp) - break; - ConstString name (objc_class_sp->GetClassName()); - entries.push_back({name,reason | lldb_private::eFormatterChoiceCriterionDynamicObjCDiscovery,did_strip_ptr,did_strip_ref,did_strip_typedef}); - } while (false); + entries.push_back({candidate, + reason | lldb_private::eFormatterChoiceCriterionLanguagePlugin, + did_strip_ptr, + did_strip_ref, + did_strip_typedef}); + } } - - ClangASTType non_ptr_type = clang_type.GetPointeeType(); - GetPossibleMatches(valobj, - non_ptr_type, - reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference, - use_dynamic, - entries, - true, - did_strip_ref, - did_strip_typedef); } - + // try to strip typedef chains - if (clang_type.IsTypedefType()) + if (compiler_type.IsTypedefType()) { - ClangASTType deffed_type = clang_type.GetTypedefedType(); + CompilerType deffed_type = compiler_type.GetTypedefedType(); GetPossibleMatches(valobj, deffed_type, reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, @@ -289,15 +315,15 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, if (root_level) { do { - if (!clang_type.IsValid()) + if (!compiler_type.IsValid()) break; - ClangASTType unqual_clang_ast_type = clang_type.GetFullyUnqualifiedType(); - if (!unqual_clang_ast_type.IsValid()) + CompilerType unqual_compiler_ast_type = compiler_type.GetFullyUnqualifiedType(); + if (!unqual_compiler_ast_type.IsValid()) break; - if (unqual_clang_ast_type.GetOpaqueQualType() != clang_type.GetOpaqueQualType()) + if (unqual_compiler_ast_type.GetOpaqueQualType() != compiler_type.GetOpaqueQualType()) GetPossibleMatches (valobj, - unqual_clang_ast_type, + unqual_compiler_ast_type, reason, use_dynamic, entries, @@ -313,7 +339,7 @@ FormatManager::GetPossibleMatches (ValueObject& valobj, lldb::ValueObjectSP static_value_sp(valobj.GetStaticValue()); if (static_value_sp) GetPossibleMatches(*static_value_sp.get(), - static_value_sp->GetClangType(), + static_value_sp->GetCompilerType(), reason | lldb_private::eFormatterChoiceCriterionWentToStaticValue, use_dynamic, entries, @@ -472,6 +498,21 @@ FormatManager::GetValidatorForType (lldb::TypeNameSpecifierImplSP type_sp) return validator_chosen_sp; } +void +FormatManager::ForEachCategory(TypeCategoryMap::ForEachCallback callback) +{ + m_categories_map.ForEach(callback); + Mutex::Locker locker(m_language_categories_mutex); + for (const auto& entry : m_language_categories_map) + { + if (auto category_sp = entry.second->GetCategory()) + { + if (!callback(category_sp)) + break; + } + } +} + lldb::TypeCategoryImplSP FormatManager::GetCategory (const ConstString& category_name, bool can_create) @@ -510,6 +551,7 @@ FormatManager::GetSingleItemFormat(lldb::Format vector_format) case eFormatVectorOfUInt128: return eFormatHex; + case eFormatVectorOfFloat16: case eFormatVectorOfFloat32: case eFormatVectorOfFloat64: return eFormatFloat; @@ -534,6 +576,22 @@ FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj) if (valobj.GetNumChildren() == 0) return false; + // ask the type if it has any opinion about this + // eLazyBoolCalculate == no opinion; other values should be self explanatory + CompilerType compiler_type(valobj.GetCompilerType()); + if (compiler_type.IsValid()) + { + switch (compiler_type.ShouldPrintAsOneLiner(&valobj)) + { + case eLazyBoolNo: + return false; + case eLazyBoolYes: + return true; + case eLazyBoolCalculate: + break; + } + } + size_t total_children_name_len = 0; for (size_t idx = 0; @@ -545,6 +603,23 @@ FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj) // something is wrong here - bail out if (!child_sp) return false; + + // also ask the child's type if it has any opinion + CompilerType child_compiler_type(child_sp->GetCompilerType()); + if (child_compiler_type.IsValid()) + { + switch (child_compiler_type.ShouldPrintAsOneLiner(child_sp.get())) + { + case eLazyBoolYes: + // an opinion of yes is only binding for the child, so keep going + case eLazyBoolCalculate: + break; + case eLazyBoolNo: + // but if the child says no, then it's a veto on the whole thing + return false; + } + } + // if we decided to define synthetic children for a type, we probably care enough // to show them, but avoid nesting children in children if (child_sp->GetSyntheticChildren().get() != nullptr) @@ -596,53 +671,86 @@ FormatManager::GetValidTypeName (const ConstString& type) } ConstString -GetTypeForCache (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +FormatManager::GetTypeForCache (ValueObject& valobj, + lldb::DynamicValueType use_dynamic) { - if (use_dynamic == lldb::eNoDynamicValues) + ValueObjectSP valobj_sp = valobj.GetQualifiedRepresentationIfAvailable(use_dynamic, valobj.IsSynthetic()); + if (valobj_sp && valobj_sp->GetCompilerType().IsValid()) { - if (valobj.IsDynamic()) - { - if (valobj.GetStaticValue()) - return valobj.GetStaticValue()->GetQualifiedTypeName(); - else - return ConstString(); - } - else - return valobj.GetQualifiedTypeName(); + if (!valobj_sp->GetCompilerType().IsMeaninglessWithoutDynamicResolution()) + return valobj_sp->GetQualifiedTypeName(); } - if (valobj.IsDynamic()) - return valobj.GetQualifiedTypeName(); - if (valobj.GetDynamicValue(use_dynamic)) - return valobj.GetDynamicValue(use_dynamic)->GetQualifiedTypeName(); return ConstString(); } +std::vector<lldb::LanguageType> +FormatManager::GetCandidateLanguages (ValueObject& valobj) +{ + lldb::LanguageType lang_type = valobj.GetObjectRuntimeLanguage(); + return GetCandidateLanguages(lang_type); +} + +std::vector<lldb::LanguageType> +FormatManager::GetCandidateLanguages (lldb::LanguageType lang_type) +{ + switch (lang_type) + { + case lldb::eLanguageTypeC: + case lldb::eLanguageTypeC89: + case lldb::eLanguageTypeC99: + case lldb::eLanguageTypeC11: + case lldb::eLanguageTypeC_plus_plus: + case lldb::eLanguageTypeC_plus_plus_03: + case lldb::eLanguageTypeC_plus_plus_11: + case lldb::eLanguageTypeC_plus_plus_14: + return {lldb::eLanguageTypeC_plus_plus, lldb::eLanguageTypeObjC}; + default: + return {lang_type}; + } +} + +LanguageCategory* +FormatManager::GetCategoryForLanguage (lldb::LanguageType lang_type) +{ + Mutex::Locker locker(m_language_categories_mutex); + auto iter = m_language_categories_map.find(lang_type), end = m_language_categories_map.end(); + if (iter != end) + return iter->second.get(); + LanguageCategory* lang_category = new LanguageCategory(lang_type); + m_language_categories_map[lang_type] = LanguageCategory::UniquePointer(lang_category); + return lang_category; +} + lldb::TypeFormatImplSP -FormatManager::GetHardcodedFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +FormatManager::GetHardcodedFormat (FormattersMatchData& match_data) { - for (const auto& candidate: m_hardcoded_formats) + TypeFormatImplSP retval_sp; + + for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - auto result = candidate(valobj,use_dynamic,*this); - if (result) - return result; + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->GetHardcoded(*this, match_data, retval_sp)) + break; + } } - return nullptr; + + return retval_sp; } lldb::TypeFormatImplSP FormatManager::GetFormat (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { + FormattersMatchData match_data(valobj, use_dynamic); + TypeFormatImplSP retval; - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - ConstString valobj_type(GetTypeForCache(valobj, use_dynamic)); - if (valobj_type) + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS)); + if (match_data.GetTypeForCache()) { if (log) - log->Printf("\n\n[FormatManager::GetFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>")); - if (m_format_cache.GetFormat(valobj_type,retval)) + log->Printf("\n\n[FormatManager::GetFormat] Looking into cache for type %s", match_data.GetTypeForCache().AsCString("<invalid>")); + if (m_format_cache.GetFormat(match_data.GetTypeForCache(),retval)) { if (log) { @@ -655,21 +763,41 @@ FormatManager::GetFormat (ValueObject& valobj, if (log) log->Printf("[FormatManager::GetFormat] Cache search failed. Going normal route"); } - retval = m_categories_map.GetFormat(valobj, use_dynamic); + + retval = m_categories_map.GetFormat(match_data); + if (!retval) + { + if (log) + log->Printf("[FormatManager::GetFormat] Search failed. Giving language a chance."); + for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) + { + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->Get(match_data, retval)) + break; + } + } + if (retval) + { + if (log) + log->Printf("[FormatManager::GetFormat] Language search success. Returning."); + return retval; + } + } if (!retval) { if (log) log->Printf("[FormatManager::GetFormat] Search failed. Giving hardcoded a chance."); - retval = GetHardcodedFormat(valobj, use_dynamic); + retval = GetHardcodedFormat(match_data); } - if (valobj_type && (!retval || !retval->NonCacheable())) + if (match_data.GetTypeForCache() && (!retval || !retval->NonCacheable())) { if (log) 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); + match_data.GetTypeForCache().AsCString("<invalid>")); + m_format_cache.SetFormat(match_data.GetTypeForCache(),retval); } if (log && log->GetDebug()) log->Printf("[FormatManager::GetFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); @@ -677,30 +805,35 @@ FormatManager::GetFormat (ValueObject& valobj, } lldb::TypeSummaryImplSP -FormatManager::GetHardcodedSummaryFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +FormatManager::GetHardcodedSummaryFormat (FormattersMatchData& match_data) { - for (const auto& candidate: m_hardcoded_summaries) + TypeSummaryImplSP retval_sp; + + for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - auto result = candidate(valobj,use_dynamic,*this); - if (result) - return result; + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->GetHardcoded(*this, match_data, retval_sp)) + break; + } } - return nullptr; + + return retval_sp; } lldb::TypeSummaryImplSP FormatManager::GetSummaryFormat (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { + FormattersMatchData match_data(valobj, use_dynamic); + TypeSummaryImplSP retval; - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - ConstString valobj_type(GetTypeForCache(valobj, use_dynamic)); - if (valobj_type) + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS)); + if (match_data.GetTypeForCache()) { if (log) - log->Printf("\n\n[FormatManager::GetSummaryFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>")); - if (m_format_cache.GetSummary(valobj_type,retval)) + log->Printf("\n\n[FormatManager::GetSummaryFormat] Looking into cache for type %s", match_data.GetTypeForCache().AsCString("<invalid>")); + if (m_format_cache.GetSummary(match_data.GetTypeForCache(),retval)) { if (log) { @@ -713,21 +846,41 @@ FormatManager::GetSummaryFormat (ValueObject& valobj, if (log) log->Printf("[FormatManager::GetSummaryFormat] Cache search failed. Going normal route"); } - retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic); + + retval = m_categories_map.GetSummaryFormat(match_data); + if (!retval) + { + if (log) + log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving language a chance."); + for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) + { + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->Get(match_data, retval)) + break; + } + } + if (retval) + { + if (log) + log->Printf("[FormatManager::GetSummaryFormat] Language search success. Returning."); + return retval; + } + } if (!retval) { if (log) log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving hardcoded a chance."); - retval = GetHardcodedSummaryFormat(valobj, use_dynamic); + retval = GetHardcodedSummaryFormat(match_data); } - if (valobj_type && (!retval || !retval->NonCacheable())) + if (match_data.GetTypeForCache() && (!retval || !retval->NonCacheable())) { if (log) 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); + match_data.GetTypeForCache().AsCString("<invalid>")); + m_format_cache.SetSummary(match_data.GetTypeForCache(),retval); } if (log && log->GetDebug()) log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); @@ -736,30 +889,35 @@ FormatManager::GetSummaryFormat (ValueObject& valobj, #ifndef LLDB_DISABLE_PYTHON lldb::SyntheticChildrenSP -FormatManager::GetHardcodedSyntheticChildren (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +FormatManager::GetHardcodedSyntheticChildren (FormattersMatchData& match_data) { - for (const auto& candidate: m_hardcoded_synthetics) + SyntheticChildrenSP retval_sp; + + for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - auto result = candidate(valobj,use_dynamic,*this); - if (result) - return result; + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->GetHardcoded(*this, match_data, retval_sp)) + break; + } } - return nullptr; + + return retval_sp; } lldb::SyntheticChildrenSP FormatManager::GetSyntheticChildren (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { + FormattersMatchData match_data(valobj, use_dynamic); + SyntheticChildrenSP retval; - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - ConstString valobj_type(GetTypeForCache(valobj, use_dynamic)); - if (valobj_type) + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS)); + if (match_data.GetTypeForCache()) { if (log) - log->Printf("\n\n[FormatManager::GetSyntheticChildren] Looking into cache for type %s", valobj_type.AsCString("<invalid>")); - if (m_format_cache.GetSynthetic(valobj_type,retval)) + log->Printf("\n\n[FormatManager::GetSyntheticChildren] Looking into cache for type %s", match_data.GetTypeForCache().AsCString("<invalid>")); + if (m_format_cache.GetSynthetic(match_data.GetTypeForCache(),retval)) { if (log) { @@ -772,21 +930,41 @@ FormatManager::GetSyntheticChildren (ValueObject& valobj, if (log) log->Printf("[FormatManager::GetSyntheticChildren] Cache search failed. Going normal route"); } - retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic); + + retval = m_categories_map.GetSyntheticChildren(match_data); + if (!retval) + { + if (log) + log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving language a chance."); + for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) + { + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->Get(match_data, retval)) + break; + } + } + if (retval) + { + if (log) + log->Printf("[FormatManager::GetSyntheticChildren] Language search success. Returning."); + return retval; + } + } if (!retval) { if (log) log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving hardcoded a chance."); - retval = GetHardcodedSyntheticChildren(valobj, use_dynamic); + retval = GetHardcodedSyntheticChildren(match_data); } - if (valobj_type && (!retval || !retval->NonCacheable())) + if (match_data.GetTypeForCache() && (!retval || !retval->NonCacheable())) { if (log) 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); + match_data.GetTypeForCache().AsCString("<invalid>")); + m_format_cache.SetSynthetic(match_data.GetTypeForCache(),retval); } if (log && log->GetDebug()) log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); @@ -798,14 +976,15 @@ lldb::TypeValidatorImplSP FormatManager::GetValidator (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { + FormattersMatchData match_data(valobj, use_dynamic); + TypeValidatorImplSP retval; - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - ConstString valobj_type(GetTypeForCache(valobj, use_dynamic)); - if (valobj_type) + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS)); + if (match_data.GetTypeForCache()) { if (log) - log->Printf("\n\n[FormatManager::GetValidator] Looking into cache for type %s", valobj_type.AsCString("<invalid>")); - if (m_format_cache.GetValidator(valobj_type,retval)) + log->Printf("\n\n[FormatManager::GetValidator] Looking into cache for type %s", match_data.GetTypeForCache().AsCString("<invalid>")); + if (m_format_cache.GetValidator(match_data.GetTypeForCache(),retval)) { if (log) { @@ -818,21 +997,41 @@ FormatManager::GetValidator (ValueObject& valobj, if (log) log->Printf("[FormatManager::GetValidator] Cache search failed. Going normal route"); } - retval = m_categories_map.GetValidator(valobj, use_dynamic); + + retval = m_categories_map.GetValidator(match_data); + if (!retval) + { + if (log) + log->Printf("[FormatManager::GetValidator] Search failed. Giving language a chance."); + for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) + { + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->Get(match_data, retval)) + break; + } + } + if (retval) + { + if (log) + log->Printf("[FormatManager::GetValidator] Language search success. Returning."); + return retval; + } + } if (!retval) { if (log) log->Printf("[FormatManager::GetValidator] Search failed. Giving hardcoded a chance."); - retval = GetHardcodedValidator(valobj, use_dynamic); + retval = GetHardcodedValidator(match_data); } - if (valobj_type && (!retval || !retval->NonCacheable())) + if (match_data.GetTypeForCache() && (!retval || !retval->NonCacheable())) { if (log) log->Printf("[FormatManager::GetValidator] Caching %p for type %s", static_cast<void*>(retval.get()), - valobj_type.AsCString("<invalid>")); - m_format_cache.SetValidator(valobj_type,retval); + match_data.GetTypeForCache().AsCString("<invalid>")); + m_format_cache.SetValidator(match_data.GetTypeForCache(),retval); } if (log && log->GetDebug()) log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); @@ -840,313 +1039,43 @@ FormatManager::GetValidator (ValueObject& valobj, } lldb::TypeValidatorImplSP -FormatManager::GetHardcodedValidator (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +FormatManager::GetHardcodedValidator (FormattersMatchData& match_data) { - for (const auto& candidate: m_hardcoded_validators) + TypeValidatorImplSP retval_sp; + + for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - auto result = candidate(valobj,use_dynamic,*this); - if (result) - return result; + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->GetHardcoded(*this, match_data, retval_sp)) + break; + } } - return nullptr; + + return retval_sp; } FormatManager::FormatManager() : + m_last_revision(0), m_format_cache(), + m_language_categories_mutex(Mutex::eMutexTypeRecursive), + m_language_categories_map(), m_named_summaries_map(this), - m_last_revision(0), m_categories_map(this), m_default_category_name(ConstString("default")), m_system_category_name(ConstString("system")), - m_gnu_cpp_category_name(ConstString("gnu-libstdc++")), - m_libcxx_category_name(ConstString("libcxx")), - m_objc_category_name(ConstString("objc")), - m_corefoundation_category_name(ConstString("CoreFoundation")), - 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_coremedia_category_name(ConstString("CoreMedia")), - m_hardcoded_formats(), - m_hardcoded_summaries(), - m_hardcoded_synthetics(), - m_hardcoded_validators() - + m_vectortypes_category_name(ConstString("VectorTypes")) { LoadSystemFormatters(); - LoadLibStdcppFormatters(); - LoadLibcxxFormatters(); - LoadObjCFormatters(); - LoadCoreMediaFormatters(); - LoadHardcodedFormatters(); - - EnableCategory(m_objc_category_name,TypeCategoryMap::Last); - EnableCategory(m_corefoundation_category_name,TypeCategoryMap::Last); - EnableCategory(m_appkit_category_name,TypeCategoryMap::Last); - EnableCategory(m_coreservices_category_name,TypeCategoryMap::Last); - EnableCategory(m_coregraphics_category_name,TypeCategoryMap::Last); - EnableCategory(m_coremedia_category_name,TypeCategoryMap::Last); - EnableCategory(m_gnu_cpp_category_name,TypeCategoryMap::Last); - EnableCategory(m_libcxx_category_name,TypeCategoryMap::Last); - EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last); - EnableCategory(m_system_category_name,TypeCategoryMap::Last); -} - -static void -AddFormat (TypeCategoryImpl::SharedPointer category_sp, - lldb::Format format, - ConstString type_name, - TypeFormatImpl::Flags flags, - bool regex = false) -{ - lldb::TypeFormatImplSP format_sp(new TypeFormatImpl_Format(format, flags)); - - if (regex) - category_sp->GetRegexTypeFormatsContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),format_sp); - else - category_sp->GetTypeFormatsContainer()->Add(type_name, format_sp); -} - - -static void -AddStringSummary(TypeCategoryImpl::SharedPointer category_sp, - const char* string, - ConstString type_name, - TypeSummaryImpl::Flags flags, - bool regex = false) -{ - lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, - string)); - - if (regex) - category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); - else - category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); -} - -static void -AddOneLineSummary (TypeCategoryImpl::SharedPointer category_sp, - ConstString type_name, - TypeSummaryImpl::Flags flags, - bool regex = false) -{ - flags.SetShowMembersOneLiner(true); - lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, "")); - - if (regex) - category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); - else - category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); -} - -#ifndef LLDB_DISABLE_PYTHON -static void -AddCXXSummary (TypeCategoryImpl::SharedPointer category_sp, - CXXFunctionSummaryFormat::Callback funct, - const char* description, - ConstString type_name, - TypeSummaryImpl::Flags flags, - bool regex = false) -{ - lldb::TypeSummaryImplSP summary_sp(new CXXFunctionSummaryFormat(flags,funct,description)); - 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 AddCXXSynthetic (TypeCategoryImpl::SharedPointer category_sp, - CXXSyntheticChildren::CreateFrontEndCallback generator, - const char* description, - ConstString type_name, - ScriptedSyntheticChildren::Flags flags, - bool regex = false) -{ - lldb::SyntheticChildrenSP synth_sp(new CXXSyntheticChildren(flags,description,generator)); - if (regex) - category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())), synth_sp); - else - category_sp->GetTypeSyntheticsContainer()->Add(type_name,synth_sp); -} -#endif - -#ifndef LLDB_DISABLE_PYTHON -static void AddFilter (TypeCategoryImpl::SharedPointer category_sp, - std::vector<std::string> children, - const char* description, - ConstString type_name, - ScriptedSyntheticChildren::Flags flags, - bool regex = false) -{ - TypeFilterImplSP filter_sp(new TypeFilterImpl(flags)); - for (auto child : children) - filter_sp->AddExpressionPath(child); - if (regex) - category_sp->GetRegexTypeFiltersContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())), filter_sp); - else - category_sp->GetTypeFiltersContainer()->Add(type_name,filter_sp); -} -#endif - -void -FormatManager::LoadLibStdcppFormatters() -{ - TypeSummaryImpl::Flags stl_summary_flags; - stl_summary_flags.SetCascades(true) - .SetSkipPointers(false) - .SetSkipReferences(false) - .SetDontShowChildren(true) - .SetDontShowValue(true) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - - lldb::TypeSummaryImplSP std_string_summary_sp(new StringSummaryFormat(stl_summary_flags, - "${var._M_dataplus._M_p}")); - - TypeCategoryImpl::SharedPointer gnu_category_sp = GetCategory(m_gnu_cpp_category_name); - - gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::string"), - std_string_summary_sp); - gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char>"), - std_string_summary_sp); - gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char,std::char_traits<char>,std::allocator<char> >"), - std_string_summary_sp); - gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"), - std_string_summary_sp); - - // making sure we force-pick the summary for printing wstring (_M_p is a wchar_t*) - lldb::TypeSummaryImplSP std_wstring_summary_sp(new StringSummaryFormat(stl_summary_flags, - "${var._M_dataplus._M_p%S}")); - - gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::wstring"), - std_wstring_summary_sp); - gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t>"), - std_wstring_summary_sp); - gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >"), - std_wstring_summary_sp); - gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >"), - std_wstring_summary_sp); + LoadVectorFormatters(); - -#ifndef LLDB_DISABLE_PYTHON - - SyntheticChildren::Flags stl_synth_flags; - stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); - - gnu_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")), - SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, - "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider"))); - gnu_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")), - SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, - "lldb.formatters.cpp.gnu_libstdcpp.StdMapSynthProvider"))); - gnu_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")), - SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, - "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider"))); - - stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(true); - gnu_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")), - TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, - "size=${svar%#}"))); - gnu_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")), - TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, - "size=${svar%#}"))); - gnu_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")), - TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, - "size=${svar%#}"))); - - AddCXXSynthetic(gnu_category_sp, lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator, "std::vector iterator synthetic children", ConstString("^__gnu_cxx::__normal_iterator<.+>$"), stl_synth_flags, true); - - AddCXXSynthetic(gnu_category_sp, lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator, "std::map iterator synthetic children", ConstString("^std::_Rb_tree_iterator<.+>$"), stl_synth_flags, true); -#endif -} - -void -FormatManager::LoadLibcxxFormatters() -{ - TypeSummaryImpl::Flags stl_summary_flags; - stl_summary_flags.SetCascades(true) - .SetSkipPointers(false) - .SetSkipReferences(false) - .SetDontShowChildren(true) - .SetDontShowValue(true) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - -#ifndef LLDB_DISABLE_PYTHON - //std::string code(" lldb.formatters.cpp.libcxx.stdstring_SummaryProvider(valobj,internal_dict)"); - //lldb::TypeSummaryImplSP std_string_summary_sp(new ScriptSummaryFormat(stl_summary_flags, "lldb.formatters.cpp.libcxx.stdstring_SummaryProvider",code.c_str())); - - lldb::TypeSummaryImplSP std_string_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxStringSummaryProvider, "std::string summary provider")); - lldb::TypeSummaryImplSP std_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxWStringSummaryProvider, "std::wstring summary provider")); - - TypeCategoryImpl::SharedPointer libcxx_category_sp = GetCategory(m_libcxx_category_name); - - libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::string"), - std_string_summary_sp); - libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >"), - std_string_summary_sp); - - libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::wstring"), - std_wstring_summary_sp); - libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >"), - std_wstring_summary_sp); - - SyntheticChildren::Flags stl_synth_flags; - stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); - - AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator, "libc++ std::vector synthetic children", ConstString("^std::__1::vector<.+>(( )?&)?$"), stl_synth_flags, true); - 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); - AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator, "libc++ std::unordered containers synthetic children", ConstString("^(std::__1::)unordered_(multi)?(map|set)<.+> >$"), stl_synth_flags, true); - AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator, "libc++ std::initializer_list synthetic children", ConstString("^std::initializer_list<.+>(( )?&)?$"), stl_synth_flags, true); - - libcxx_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)deque<.+>(( )?&)?$")), - SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, - "lldb.formatters.cpp.libcxx.stddeque_SynthProvider"))); - - AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, "shared_ptr synthetic children", ConstString("^(std::__1::)shared_ptr<.+>(( )?&)?$"), stl_synth_flags, true); - 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); - AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::unordered containers summary provider", ConstString("^(std::__1::)unordered_(multi)?(map|set)<.+> >$"), stl_summary_flags, true); - - stl_summary_flags.SetSkipPointers(true); - - AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxSmartPointerSummaryProvider, "libc++ std::shared_ptr summary provider", ConstString("^std::__1::shared_ptr<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxSmartPointerSummaryProvider, "libc++ std::weak_ptr summary provider", ConstString("^std::__1::weak_ptr<.+>(( )?&)?$"), stl_summary_flags, true); - - 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); -#endif + EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last, lldb::eLanguageTypeObjC_plus_plus); + EnableCategory(m_system_category_name,TypeCategoryMap::Last, lldb::eLanguageTypeObjC_plus_plus); } void FormatManager::LoadSystemFormatters() { - TypeSummaryImpl::Flags string_flags; string_flags.SetCascades(true) .SetSkipPointers(true) @@ -1157,7 +1086,7 @@ FormatManager::LoadSystemFormatters() .SetHideItemNames(false); TypeSummaryImpl::Flags string_array_flags; - string_array_flags.SetCascades(false) + string_array_flags.SetCascades(true) .SetSkipPointers(true) .SetSkipReferences(false) .SetDontShowChildren(true) @@ -1192,31 +1121,6 @@ FormatManager::LoadSystemFormatters() sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("OSType"), ostype_summary); #ifndef LLDB_DISABLE_PYTHON - // FIXME because of a bug in the FormattersContainer we need to add a summary for both X* and const X* (<rdar://problem/12717717>) - AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "char16_t * summary provider", ConstString("char16_t *"), string_flags); - - AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32StringSummaryProvider, "char32_t * summary provider", ConstString("char32_t *"), string_flags); - - AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t *"), string_flags); - AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t \\[[0-9]+\\]"), string_array_flags, true); - - AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("unichar *"), string_flags); - - TypeSummaryImpl::Flags widechar_flags; - widechar_flags.SetDontShowValue(true) - .SetSkipPointers(true) - .SetSkipReferences(false) - .SetCascades(true) - .SetDontShowChildren(true) - .SetHideItemNames(true) - .SetShowMembersOneLiner(false); - - AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags); - AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags); - AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags); - - AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "unichar summary provider", ConstString("unichar"), widechar_flags); - TypeFormatImpl::Flags fourchar_flags; fourchar_flags.SetCascades(true).SetSkipPointers(true).SetSkipReferences(true); @@ -1225,283 +1129,10 @@ FormatManager::LoadSystemFormatters() } void -FormatManager::LoadObjCFormatters() +FormatManager::LoadVectorFormatters() { - TypeSummaryImpl::Flags objc_flags; - objc_flags.SetCascades(false) - .SetSkipPointers(true) - .SetSkipReferences(true) - .SetDontShowChildren(true) - .SetDontShowValue(true) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - - TypeCategoryImpl::SharedPointer objc_category_sp = GetCategory(m_objc_category_name); - TypeCategoryImpl::SharedPointer appkit_category_sp = GetCategory(m_appkit_category_name); - TypeCategoryImpl::SharedPointer corefoundation_category_sp = GetCategory(m_corefoundation_category_name); - TypeCategoryImpl::SharedPointer coregraphics_category_sp = GetCategory(m_coregraphics_category_name); - TypeCategoryImpl::SharedPointer coreservices_category_sp = GetCategory(m_coreservices_category_name); - - lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,"")); - objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"), - ObjC_BOOL_summary); - objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"), - ObjC_BOOL_summary); - objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"), - ObjC_BOOL_summary); - -#ifndef LLDB_DISABLE_PYTHON - // we need to skip pointers here since we are special casing a SEL* when retrieving its value - objc_flags.SetSkipPointers(true); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("SEL *"), objc_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCClassSummaryProvider, "Class summary provider", ConstString("Class"), objc_flags); - - SyntheticChildren::Flags class_synth_flags; - class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); - - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, "Class synthetic children", ConstString("Class"), class_synth_flags); -#endif // LLDB_DISABLE_PYTHON - - objc_flags.SetSkipPointers(false); - objc_flags.SetCascades(true); - objc_flags.SetSkipReferences(false); - - AddStringSummary (objc_category_sp, - "${var.__FuncPtr%A}", - ConstString("__block_literal_generic"), - objc_flags); - - AddStringSummary(corefoundation_category_sp, - "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds", - ConstString("CFGregorianUnits"), - objc_flags); - AddStringSummary(corefoundation_category_sp, - "location=${var.location} length=${var.length}", - ConstString("CFRange"), - objc_flags); - - AddStringSummary(appkit_category_sp, - "location=${var.location}, length=${var.length}", - ConstString("NSRange"), - objc_flags); - AddStringSummary(appkit_category_sp, - "(${var.origin}, ${var.size}), ...", - ConstString("NSRectArray"), - objc_flags); - - AddOneLineSummary (appkit_category_sp, - ConstString("NSPoint"), - objc_flags); - AddOneLineSummary (appkit_category_sp, - ConstString("NSSize"), - objc_flags); - AddOneLineSummary (appkit_category_sp, - ConstString("NSRect"), - objc_flags); - - AddOneLineSummary (coregraphics_category_sp, - ConstString("CGSize"), - objc_flags); - AddOneLineSummary (coregraphics_category_sp, - ConstString("CGPoint"), - objc_flags); - AddOneLineSummary (coregraphics_category_sp, - ConstString("CGRect"), - objc_flags); - - AddStringSummary(coreservices_category_sp, - "red=${var.red} green=${var.green} blue=${var.blue}", - ConstString("RGBColor"), - objc_flags); - AddStringSummary(coreservices_category_sp, - "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})", - ConstString("Rect"), - objc_flags); - AddStringSummary(coreservices_category_sp, - "(v=${var.v}, h=${var.h})", - ConstString("Point"), - objc_flags); - AddStringSummary(coreservices_category_sp, - "${var.month}/${var.day}/${var.year} ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}", - ConstString("DateTimeRect *"), - objc_flags); - AddStringSummary(coreservices_category_sp, - "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}", - ConstString("LongDateRect"), - objc_flags); - AddStringSummary(coreservices_category_sp, - "(x=${var.x}, y=${var.y})", - ConstString("HIPoint"), - objc_flags); - AddStringSummary(coreservices_category_sp, - "origin=${var.origin} size=${var.size}", - ConstString("HIRect"), - objc_flags); - - TypeSummaryImpl::Flags appkit_flags; - appkit_flags.SetCascades(true) - .SetSkipPointers(false) - .SetSkipReferences(false) - .SetDontShowChildren(true) - .SetDontShowValue(false) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - - appkit_flags.SetDontShowChildren(false); - - -#ifndef LLDB_DISABLE_PYTHON - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSSet summary", ConstString("NSSet"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFSetRef summary", ConstString("CFSetRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetI summary", ConstString("__NSSetI"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetM summary", ConstString("__NSSetM"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags); - - // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags); - - appkit_flags.SetDontShowChildren(true); - - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFMutableArrayRef"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFArrayRef"), ScriptedSyntheticChildren::Flags()); - - 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()); - AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags()); - - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSSet synthetic children", ConstString("NSSet"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetI synthetic children", ConstString("__NSSetI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetM synthetic children", ConstString("__NSSetM"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSMutableSet synthetic children", ConstString("NSMutableSet"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), ScriptedSyntheticChildren::Flags()); - - AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, "NSIndexPath synthetic children", ConstString("NSIndexPath"), ScriptedSyntheticChildren::Flags()); - - AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFBagRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("__CFBag"), appkit_flags); - AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("const struct __CFBag"), appkit_flags); - AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags); - - AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__CFString"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSMutableString"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSAttributedStringSummaryProvider, "NSAttributedString summary provider", ConstString("NSAttributedString"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSMutableAttributedString"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSConcreteMutableAttributedString"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSBundleSummaryProvider, "NSBundle summary provider", ConstString("NSBundle"), appkit_flags); - - 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); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMachPortSummaryProvider, "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSNotification"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSConcreteNotification"), appkit_flags); - - AddStringSummary(appkit_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags); - AddStringSummary(appkit_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSDecimalNumber summary provider", ConstString("NSDecimalNumber"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSHost summary provider", ConstString("NSHost"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("NSURL"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("CFURLRef"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSDate"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSDate"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("CFTimeZoneRef"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags); - - // CFAbsoluteTime is actually a double rather than a pointer to an object - // we do not care about the numeric value, since it is probably meaningless to users - appkit_flags.SetDontShowValue(true); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFAbsoluteTimeSummaryProvider, "CFAbsoluteTime summary provider", ConstString("CFAbsoluteTime"), appkit_flags); - appkit_flags.SetDontShowValue(false); - - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags); - AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSMutableIndexSet"), appkit_flags); - - AddStringSummary(corefoundation_category_sp, - "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"", - ConstString("CFGregorianDate"), - appkit_flags); - - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFBitVectorRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFMutableBitVectorRef"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFBitVector"), appkit_flags); - AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFMutableBitVector"), appkit_flags); -#endif // LLDB_DISABLE_PYTHON - TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name); - + TypeSummaryImpl::Flags vector_flags; vector_flags.SetCascades(true) .SetSkipPointers(true) @@ -1514,8 +1145,8 @@ FormatManager::LoadObjCFormatters() AddStringSummary(vectors_category_sp, "${var.uint128}", ConstString("builtin_type_vec128"), - objc_flags); - + vector_flags); + AddStringSummary(vectors_category_sp, "", ConstString("float [4]"), @@ -1569,84 +1200,3 @@ FormatManager::LoadObjCFormatters() ConstString("vBool32"), vector_flags); } - -void -FormatManager::LoadCoreMediaFormatters() -{ - TypeSummaryImpl::Flags cm_flags; - cm_flags.SetCascades(true) - .SetDontShowChildren(false) - .SetDontShowValue(false) - .SetHideItemNames(false) - .SetShowMembersOneLiner(false) - .SetSkipPointers(false) - .SetSkipReferences(false); - - TypeCategoryImpl::SharedPointer cm_category_sp = GetCategory(m_coremedia_category_name); - -#ifndef LLDB_DISABLE_PYTHON - AddCXXSummary(cm_category_sp, lldb_private::formatters::CMTimeSummaryProvider, "CMTime summary provider", ConstString("CMTime"), cm_flags); -#endif // LLDB_DISABLE_PYTHON -} - -void -FormatManager::LoadHardcodedFormatters() -{ - { - // insert code to load formats here - } - { - // insert code to load summaries here - m_hardcoded_summaries.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager&) -> TypeSummaryImpl::SharedPointer { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::FunctionPointerSummaryProvider, "Function pointer summary provider")); - if (valobj.GetClangType().IsFunctionPointerType()) - { - return formatter_sp; - } - return nullptr; - }); - m_hardcoded_summaries.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags() - .SetCascades(true) - .SetDontShowChildren(true) - .SetHideItemNames(true) - .SetShowMembersOneLiner(true) - .SetSkipPointers(true) - .SetSkipReferences(false), - lldb_private::formatters::VectorTypeSummaryProvider, - "vector_type pointer summary provider")); - if (valobj.GetClangType().IsVectorType(nullptr, nullptr)) - { - if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled()) - return formatter_sp; - } - return nullptr; - }); - } - { - // insert code to load synthetics here - m_hardcoded_synthetics.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer { - static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true), - "vector_type synthetic children", - lldb_private::formatters::VectorTypeSyntheticFrontEndCreator)); - if (valobj.GetClangType().IsVectorType(nullptr, nullptr)) - { - if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled()) - return formatter_sp; - } - return nullptr; - }); - } - { - // insert code to load validators here - } -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/FormattersHelpers.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/FormattersHelpers.cpp new file mode 100644 index 000000000000..4b0e82e975e4 --- /dev/null +++ b/contrib/llvm/tools/lldb/source/DataFormatters/FormattersHelpers.cpp @@ -0,0 +1,336 @@ +//===-- FormattersHelpers.cpp -------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// C Includes + +// C++ Includes + +// Other libraries and framework includes + +// Project includes +#include "lldb/DataFormatters/FormattersHelpers.h" + +#include "lldb/Core/ConstString.h" +#include "lldb/Core/RegularExpression.h" +#include "lldb/Target/StackFrame.h" +#include "lldb/Target/Target.h" +#include "lldb/Target/Thread.h" + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::formatters; + +void +lldb_private::formatters::AddFormat (TypeCategoryImpl::SharedPointer category_sp, + lldb::Format format, + ConstString type_name, + TypeFormatImpl::Flags flags, + bool regex) +{ + lldb::TypeFormatImplSP format_sp(new TypeFormatImpl_Format(format, flags)); + + if (regex) + category_sp->GetRegexTypeFormatsContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),format_sp); + else + category_sp->GetTypeFormatsContainer()->Add(type_name, format_sp); +} + +void +lldb_private::formatters::AddSummary(TypeCategoryImpl::SharedPointer category_sp, + TypeSummaryImplSP summary_sp, + ConstString type_name, + bool regex) +{ + if (regex) + category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); + else + category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); +} + +void +lldb_private::formatters::AddStringSummary(TypeCategoryImpl::SharedPointer category_sp, + const char* string, + ConstString type_name, + TypeSummaryImpl::Flags flags, + bool regex) +{ + lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, + string)); + + if (regex) + category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); + else + category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); +} + +void +lldb_private::formatters::AddOneLineSummary (TypeCategoryImpl::SharedPointer category_sp, + ConstString type_name, + TypeSummaryImpl::Flags flags, + bool regex) +{ + flags.SetShowMembersOneLiner(true); + lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, "")); + + if (regex) + category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); + else + category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); +} + +#ifndef LLDB_DISABLE_PYTHON +void +lldb_private::formatters::AddCXXSummary (TypeCategoryImpl::SharedPointer category_sp, + CXXFunctionSummaryFormat::Callback funct, + const char* description, + ConstString type_name, + TypeSummaryImpl::Flags flags, + bool regex) +{ + lldb::TypeSummaryImplSP summary_sp(new CXXFunctionSummaryFormat(flags,funct,description)); + if (regex) + category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); + else + category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); +} + +void +lldb_private::formatters::AddCXXSynthetic (TypeCategoryImpl::SharedPointer category_sp, + CXXSyntheticChildren::CreateFrontEndCallback generator, + const char* description, + ConstString type_name, + ScriptedSyntheticChildren::Flags flags, + bool regex) +{ + lldb::SyntheticChildrenSP synth_sp(new CXXSyntheticChildren(flags,description,generator)); + if (regex) + category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())), synth_sp); + else + category_sp->GetTypeSyntheticsContainer()->Add(type_name,synth_sp); +} + +void +lldb_private::formatters::AddFilter (TypeCategoryImpl::SharedPointer category_sp, + std::vector<std::string> children, + const char* description, + ConstString type_name, + ScriptedSyntheticChildren::Flags flags, + bool regex) +{ + TypeFilterImplSP filter_sp(new TypeFilterImpl(flags)); + for (auto child : children) + filter_sp->AddExpressionPath(child); + if (regex) + category_sp->GetRegexTypeFiltersContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())), filter_sp); + else + category_sp->GetTypeFiltersContainer()->Add(type_name,filter_sp); +} +#endif + +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, + const char* selector, + uint64_t &value) +{ + if (!target_type || !*target_type) + return false; + if (!selector || !*selector) + return false; + StreamString expr; + expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + lldb::ValueObjectSP result_sp; + Target* target = exe_ctx.GetTargetPtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); + if (!target || !stack_frame) + return false; + + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(true); + options.SetLanguage(lldb::eLanguageTypeObjC_plus_plus); + options.SetResultIsInternal(true); + options.SetUseDynamic(lldb::eDynamicCanRunTarget); + + target->EvaluateExpression(expr.GetData(), + stack_frame, + result_sp, + options); + if (!result_sp) + return false; + value = result_sp->GetValueAsUnsigned(0); + return true; +} + +bool +lldb_private::formatters::ExtractSummaryFromObjCExpression (ValueObject &valobj, + const char* target_type, + const char* selector, + Stream &stream, + lldb::LanguageType lang_type) +{ + if (!target_type || !*target_type) + return false; + if (!selector || !*selector) + return false; + StreamString expr; + expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + lldb::ValueObjectSP result_sp; + Target* target = exe_ctx.GetTargetPtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); + if (!target || !stack_frame) + return false; + + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(true); + options.SetLanguage(lldb::eLanguageTypeObjC_plus_plus); + options.SetResultIsInternal(true); + options.SetUseDynamic(lldb::eDynamicCanRunTarget); + + target->EvaluateExpression(expr.GetData(), + stack_frame, + result_sp, + options); + if (!result_sp) + return false; + stream.Printf("%s",result_sp->GetSummaryAsCString(lang_type)); + return true; +} + +lldb::ValueObjectSP +lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, + const char* return_type, + const char* selector, + uint64_t index) +{ + lldb::ValueObjectSP valobj_sp; + if (!return_type || !*return_type) + return valobj_sp; + if (!selector || !*selector) + return valobj_sp; + StreamString expr; + const char *colon = ""; + llvm::StringRef selector_sr(selector); + if (selector_sr.back() != ':') + colon = ":"; + expr.Printf("(%s)[(id)0x%" PRIx64 " %s%s%" PRId64 "]",return_type,valobj.GetPointerValue(),selector,colon,index); + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + lldb::ValueObjectSP result_sp; + Target* target = exe_ctx.GetTargetPtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); + if (!target || !stack_frame) + return valobj_sp; + + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(true); + options.SetLanguage(lldb::eLanguageTypeObjC_plus_plus); + options.SetResultIsInternal(true); + options.SetUseDynamic(lldb::eDynamicCanRunTarget); + + target->EvaluateExpression(expr.GetData(), + stack_frame, + valobj_sp, + options); + return valobj_sp; +} + +lldb::ValueObjectSP +lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, + const char* return_type, + const char* selector, + const char* key) +{ + lldb::ValueObjectSP valobj_sp; + if (!return_type || !*return_type) + return valobj_sp; + if (!selector || !*selector) + return valobj_sp; + if (!key || !*key) + return valobj_sp; + StreamString expr; + const char *colon = ""; + llvm::StringRef selector_sr(selector); + if (selector_sr.back() != ':') + colon = ":"; + expr.Printf("(%s)[(id)0x%" PRIx64 " %s%s%s]",return_type,valobj.GetPointerValue(),selector,colon,key); + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + lldb::ValueObjectSP result_sp; + Target* target = exe_ctx.GetTargetPtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); + if (!target || !stack_frame) + return valobj_sp; + + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(true); + options.SetLanguage(lldb::eLanguageTypeObjC_plus_plus); + options.SetResultIsInternal(true); + options.SetUseDynamic(lldb::eDynamicCanRunTarget); + + target->EvaluateExpression(expr.GetData(), + stack_frame, + valobj_sp, + options); + return valobj_sp; +} + +size_t +lldb_private::formatters::ExtractIndexFromString (const char* item_name) +{ + if (!item_name || !*item_name) + return UINT32_MAX; + if (*item_name != '[') + return UINT32_MAX; + item_name++; + char* endptr = NULL; + unsigned long int idx = ::strtoul(item_name, &endptr, 0); + if (idx == 0 && endptr == item_name) + return UINT32_MAX; + if (idx == ULONG_MAX) + return UINT32_MAX; + return idx; +} + +lldb::addr_t +lldb_private::formatters::GetArrayAddressOrPointerValue (ValueObject& valobj) +{ + lldb::addr_t data_addr = LLDB_INVALID_ADDRESS; + + if (valobj.IsPointerType()) + data_addr = valobj.GetValueAsUnsigned(0); + else if (valobj.IsArrayType()) + data_addr = valobj.GetAddressOf(); + + return data_addr; +} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LanguageCategory.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LanguageCategory.cpp new file mode 100644 index 000000000000..261c3e6302e1 --- /dev/null +++ b/contrib/llvm/tools/lldb/source/DataFormatters/LanguageCategory.cpp @@ -0,0 +1,271 @@ +//===-- LanguageCategory.cpp ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/DataFormatters/LanguageCategory.h" + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/DataFormatters/FormatManager.h" +#include "lldb/DataFormatters/TypeCategory.h" +#include "lldb/DataFormatters/TypeFormat.h" +#include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/DataFormatters/TypeSynthetic.h" +#include "lldb/DataFormatters/TypeValidator.h" +#include "lldb/Target/Language.h" + +using namespace lldb; +using namespace lldb_private; + +LanguageCategory::LanguageCategory (lldb::LanguageType lang_type) : + m_category_sp(), + m_hardcoded_formats(), + m_hardcoded_summaries(), + m_hardcoded_synthetics(), + m_hardcoded_validators(), + m_format_cache(), + m_enabled(false) +{ + if (Language* language_plugin = Language::FindPlugin(lang_type)) + { + m_category_sp = language_plugin->GetFormatters(); + m_hardcoded_formats = language_plugin->GetHardcodedFormats(); + m_hardcoded_summaries = language_plugin->GetHardcodedSummaries(); + m_hardcoded_synthetics = language_plugin->GetHardcodedSynthetics(); + m_hardcoded_validators = language_plugin->GetHardcodedValidators(); + } + Enable(); +} + +bool +LanguageCategory::Get (FormattersMatchData& match_data, + lldb::TypeFormatImplSP& format_sp) +{ + if (!m_category_sp) + return false; + + if (!IsEnabled()) + return false; + + if (match_data.GetTypeForCache()) + { + if (m_format_cache.GetFormat(match_data.GetTypeForCache(), format_sp)) + return format_sp.get() != nullptr; + } + + ValueObject& valobj(match_data.GetValueObject()); + bool result = m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp); + if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp); + } + return result; +} + +bool +LanguageCategory::Get (FormattersMatchData& match_data, + lldb::TypeSummaryImplSP& format_sp) +{ + if (!m_category_sp) + return false; + + if (!IsEnabled()) + return false; + + if (match_data.GetTypeForCache()) + { + if (m_format_cache.GetSummary(match_data.GetTypeForCache(), format_sp)) + return format_sp.get() != nullptr; + } + + ValueObject& valobj(match_data.GetValueObject()); + bool result = m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp); + if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp); + } + return result; +} + +bool +LanguageCategory::Get (FormattersMatchData& match_data, + lldb::SyntheticChildrenSP& format_sp) +{ + if (!m_category_sp) + return false; + + if (!IsEnabled()) + return false; + + if (match_data.GetTypeForCache()) + { + if (m_format_cache.GetSynthetic(match_data.GetTypeForCache(), format_sp)) + return format_sp.get() != nullptr; + } + + ValueObject& valobj(match_data.GetValueObject()); + bool result = m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp); + if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp); + } + return result; +} + +bool +LanguageCategory::Get (FormattersMatchData& match_data, + lldb::TypeValidatorImplSP& format_sp) +{ + if (!m_category_sp) + return false; + + if (!IsEnabled()) + return false; + + if (match_data.GetTypeForCache()) + { + if (m_format_cache.GetValidator(match_data.GetTypeForCache(), format_sp)) + return format_sp.get() != nullptr; + } + + ValueObject& valobj(match_data.GetValueObject()); + bool result = m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp); + if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp); + } + return result; +} + +bool +LanguageCategory::GetHardcoded (FormatManager& fmt_mgr, + FormattersMatchData& match_data, + lldb::TypeFormatImplSP& format_sp) +{ + if (!IsEnabled()) + return false; + + ValueObject& valobj(match_data.GetValueObject()); + lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType()); + + for (auto& candidate : m_hardcoded_formats) + { + if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr))) + break; + } + if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp); + } + return format_sp.get() != nullptr; +} + +bool +LanguageCategory::GetHardcoded (FormatManager& fmt_mgr, + FormattersMatchData& match_data, + lldb::TypeSummaryImplSP& format_sp) +{ + if (!IsEnabled()) + return false; + + ValueObject& valobj(match_data.GetValueObject()); + lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType()); + + for (auto& candidate : m_hardcoded_summaries) + { + if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr))) + break; + } + if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp); + } + return format_sp.get() != nullptr; +} + +bool +LanguageCategory::GetHardcoded (FormatManager& fmt_mgr, + FormattersMatchData& match_data, + lldb::SyntheticChildrenSP& format_sp) +{ + if (!IsEnabled()) + return false; + + ValueObject& valobj(match_data.GetValueObject()); + lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType()); + + for (auto& candidate : m_hardcoded_synthetics) + { + if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr))) + break; + } + if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp); + } + return format_sp.get() != nullptr; +} + +bool +LanguageCategory::GetHardcoded (FormatManager& fmt_mgr, + FormattersMatchData& match_data, + lldb::TypeValidatorImplSP& format_sp) +{ + if (!IsEnabled()) + return false; + + ValueObject& valobj(match_data.GetValueObject()); + lldb::DynamicValueType use_dynamic(match_data.GetDynamicValueType()); + + for (auto& candidate : m_hardcoded_validators) + { + if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr))) + break; + } + if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp); + } + return format_sp.get() != nullptr; +} + +lldb::TypeCategoryImplSP +LanguageCategory::GetCategory () const +{ + return m_category_sp; +} + +FormatCache& +LanguageCategory::GetFormatCache () +{ + return m_format_cache; +} + +void +LanguageCategory::Enable () +{ + if (m_category_sp) + m_category_sp->Enable(true, TypeCategoryMap::Default); + m_enabled = true; +} + +void +LanguageCategory::Disable () +{ + if (m_category_sp) + m_category_sp->Disable(); + m_enabled = false; +} + +bool +LanguageCategory::IsEnabled () +{ + return m_enabled; +} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxx.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxx.cpp deleted file mode 100644 index a04b4ff6b8c7..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxx.cpp +++ /dev/null @@ -1,463 +0,0 @@ -//===-- LibCxx.cpp ----------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Debugger.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/FormatEntity.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -bool -lldb_private::formatters::LibcxxSmartPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); - if (!valobj_sp) - return false; - ValueObjectSP ptr_sp(valobj_sp->GetChildMemberWithName(ConstString("__ptr_"), true)); - ValueObjectSP count_sp(valobj_sp->GetChildAtNamePath( {ConstString("__cntrl_"),ConstString("__shared_owners_")} )); - ValueObjectSP weakcount_sp(valobj_sp->GetChildAtNamePath( {ConstString("__cntrl_"),ConstString("__shared_weak_owners_")} )); - - if (!ptr_sp) - return false; - - if (ptr_sp->GetValueAsUnsigned(0) == 0) - { - stream.Printf("nullptr"); - return true; - } - else - { - bool print_pointee = false; - Error error; - ValueObjectSP pointee_sp = ptr_sp->Dereference(error); - if (pointee_sp && error.Success()) - { - if (pointee_sp->DumpPrintableRepresentation(stream, - ValueObject::eValueObjectRepresentationStyleSummary, - lldb::eFormatInvalid, - ValueObject::ePrintableRepresentationSpecialCasesDisable, - false)) - print_pointee = true; - } - if (!print_pointee) - stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); - } - - if (count_sp) - stream.Printf(" strong=%" PRIu64, 1+count_sp->GetValueAsUnsigned(0)); - - if (weakcount_sp) - stream.Printf(" weak=%" PRIu64, 1+weakcount_sp->GetValueAsUnsigned(0)); - - return true; -} - -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_bool_type(), -m_exe_ctx_ref(), -m_count(0), -m_base_data_address(0), -m_children() -{ - if (valobj_sp) - { - Update(); - m_bool_type = valobj_sp->GetClangType().GetBasicTypeFromAST(lldb::eBasicTypeBool); - } -} - -size_t -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::CalculateNumChildren () -{ - return m_count; -} - -lldb::ValueObjectSP -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - auto iter = m_children.find(idx), - end = m_children.end(); - if (iter != end) - return iter->second; - if (idx >= m_count) - return ValueObjectSP(); - if (m_base_data_address == 0 || m_count == 0) - return ValueObjectSP(); - if (!m_bool_type) - return ValueObjectSP(); - size_t byte_idx = (idx >> 3); // divide by 8 to get byte index - size_t bit_index = (idx & 7); // efficient idx % 8 for bit index - lldb::addr_t byte_location = m_base_data_address + byte_idx; - ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP()); - if (!process_sp) - return ValueObjectSP(); - uint8_t byte = 0; - uint8_t mask = 0; - Error err; - size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err); - if (err.Fail() || bytes_read == 0) - return ValueObjectSP(); - switch (bit_index) - { - case 0: - mask = 1; break; - case 1: - mask = 2; break; - case 2: - mask = 4; break; - case 3: - mask = 8; break; - case 4: - mask = 16; break; - case 5: - mask = 32; break; - case 6: - mask = 64; break; - case 7: - mask = 128; break; - default: - return ValueObjectSP(); - } - bool bit_set = ((byte & mask) != 0); - DataBufferSP buffer_sp(new DataBufferHeap(m_bool_type.GetByteSize(nullptr),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("[%" PRIu64 "]", (uint64_t)idx); - ValueObjectSP retval_sp(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; -} - -/*(std::__1::vector<std::__1::allocator<bool> >) vBool = { - __begin_ = 0x00000001001000e0 - __size_ = 56 - __cap_alloc_ = { - std::__1::__libcpp_compressed_pair_imp<unsigned long, std::__1::allocator<unsigned long> > = { - __first_ = 1 - } - } - }*/ - -bool -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update() -{ - m_children.clear(); - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - ValueObjectSP size_sp(valobj_sp->GetChildMemberWithName(ConstString("__size_"), true)); - if (!size_sp) - return false; - m_count = size_sp->GetValueAsUnsigned(0); - if (!m_count) - return true; - ValueObjectSP begin_sp(valobj_sp->GetChildMemberWithName(ConstString("__begin_"), true)); - if (!begin_sp) - { - m_count = 0; - return false; - } - m_base_data_address = begin_sp->GetValueAsUnsigned(0); - if (!m_base_data_address) - { - m_count = 0; - return false; - } - return false; -} - -bool -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (!m_count || !m_base_data_address) - return UINT32_MAX; - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; -} - -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::~LibcxxVectorBoolSyntheticFrontEnd () -{} - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibcxxVectorBoolSyntheticFrontEnd(valobj_sp)); -} - -/* - (lldb) fr var ibeg --raw --ptr-depth 1 - (std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::pair<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::__tree_node<std::__1::pair<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, void *> *, long> >) ibeg = { - __i_ = { - __ptr_ = 0x0000000100103870 { - std::__1::__tree_node_base<void *> = { - std::__1::__tree_end_node<std::__1::__tree_node_base<void *> *> = { - __left_ = 0x0000000000000000 - } - __right_ = 0x0000000000000000 - __parent_ = 0x00000001001038b0 - __is_black_ = true - } - __value_ = { - first = 0 - second = { std::string } - */ - -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_pair_ptr() -{ - if (valobj_sp) - Update(); -} - -bool -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::Update() -{ - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - - TargetSP target_sp(valobj_sp->GetTargetSP()); - - if (!target_sp) - return false; - - if (!valobj_sp) - return false; - - // this must be a ValueObject* because it is a child of the ValueObject we are producing children for - // it if were a ValueObjectSP, we would end up with a loop (iterator -> synthetic -> child -> parent == iterator) - // and that would in turn leak memory by never allowing the ValueObjects to die and free their memory - m_pair_ptr = valobj_sp->GetValueForExpressionPath(".__i_.__ptr_->__value_", - NULL, - NULL, - NULL, - ValueObject::GetValueForExpressionPathOptions().DontCheckDotVsArrowSyntax().SetSyntheticChildrenTraversal(ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None), - NULL).get(); - - return false; -} - -size_t -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::CalculateNumChildren () -{ - return 2; -} - -lldb::ValueObjectSP -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (!m_pair_ptr) - return lldb::ValueObjectSP(); - return m_pair_ptr->GetChildAtIndex(idx, true); -} - -bool -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (name == ConstString("first")) - return 0; - if (name == ConstString("second")) - return 1; - return UINT32_MAX; -} - -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::~LibCxxMapIteratorSyntheticFrontEnd () -{ - // this will be deleted when its parent dies (since it's a child object) - //delete m_pair_ptr; -} - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibCxxMapIteratorSyntheticFrontEnd(valobj_sp)); -} - -/* - (lldb) fr var ibeg --raw --ptr-depth 1 -T - (std::__1::__wrap_iter<int *>) ibeg = { - (std::__1::__wrap_iter<int *>::iterator_type) __i = 0x00000001001037a0 { - (int) *__i = 1 - } - } -*/ - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - static ConstString g_item_name; - if (!g_item_name) - g_item_name.SetCString("__i"); - if (!valobj_sp) - return NULL; - return (new VectorIteratorSyntheticFrontEnd(valobj_sp,g_item_name)); -} - -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_cntrl(NULL), -m_count_sp(), -m_weak_count_sp(), -m_ptr_size(0), -m_byte_order(lldb::eByteOrderInvalid) -{ - if (valobj_sp) - Update(); -} - -size_t -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::CalculateNumChildren () -{ - return (m_cntrl ? 1 : 0); -} - -lldb::ValueObjectSP -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (!m_cntrl) - return lldb::ValueObjectSP(); - - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return lldb::ValueObjectSP(); - - if (idx == 0) - return valobj_sp->GetChildMemberWithName(ConstString("__ptr_"), true); - - if (idx > 2) - return lldb::ValueObjectSP(); - - if (idx == 1) - { - if (!m_count_sp) - { - ValueObjectSP shared_owners_sp(m_cntrl->GetChildMemberWithName(ConstString("__shared_owners_"),true)); - if (!shared_owners_sp) - return lldb::ValueObjectSP(); - uint64_t count = 1 + shared_owners_sp->GetValueAsUnsigned(0); - DataExtractor data(&count, 8, m_byte_order, m_ptr_size); - m_count_sp = CreateValueObjectFromData("count", data, valobj_sp->GetExecutionContextRef(), shared_owners_sp->GetClangType()); - } - return m_count_sp; - } - else /* if (idx == 2) */ - { - if (!m_weak_count_sp) - { - ValueObjectSP shared_weak_owners_sp(m_cntrl->GetChildMemberWithName(ConstString("__shared_weak_owners_"),true)); - if (!shared_weak_owners_sp) - return lldb::ValueObjectSP(); - uint64_t count = 1 + shared_weak_owners_sp->GetValueAsUnsigned(0); - DataExtractor data(&count, 8, m_byte_order, m_ptr_size); - m_weak_count_sp = CreateValueObjectFromData("count", data, valobj_sp->GetExecutionContextRef(), shared_weak_owners_sp->GetClangType()); - } - return m_weak_count_sp; - } -} - -bool -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() -{ - m_count_sp.reset(); - m_weak_count_sp.reset(); - m_cntrl = NULL; - - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - - TargetSP target_sp(valobj_sp->GetTargetSP()); - if (!target_sp) - return false; - - m_byte_order = target_sp->GetArchitecture().GetByteOrder(); - m_ptr_size = target_sp->GetArchitecture().GetAddressByteSize(); - - lldb::ValueObjectSP cntrl_sp(valobj_sp->GetChildMemberWithName(ConstString("__cntrl_"),true)); - - m_cntrl = cntrl_sp.get(); // need to store the raw pointer to avoid a circular dependency - return false; -} - -bool -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (name == ConstString("__ptr_")) - return 0; - if (name == ConstString("count")) - return 1; - if (name == ConstString("weak_count")) - return 2; - return UINT32_MAX; -} - -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::~LibcxxSharedPtrSyntheticFrontEnd () -{} - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibcxxSharedPtrSyntheticFrontEnd(valobj_sp)); -} - -bool -lldb_private::formatters::LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - if (valobj.IsPointerType()) - { - uint64_t value = valobj.GetValueAsUnsigned(0); - if (!value) - return false; - stream.Printf("0x%016" PRIx64 " ", value); - } - return FormatEntity::FormatStringRef("size=${svar%#}", stream, NULL, NULL, NULL, &valobj, false, false); -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxInitializerList.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxInitializerList.cpp deleted file mode 100644 index 0dcef981e5e5..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxInitializerList.cpp +++ /dev/null @@ -1,143 +0,0 @@ -//===-- LibCxxInitializerList.cpp ----------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/ConstString.h" -#include "lldb/Core/ValueObject.h" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -namespace lldb_private { - namespace formatters { - class LibcxxInitializerListSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxInitializerListSyntheticFrontEnd (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 - ~LibcxxInitializerListSyntheticFrontEnd (); - private: - ValueObject* m_start; - ClangASTType m_element_type; - uint32_t m_element_size; - size_t m_num_elements; - std::map<size_t,lldb::ValueObjectSP> m_children; - }; - } -} - -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::LibcxxInitializerListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_start(NULL), -m_element_type(), -m_element_size(0), -m_num_elements(0), -m_children() -{ - if (valobj_sp) - Update(); -} - -size_t -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::CalculateNumChildren () -{ - static ConstString g___size_("__size_"); - m_num_elements = 0; - ValueObjectSP size_sp(m_backend.GetChildMemberWithName(g___size_, true)); - if (size_sp) - m_num_elements = size_sp->GetValueAsUnsigned(0); - return m_num_elements; -} - -lldb::ValueObjectSP -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (!m_start) - return lldb::ValueObjectSP(); - - auto cached = m_children.find(idx); - if (cached != m_children.end()) - return cached->second; - - uint64_t offset = idx * m_element_size; - offset = offset + m_start->GetValueAsUnsigned(0); - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - ValueObjectSP child_sp = CreateValueObjectFromAddress(name.GetData(), offset, m_backend.GetExecutionContextRef(), m_element_type); - m_children[idx] = child_sp; - return child_sp; -} - -bool -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::Update() -{ - static ConstString g___begin_("__begin_"); - - m_start = nullptr; - m_num_elements = 0; - m_children.clear(); - lldb::TemplateArgumentKind kind; - m_element_type = m_backend.GetClangType().GetTemplateArgument(0, kind); - if (kind != lldb::eTemplateArgumentKindType || false == m_element_type.IsValid()) - return false; - - m_element_size = m_element_type.GetByteSize(nullptr); - - if (m_element_size > 0) - m_start = m_backend.GetChildMemberWithName(g___begin_,true).get(); // store raw pointers or end up with a circular dependency - - return false; -} - -bool -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (!m_start) - return UINT32_MAX; - return ExtractIndexFromString(name.GetCString()); -} - -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::~LibcxxInitializerListSyntheticFrontEnd () -{ - // this needs to stay around because it's a child object who will follow its parent's life cycle - // delete m_start; -} - -lldb_private::SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibcxxInitializerListSyntheticFrontEnd(valobj_sp)); -} - diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxList.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxList.cpp deleted file mode 100644 index f3e07fe7a017..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxList.cpp +++ /dev/null @@ -1,369 +0,0 @@ -//===-- LibCxxList.cpp -------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -namespace lldb_private { - namespace formatters { - class LibcxxStdListSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdListSyntheticFrontEnd (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 - ~LibcxxStdListSyntheticFrontEnd (); - private: - bool - HasLoop(size_t); - - size_t m_list_capping_size; - static const bool g_use_loop_detect = true; - size_t m_loop_detected; - lldb::addr_t m_node_address; - ValueObject* m_head; - ValueObject* m_tail; - ClangASTType m_element_type; - size_t m_count; - std::map<size_t,lldb::ValueObjectSP> m_children; - }; - } -} - -class ListEntry -{ -public: - ListEntry () {} - ListEntry (ValueObjectSP entry_sp) : m_entry_sp(entry_sp) {} - ListEntry (const ListEntry& rhs) : m_entry_sp(rhs.m_entry_sp) {} - ListEntry (ValueObject* entry) : m_entry_sp(entry ? entry->GetSP() : ValueObjectSP()) {} - - ListEntry - next () - { - if (!m_entry_sp) - return ListEntry(); - return ListEntry(m_entry_sp->GetChildMemberWithName(ConstString("__next_"), true)); - } - - ListEntry - prev () - { - if (!m_entry_sp) - return ListEntry(); - return ListEntry(m_entry_sp->GetChildMemberWithName(ConstString("__prev_"), true)); - } - - uint64_t - value () - { - if (!m_entry_sp) - return 0; - return m_entry_sp->GetValueAsUnsigned(0); - } - - bool - null() - { - return (value() == 0); - } - - explicit operator bool () - { - return GetEntry().get() != nullptr && null() == false; - } - - ValueObjectSP - GetEntry () - { - return m_entry_sp; - } - - void - SetEntry (ValueObjectSP entry) - { - m_entry_sp = entry; - } - - bool - operator == (const ListEntry& rhs) const - { - return (rhs.m_entry_sp.get() == m_entry_sp.get()); - } - -private: - ValueObjectSP m_entry_sp; -}; - -class ListIterator -{ -public: - ListIterator () {} - ListIterator (ListEntry entry) : m_entry(entry) {} - ListIterator (ValueObjectSP entry) : m_entry(entry) {} - ListIterator (const ListIterator& rhs) : m_entry(rhs.m_entry) {} - ListIterator (ValueObject* entry) : m_entry(entry) {} - - ValueObjectSP - value () - { - return m_entry.GetEntry(); - } - - ValueObjectSP - advance (size_t count) - { - if (count == 0) - return m_entry.GetEntry(); - if (count == 1) - { - next (); - return m_entry.GetEntry(); - } - while (count > 0) - { - next (); - count--; - if (m_entry.null()) - return lldb::ValueObjectSP(); - } - return m_entry.GetEntry(); - } - - bool - operator == (const ListIterator& rhs) const - { - return (rhs.m_entry == m_entry); - } - -protected: - void - next () - { - m_entry = m_entry.next(); - } - - void - prev () - { - m_entry = m_entry.prev(); - } -private: - ListEntry m_entry; -}; - -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::LibcxxStdListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_list_capping_size(0), -m_loop_detected(0), -m_node_address(), -m_head(NULL), -m_tail(NULL), -m_element_type(), -m_count(UINT32_MAX), -m_children() -{ - if (valobj_sp) - Update(); -} - -bool -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::HasLoop(size_t count) -{ - 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 = std::min(count,m_count); - auto steps_left_save = steps_left; - ListEntry slow(m_head); - ListEntry fast(m_head); - while (steps_left-- > 0) - { - 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; - } - m_loop_detected = steps_left_save; - return false; -} - -size_t -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::CalculateNumChildren () -{ - if (m_count != UINT32_MAX) - return m_count; - if (!m_head || !m_tail || m_node_address == 0) - return 0; - ValueObjectSP size_alloc(m_backend.GetChildMemberWithName(ConstString("__size_alloc_"), true)); - if (size_alloc) - { - ValueObjectSP first(size_alloc->GetChildMemberWithName(ConstString("__first_"), true)); - if (first) - { - m_count = first->GetValueAsUnsigned(UINT32_MAX); - } - } - if (m_count != UINT32_MAX) - { - return m_count; - } - else - { - uint64_t next_val = m_head->GetValueAsUnsigned(0); - uint64_t prev_val = m_tail->GetValueAsUnsigned(0); - if (next_val == 0 || prev_val == 0) - return 0; - if (next_val == m_node_address) - return 0; - if (next_val == prev_val) - return 1; - uint64_t size = 2; - ListEntry current(m_head); - while (current.next() && current.next().value() != m_node_address) - { - size++; - current = current.next(); - if (size > m_list_capping_size) - break; - } - return m_count = (size-1); - } -} - -lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (idx >= CalculateNumChildren()) - return lldb::ValueObjectSP(); - - if (!m_head || !m_tail || m_node_address == 0) - return lldb::ValueObjectSP(); - - auto cached = m_children.find(idx); - if (cached != m_children.end()) - return cached->second; - - if (m_loop_detected <= idx) - if (HasLoop(idx)) - return lldb::ValueObjectSP(); - - ListIterator current(m_head); - ValueObjectSP current_sp(current.advance(idx)); - if (!current_sp) - return lldb::ValueObjectSP(); - current_sp = current_sp->GetChildMemberWithName(ConstString("__value_"), true); - if (!current_sp) - 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; - Error error; - current_sp->GetData(data, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - return (m_children[idx] = CreateValueObjectFromData(name.GetData(), data, m_backend.GetExecutionContextRef(), m_element_type)); -} - -bool -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::Update() -{ - m_head = m_tail = NULL; - m_node_address = 0; - m_count = UINT32_MAX; - m_loop_detected = false; - Error err; - ValueObjectSP backend_addr(m_backend.AddressOf(err)); - m_list_capping_size = 0; - if (m_backend.GetTargetSP()) - m_list_capping_size = m_backend.GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); - if (m_list_capping_size == 0) - m_list_capping_size = 255; - if (err.Fail() || backend_addr.get() == NULL) - return false; - m_node_address = backend_addr->GetValueAsUnsigned(0); - if (!m_node_address || m_node_address == LLDB_INVALID_ADDRESS) - return false; - ValueObjectSP impl_sp(m_backend.GetChildMemberWithName(ConstString("__end_"),true)); - if (!impl_sp) - return false; - ClangASTType list_type = m_backend.GetClangType(); - if (list_type.IsReferenceType()) - list_type = list_type.GetNonReferenceType(); - - if (list_type.GetNumTemplateArguments() == 0) - return false; - lldb::TemplateArgumentKind kind; - m_element_type = list_type.GetTemplateArgument(0, kind); - m_head = impl_sp->GetChildMemberWithName(ConstString("__next_"), true).get(); - m_tail = impl_sp->GetChildMemberWithName(ConstString("__prev_"), true).get(); - return false; -} - -bool -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - return ExtractIndexFromString(name.GetCString()); -} - -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::~LibcxxStdListSyntheticFrontEnd () -{} - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibcxxStdListSyntheticFrontEnd(valobj_sp)); -} - diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxMap.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxMap.cpp deleted file mode 100644 index 2ff623284845..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxMap.cpp +++ /dev/null @@ -1,452 +0,0 @@ -//===-- LibCxxList.cpp -------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -namespace lldb_private { - namespace formatters { - class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdMapSyntheticFrontEnd (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 - ~LibcxxStdMapSyntheticFrontEnd (); - private: - bool - GetDataType(); - - void - GetValueOffset (const lldb::ValueObjectSP& node); - - ValueObject* m_tree; - ValueObject* m_root_node; - ClangASTType m_element_type; - uint32_t m_skip_size; - size_t m_count; - std::map<size_t,lldb::ValueObjectSP> m_children; - }; - } -} - -class MapEntry -{ -public: - MapEntry () {} - explicit MapEntry (ValueObjectSP entry_sp) : m_entry_sp(entry_sp) {} - MapEntry (const MapEntry& rhs) : m_entry_sp(rhs.m_entry_sp) {} - explicit MapEntry (ValueObject* entry) : m_entry_sp(entry ? entry->GetSP() : ValueObjectSP()) {} - - ValueObjectSP - left () const - { - static ConstString g_left("__left_"); - if (!m_entry_sp) - return m_entry_sp; - return m_entry_sp->GetChildMemberWithName(g_left, true); - } - - ValueObjectSP - right () const - { - static ConstString g_right("__right_"); - if (!m_entry_sp) - return m_entry_sp; - return m_entry_sp->GetChildMemberWithName(g_right, true); - } - - ValueObjectSP - parent () const - { - static ConstString g_parent("__parent_"); - if (!m_entry_sp) - return m_entry_sp; - return m_entry_sp->GetChildMemberWithName(g_parent, true); - } - - uint64_t - value () const - { - if (!m_entry_sp) - return 0; - return m_entry_sp->GetValueAsUnsigned(0); - } - - bool - error () const - { - if (!m_entry_sp) - return true; - return m_entry_sp->GetError().Fail(); - } - - bool - null() const - { - return (value() == 0); - } - - ValueObjectSP - GetEntry () const - { - return m_entry_sp; - } - - void - SetEntry (ValueObjectSP entry) - { - m_entry_sp = entry; - } - - bool - operator == (const MapEntry& rhs) const - { - return (rhs.m_entry_sp.get() == m_entry_sp.get()); - } - -private: - ValueObjectSP m_entry_sp; -}; - -class MapIterator -{ -public: - MapIterator () {} - MapIterator (MapEntry entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {} - MapIterator (ValueObjectSP entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {} - MapIterator (const MapIterator& rhs) : m_entry(rhs.m_entry),m_max_depth(rhs.m_max_depth), m_error(false) {} - MapIterator (ValueObject* entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {} - - ValueObjectSP - value () - { - return m_entry.GetEntry(); - } - - ValueObjectSP - advance (size_t count) - { - ValueObjectSP fail(nullptr); - if (m_error) - return fail; - size_t steps = 0; - while (count > 0) - { - next(); - count--, steps++; - if (m_error || - m_entry.null() || - (steps > m_max_depth)) - return fail; - } - return m_entry.GetEntry(); - } -protected: - void - next () - { - if (m_entry.null()) - return; - MapEntry right(m_entry.right()); - if (right.null() == false) - { - m_entry = tree_min(std::move(right)); - return; - } - size_t steps = 0; - while (!is_left_child(m_entry)) - { - if (m_entry.error()) - { - m_error = true; - return; - } - m_entry.SetEntry(m_entry.parent()); - steps++; - if (steps > m_max_depth) - { - m_entry = MapEntry(); - return; - } - } - m_entry = MapEntry(m_entry.parent()); - } - -private: - MapEntry - tree_min (MapEntry&& x) - { - if (x.null()) - return MapEntry(); - MapEntry left(x.left()); - size_t steps = 0; - while (left.null() == false) - { - if (left.error()) - { - m_error = true; - return MapEntry(); - } - x = left; - left.SetEntry(x.left()); - steps++; - if (steps > m_max_depth) - return MapEntry(); - } - return x; - } - - bool - is_left_child (const MapEntry& x) - { - if (x.null()) - return false; - MapEntry rhs(x.parent()); - rhs.SetEntry(rhs.left()); - return x.value() == rhs.value(); - } - - MapEntry m_entry; - size_t m_max_depth; - bool m_error; -}; - -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_tree(NULL), -m_root_node(NULL), -m_element_type(), -m_skip_size(UINT32_MAX), -m_count(UINT32_MAX), -m_children() -{ - if (valobj_sp) - Update(); -} - -size_t -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::CalculateNumChildren () -{ - if (m_count != UINT32_MAX) - return m_count; - if (m_tree == NULL) - return 0; - ValueObjectSP m_item(m_tree->GetChildMemberWithName(ConstString("__pair3_"), true)); - if (!m_item) - return 0; - m_item = m_item->GetChildMemberWithName(ConstString("__first_"), true); - if (!m_item) - return 0; - m_count = m_item->GetValueAsUnsigned(0); - return m_count; -} - -bool -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetDataType() -{ - if (m_element_type.GetOpaqueQualType() && m_element_type.GetASTContext()) - return true; - m_element_type.Clear(); - ValueObjectSP deref; - Error error; - deref = m_root_node->Dereference(error); - if (!deref || error.Fail()) - return false; - deref = deref->GetChildMemberWithName(ConstString("__value_"), true); - if (!deref) - return false; - m_element_type = deref->GetClangType(); - return true; -} - -void -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetValueOffset (const lldb::ValueObjectSP& node) -{ - if (m_skip_size != UINT32_MAX) - return; - if (!node) - return; - ClangASTType node_type(node->GetClangType()); - uint64_t bit_offset; - if (node_type.GetIndexOfFieldWithName("__value_", NULL, &bit_offset) == UINT32_MAX) - return; - m_skip_size = bit_offset / 8u; -} - -lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - static ConstString g___cc("__cc"); - static ConstString g___nc("__nc"); - - - if (idx >= CalculateNumChildren()) - return lldb::ValueObjectSP(); - if (m_tree == NULL || m_root_node == NULL) - return lldb::ValueObjectSP(); - - auto cached = m_children.find(idx); - if (cached != m_children.end()) - return cached->second; - - bool need_to_skip = (idx > 0); - MapIterator iterator(m_root_node, CalculateNumChildren()); - ValueObjectSP iterated_sp(iterator.advance(idx)); - if (iterated_sp.get() == NULL) - { - // this tree is garbage - stop - m_tree = NULL; // this will stop all future searches until an Update() happens - return iterated_sp; - } - if (GetDataType()) - { - if (!need_to_skip) - { - Error error; - iterated_sp = iterated_sp->Dereference(error); - if (!iterated_sp || error.Fail()) - { - m_tree = NULL; - return lldb::ValueObjectSP(); - } - GetValueOffset(iterated_sp); - iterated_sp = iterated_sp->GetChildMemberWithName(ConstString("__value_"), true); - if (!iterated_sp) - { - m_tree = NULL; - return lldb::ValueObjectSP(); - } - } - else - { - // because of the way our debug info is made, we need to read item 0 first - // so that we can cache information used to generate other elements - if (m_skip_size == UINT32_MAX) - GetChildAtIndex(0); - if (m_skip_size == UINT32_MAX) - { - m_tree = NULL; - return lldb::ValueObjectSP(); - } - iterated_sp = iterated_sp->GetSyntheticChildAtOffset(m_skip_size, m_element_type, true); - if (!iterated_sp) - { - m_tree = NULL; - return lldb::ValueObjectSP(); - } - } - } - else - { - m_tree = NULL; - return lldb::ValueObjectSP(); - } - // 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; - Error error; - iterated_sp->GetData(data, error); - if (error.Fail()) - { - m_tree = NULL; - return lldb::ValueObjectSP(); - } - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - auto potential_child_sp = CreateValueObjectFromData(name.GetData(), data, m_backend.GetExecutionContextRef(), m_element_type); - if (potential_child_sp) - { - switch (potential_child_sp->GetNumChildren()) - { - case 1: - { - auto child0_sp = potential_child_sp->GetChildAtIndex(0, true); - if (child0_sp && child0_sp->GetName() == g___cc) - potential_child_sp = child0_sp; - break; - } - case 2: - { - auto child0_sp = potential_child_sp->GetChildAtIndex(0, true); - auto child1_sp = potential_child_sp->GetChildAtIndex(1, true); - if (child0_sp && child0_sp->GetName() == g___cc && - child1_sp && child1_sp->GetName() == g___nc) - potential_child_sp = child0_sp; - break; - } - } - potential_child_sp->SetName(ConstString(name.GetData())); - } - return (m_children[idx] = potential_child_sp); -} - -bool -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::Update() -{ - m_count = UINT32_MAX; - m_tree = m_root_node = NULL; - m_children.clear(); - m_tree = m_backend.GetChildMemberWithName(ConstString("__tree_"), true).get(); - if (!m_tree) - return false; - m_root_node = m_tree->GetChildMemberWithName(ConstString("__begin_node_"), true).get(); - return false; -} - -bool -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - return ExtractIndexFromString(name.GetCString()); -} - -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::~LibcxxStdMapSyntheticFrontEnd () -{} - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibcxxStdMapSyntheticFrontEnd(valobj_sp)); -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp deleted file mode 100644 index 43669803195e..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp +++ /dev/null @@ -1,172 +0,0 @@ -//===-- LibCxxUnorderedMap.cpp -----------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -namespace lldb_private { - namespace formatters { - class LibcxxStdUnorderedMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdUnorderedMapSyntheticFrontEnd (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 - ~LibcxxStdUnorderedMapSyntheticFrontEnd (); - private: - - ValueObject* m_tree; - size_t m_num_elements; - ValueObject* m_next_element; - std::map<size_t,lldb::ValueObjectSP> m_children; - std::vector<std::pair<ValueObject*, uint64_t> > m_elements_cache; - }; - } -} - -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::LibcxxStdUnorderedMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_tree(NULL), -m_num_elements(0), -m_next_element(nullptr), -m_children(), -m_elements_cache() -{ - if (valobj_sp) - Update(); -} - -size_t -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::CalculateNumChildren () -{ - if (m_num_elements != UINT32_MAX) - return m_num_elements; - return 0; -} - -lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (idx >= CalculateNumChildren()) - return lldb::ValueObjectSP(); - if (m_tree == NULL) - return lldb::ValueObjectSP(); - - auto cached = m_children.find(idx); - if (cached != m_children.end()) - return cached->second; - - while (idx >= m_elements_cache.size()) - { - if (m_next_element == nullptr) - return lldb::ValueObjectSP(); - - Error error; - ValueObjectSP node_sp = m_next_element->Dereference(error); - if (!node_sp || error.Fail()) - return lldb::ValueObjectSP(); - - ValueObjectSP value_sp = node_sp->GetChildMemberWithName(ConstString("__value_"), true); - ValueObjectSP hash_sp = node_sp->GetChildMemberWithName(ConstString("__hash_"), true); - if (!hash_sp || !value_sp) - return lldb::ValueObjectSP(); - m_elements_cache.push_back({value_sp.get(),hash_sp->GetValueAsUnsigned(0)}); - m_next_element = node_sp->GetChildMemberWithName(ConstString("__next_"),true).get(); - if (!m_next_element || m_next_element->GetValueAsUnsigned(0) == 0) - m_next_element = nullptr; - } - - std::pair<ValueObject*, uint64_t> val_hash = m_elements_cache[idx]; - if (!val_hash.first) - return lldb::ValueObjectSP(); - StreamString stream; - stream.Printf("[%" PRIu64 "]", (uint64_t)idx); - DataExtractor 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(), - data, - exe_ctx, - val_hash.first->GetClangType()); -} - -bool -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::Update() -{ - m_num_elements = UINT32_MAX; - m_next_element = nullptr; - m_elements_cache.clear(); - m_children.clear(); - ValueObjectSP table_sp = m_backend.GetChildMemberWithName(ConstString("__table_"), true); - if (!table_sp) - return false; - ValueObjectSP num_elements_sp = table_sp->GetChildAtNamePath({ConstString("__p2_"),ConstString("__first_")}); - if (!num_elements_sp) - return false; - m_num_elements = num_elements_sp->GetValueAsUnsigned(0); - m_tree = table_sp->GetChildAtNamePath({ConstString("__p1_"),ConstString("__first_"),ConstString("__next_")}).get(); - if (m_num_elements > 0) - m_next_element = table_sp->GetChildAtNamePath({ConstString("__p1_"),ConstString("__first_"),ConstString("__next_")}).get(); - return false; -} - -bool -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - return ExtractIndexFromString(name.GetCString()); -} - -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::~LibcxxStdUnorderedMapSyntheticFrontEnd () -{} - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibcxxStdUnorderedMapSyntheticFrontEnd(valobj_sp)); -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxVector.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxVector.cpp deleted file mode 100644 index 6ccb732f6779..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibCxxVector.cpp +++ /dev/null @@ -1,155 +0,0 @@ -//===-- LibCxxVector.cpp -----------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/ConstString.h" -#include "lldb/Core/ValueObject.h" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -namespace lldb_private { - namespace formatters { - class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdVectorSyntheticFrontEnd (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 - ~LibcxxStdVectorSyntheticFrontEnd (); - private: - ValueObject* m_start; - ValueObject* m_finish; - ClangASTType m_element_type; - uint32_t m_element_size; - std::map<size_t,lldb::ValueObjectSP> m_children; - }; - } -} - -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::LibcxxStdVectorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_start(NULL), -m_finish(NULL), -m_element_type(), -m_element_size(0), -m_children() -{ - if (valobj_sp) - Update(); -} - -size_t -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_start || !m_finish) - return 0; - uint64_t start_val = m_start->GetValueAsUnsigned(0); - uint64_t finish_val = m_finish->GetValueAsUnsigned(0); - - if (start_val == 0 || finish_val == 0) - return 0; - - if (start_val >= finish_val) - return 0; - - size_t num_children = (finish_val - start_val); - if (num_children % m_element_size) - return 0; - return num_children/m_element_size; -} - -lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (!m_start || !m_finish) - return lldb::ValueObjectSP(); - - auto cached = m_children.find(idx); - if (cached != m_children.end()) - return cached->second; - - uint64_t offset = idx * m_element_size; - offset = offset + m_start->GetValueAsUnsigned(0); - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - ValueObjectSP child_sp = CreateValueObjectFromAddress(name.GetData(), offset, m_backend.GetExecutionContextRef(), m_element_type); - m_children[idx] = child_sp; - return child_sp; -} - -bool -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::Update() -{ - m_start = m_finish = NULL; - m_children.clear(); - ValueObjectSP data_type_finder_sp(m_backend.GetChildMemberWithName(ConstString("__end_cap_"),true)); - if (!data_type_finder_sp) - return false; - data_type_finder_sp = data_type_finder_sp->GetChildMemberWithName(ConstString("__first_"),true); - if (!data_type_finder_sp) - return false; - m_element_type = data_type_finder_sp->GetClangType().GetPointeeType(); - m_element_size = m_element_type.GetByteSize(nullptr); - - if (m_element_size > 0) - { - // store raw pointers or end up with a circular dependency - m_start = m_backend.GetChildMemberWithName(ConstString("__begin_"),true).get(); - m_finish = m_backend.GetChildMemberWithName(ConstString("__end_"),true).get(); - } - return false; -} - -bool -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (!m_start || !m_finish) - return UINT32_MAX; - return ExtractIndexFromString(name.GetCString()); -} - -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::~LibcxxStdVectorSyntheticFrontEnd () -{ - // these need to stay around because they are child objects who will follow their parent's life cycle - // delete m_start; - // delete m_finish; -} - -lldb_private::SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibcxxStdVectorSyntheticFrontEnd(valobj_sp)); -} - diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/LibStdcpp.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/LibStdcpp.cpp deleted file mode 100644 index 2b3bcb58afac..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/LibStdcpp.cpp +++ /dev/null @@ -1,160 +0,0 @@ -//===-- LibStdcpp.cpp ---------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -/* - (std::_Rb_tree_iterator<std::pair<const int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >) ibeg = { - (_Base_ptr) _M_node = 0x0000000100103910 { - (std::_Rb_tree_color) _M_color = _S_black - (std::_Rb_tree_node_base::_Base_ptr) _M_parent = 0x00000001001038c0 - (std::_Rb_tree_node_base::_Base_ptr) _M_left = 0x0000000000000000 - (std::_Rb_tree_node_base::_Base_ptr) _M_right = 0x0000000000000000 - } - } - */ - -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp.get()), - m_exe_ctx_ref(), - m_pair_address(0), - m_pair_type(), - m_options(), - m_pair_sp() -{ - if (valobj_sp) - Update(); - m_options.SetCoerceToId(false); - m_options.SetUnwindOnError(true); - m_options.SetKeepInMemory(true); - m_options.SetUseDynamic(lldb::eDynamicCanRunTarget); -} - -bool -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::Update() -{ - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - - TargetSP target_sp(valobj_sp->GetTargetSP()); - - if (!target_sp) - return false; - - bool is_64bit = (target_sp->GetArchitecture().GetAddressByteSize() == 8); - - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - - ValueObjectSP _M_node_sp(valobj_sp->GetChildMemberWithName(ConstString("_M_node"), true)); - if (!_M_node_sp) - return false; - - m_pair_address = _M_node_sp->GetValueAsUnsigned(0); - if (m_pair_address == 0) - return false; - - m_pair_address += (is_64bit ? 32 : 16); - - ClangASTType my_type(valobj_sp->GetClangType()); - if (my_type.GetNumTemplateArguments() >= 1) - { - TemplateArgumentKind kind; - ClangASTType pair_type = my_type.GetTemplateArgument(0, kind); - if (kind != eTemplateArgumentKindType && kind != eTemplateArgumentKindTemplate && kind != eTemplateArgumentKindTemplateExpansion) - return false; - m_pair_type = pair_type; - } - else - return false; - - return true; -} - -size_t -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::CalculateNumChildren () -{ - return 2; -} - -lldb::ValueObjectSP -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (m_pair_address != 0 && m_pair_type) - { - if (!m_pair_sp) - m_pair_sp = CreateValueObjectFromAddress("pair", m_pair_address, m_exe_ctx_ref, m_pair_type); - if (m_pair_sp) - return m_pair_sp->GetChildAtIndex(idx, true); - } - return lldb::ValueObjectSP(); -} - -bool -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (name == ConstString("first")) - return 0; - if (name == ConstString("second")) - return 1; - return UINT32_MAX; -} - -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::~LibstdcppMapIteratorSyntheticFrontEnd () -{} - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return NULL; - return (new LibstdcppMapIteratorSyntheticFrontEnd(valobj_sp)); -} - -/* - (lldb) fr var ibeg --ptr-depth 1 - (__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >) ibeg = { - _M_current = 0x00000001001037a0 { - *_M_current = 1 - } - } - */ - -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - static ConstString g_item_name; - if (!g_item_name) - g_item_name.SetCString("_M_current"); - if (!valobj_sp) - return NULL; - return (new VectorIteratorSyntheticFrontEnd(valobj_sp,g_item_name)); -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/NSDictionary.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/NSDictionary.cpp deleted file mode 100644 index 30bc3acfbec7..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/NSDictionary.cpp +++ /dev/null @@ -1,702 +0,0 @@ -//===-- NSDictionary.cpp ------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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 "clang/AST/DeclCXX.h" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -static ClangASTType -GetLLDBNSPairType (TargetSP target_sp) -{ - ClangASTType clang_type; - - ClangASTContext *target_ast_context = target_sp->GetScratchClangASTContext(); - - if (target_ast_context) - { - ConstString g___lldb_autogen_nspair("__lldb_autogen_nspair"); - - clang_type = target_ast_context->GetTypeForIdentifier<clang::CXXRecordDecl>(g___lldb_autogen_nspair); - - if (!clang_type) - { - clang_type = target_ast_context->CreateRecordType(NULL, lldb::eAccessPublic, g___lldb_autogen_nspair.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC); - - if (clang_type) - { - clang_type.StartTagDeclarationDefinition(); - ClangASTType id_clang_type = target_ast_context->GetBasicType (eBasicTypeObjCID); - clang_type.AddFieldToRecordType("key", id_clang_type, lldb::eAccessPublic, 0); - clang_type.AddFieldToRecordType("value", id_clang_type, lldb::eAccessPublic, 0); - clang_type.CompleteTagDeclarationDefinition(); - } - } - } - return clang_type; -} - -namespace lldb_private { - namespace formatters { - class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - private: - struct DataDescriptor_32 - { - uint32_t _used : 26; - uint32_t _szidx : 6; - }; - struct DataDescriptor_64 - { - uint64_t _used : 58; - uint32_t _szidx : 6; - }; - - struct DictionaryItemDescriptor - { - lldb::addr_t key_ptr; - lldb::addr_t val_ptr; - lldb::ValueObjectSP valobj_sp; - }; - - public: - NSDictionaryISyntheticFrontEnd (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 - ~NSDictionaryISyntheticFrontEnd (); - private: - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - lldb::ByteOrder m_order; - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - lldb::addr_t m_data_ptr; - ClangASTType m_pair_type; - std::vector<DictionaryItemDescriptor> m_children; - }; - - class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - private: - struct DataDescriptor_32 - { - uint32_t _used : 26; - uint32_t _kvo : 1; - uint32_t _size; - uint32_t _mutations; - uint32_t _objs_addr; - uint32_t _keys_addr; - }; - struct DataDescriptor_64 - { - uint64_t _used : 58; - uint32_t _kvo : 1; - uint64_t _size; - uint64_t _mutations; - uint64_t _objs_addr; - uint64_t _keys_addr; - }; - struct DictionaryItemDescriptor - { - lldb::addr_t key_ptr; - lldb::addr_t val_ptr; - lldb::ValueObjectSP valobj_sp; - }; - public: - NSDictionaryMSyntheticFrontEnd (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 - ~NSDictionaryMSyntheticFrontEnd (); - private: - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - lldb::ByteOrder m_order; - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - ClangASTType m_pair_type; - std::vector<DictionaryItemDescriptor> m_children; - }; - - class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSDictionaryCodeRunningSyntheticFrontEnd (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 - ~NSDictionaryCodeRunningSyntheticFrontEnd (); - }; - } -} - -template<bool name_entries> -bool -lldb_private::formatters::NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - bool is_64bit = (ptr_size == 8); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint64_t value = 0; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"__NSDictionaryI")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); - } - else if (!strcmp(class_name,"__NSDictionaryM")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); - } - /*else if (!strcmp(class_name,"__NSCFDictionary")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), 4, 0, error); - if (error.Fail()) - return false; - if (is_64bit) - value &= ~0x0f1f000000000000UL; - }*/ - else - { - if (!ExtractValueFromObjCExpression(valobj, "int", "count", value)) - return false; - } - - stream.Printf("%s%" PRIu64 " %s%s", - (name_entries ? "@\"" : ""), - value, - (name_entries ? (value == 1 ? "entry" : "entries") : (value == 1 ? "key/value pair" : "key/value pairs")), - (name_entries ? "\"" : "")); - return true; -} - -SyntheticChildrenFrontEnd* lldb_private::formatters::NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - - lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); - if (!process_sp) - return NULL; - ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - if (!runtime) - return NULL; - - if (!valobj_sp->IsPointerType()) - { - Error error; - valobj_sp = valobj_sp->AddressOf(error); - if (error.Fail() || !valobj_sp) - return NULL; - } - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); - - if (!descriptor.get() || !descriptor->IsValid()) - return NULL; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return NULL; - - if (!strcmp(class_name,"__NSDictionaryI")) - { - return (new NSDictionaryISyntheticFrontEnd(valobj_sp)); - } - else if (!strcmp(class_name,"__NSDictionaryM")) - { - return (new NSDictionaryMSyntheticFrontEnd(valobj_sp)); - } - else - { - return (new NSDictionaryCodeRunningSyntheticFrontEnd(valobj_sp)); - } -} - -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()) -{} - -size_t -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::CalculateNumChildren () -{ - uint64_t count = 0; - if (ExtractValueFromObjCExpression(m_backend, "int", "count", count)) - return count; - return 0; -} - -lldb::ValueObjectSP -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - StreamString key_fetcher_expr; - 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; - object_fetcher_expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = %s; _lldb_valgen_item.value = %s; _lldb_valgen_item;",key_fetcher_expr.GetData(),value_fetcher_expr.GetData()); - lldb::ValueObjectSP child_sp; - EvaluateExpressionOptions options; - options.SetKeepInMemory(true); - 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())); - return child_sp; -} - -bool -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::Update() -{ - return false; -} - -bool -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - return 0; -} - -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::~NSDictionaryCodeRunningSyntheticFrontEnd () -{} - -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_exe_ctx_ref(), -m_ptr_size(8), -m_order(lldb::eByteOrderInvalid), -m_data_32(NULL), -m_data_64(NULL), -m_pair_type() -{ -} - -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::~NSDictionaryISyntheticFrontEnd () -{ - delete m_data_32; - m_data_32 = NULL; - delete m_data_64; - m_data_64 = NULL; -} - -size_t -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; -} - -size_t -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_data_32 && !m_data_64) - return 0; - return (m_data_32 ? m_data_32->_used : m_data_64->_used); -} - -bool -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update() -{ - m_children.clear(); - delete m_data_32; - m_data_32 = NULL; - delete m_data_64; - m_data_64 = NULL; - m_ptr_size = 0; - ValueObjectSP valobj_sp = m_backend.GetSP(); - 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(); - m_order = process_sp->GetByteOrder(); - 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; - m_data_ptr = data_location + m_ptr_size; - return false; -} - -bool -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -lldb::ValueObjectSP -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - uint32_t num_children = CalculateNumChildren(); - - if (idx >= num_children) - return lldb::ValueObjectSP(); - - if (m_children.empty()) - { - // do the scan phase - lldb::addr_t key_at_idx = 0, val_at_idx = 0; - - uint32_t tries = 0; - uint32_t test_idx = 0; - - while(tries < num_children) - { - key_at_idx = m_data_ptr + (2*test_idx * m_ptr_size); - val_at_idx = key_at_idx + m_ptr_size; - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - test_idx++; - - if (!key_at_idx || !val_at_idx) - continue; - tries++; - - DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()}; - - m_children.push_back(descriptor); - } - } - - if (idx >= m_children.size()) // should never happen - return lldb::ValueObjectSP(); - - DictionaryItemDescriptor &dict_item = m_children[idx]; - if (!dict_item.valobj_sp) - { - if (!m_pair_type.IsValid()) - { - TargetSP target_sp(m_backend.GetTargetSP()); - if (!target_sp) - return ValueObjectSP(); - m_pair_type = GetLLDBNSPairType(target_sp); - } - if (!m_pair_type.IsValid()) - return ValueObjectSP(); - - DataBufferSP buffer_sp(new DataBufferHeap(2*m_ptr_size,0)); - - if (m_ptr_size == 8) - { - uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); - *data_ptr = dict_item.key_ptr; - *(data_ptr+1) = dict_item.val_ptr; - } - else - { - uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); - *data_ptr = dict_item.key_ptr; - *(data_ptr+1) = dict_item.val_ptr; - } - - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - DataExtractor data(buffer_sp, m_order, m_ptr_size); - dict_item.valobj_sp = CreateValueObjectFromData(idx_name.GetData(), - data, - m_exe_ctx_ref, - m_pair_type); - } - return dict_item.valobj_sp; -} - -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_exe_ctx_ref(), -m_ptr_size(8), -m_order(lldb::eByteOrderInvalid), -m_data_32(NULL), -m_data_64(NULL), -m_pair_type() -{ -} - -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::~NSDictionaryMSyntheticFrontEnd () -{ - delete m_data_32; - m_data_32 = NULL; - delete m_data_64; - m_data_64 = NULL; -} - -size_t -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; -} - -size_t -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_data_32 && !m_data_64) - return 0; - return (m_data_32 ? m_data_32->_used : m_data_64->_used); -} - -bool -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::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(); - m_order = process_sp->GetByteOrder(); - 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::NSDictionaryMSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -lldb::ValueObjectSP -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - lldb::addr_t m_keys_ptr = (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr); - lldb::addr_t m_values_ptr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr); - - uint32_t num_children = CalculateNumChildren(); - - if (idx >= num_children) - return lldb::ValueObjectSP(); - - if (m_children.empty()) - { - // do the scan phase - lldb::addr_t key_at_idx = 0, val_at_idx = 0; - - uint32_t tries = 0; - uint32_t test_idx = 0; - - while(tries < num_children) - { - key_at_idx = m_keys_ptr + (test_idx * m_ptr_size); - val_at_idx = m_values_ptr + (test_idx * m_ptr_size);; - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - test_idx++; - - if (!key_at_idx || !val_at_idx) - continue; - tries++; - - DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()}; - - m_children.push_back(descriptor); - } - } - - if (idx >= m_children.size()) // should never happen - return lldb::ValueObjectSP(); - - DictionaryItemDescriptor &dict_item = m_children[idx]; - if (!dict_item.valobj_sp) - { - if (!m_pair_type.IsValid()) - { - TargetSP target_sp(m_backend.GetTargetSP()); - if (!target_sp) - return ValueObjectSP(); - m_pair_type = GetLLDBNSPairType(target_sp); - } - if (!m_pair_type.IsValid()) - return ValueObjectSP(); - - DataBufferSP buffer_sp(new DataBufferHeap(2*m_ptr_size,0)); - - if (m_ptr_size == 8) - { - uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); - *data_ptr = dict_item.key_ptr; - *(data_ptr+1) = dict_item.val_ptr; - } - else - { - uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); - *data_ptr = dict_item.key_ptr; - *(data_ptr+1) = dict_item.val_ptr; - } - - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - DataExtractor data(buffer_sp, m_order, m_ptr_size); - dict_item.valobj_sp = CreateValueObjectFromData(idx_name.GetData(), - data, - m_exe_ctx_ref, - m_pair_type); - } - return dict_item.valobj_sp; -} - -template bool -lldb_private::formatters::NSDictionarySummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&) ; - -template bool -lldb_private::formatters::NSDictionarySummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&) ; diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/NSIndexPath.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/NSIndexPath.cpp deleted file mode 100644 index 363bd5c0527e..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/NSIndexPath.cpp +++ /dev/null @@ -1,338 +0,0 @@ -//===-- NSIndexPath.cpp ------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/ValueObject.h" -#include "lldb/Core/ValueObjectConstResult.h" -#include "lldb/DataFormatters/TypeSynthetic.h" -#include "lldb/Target/ObjCLanguageRuntime.h" -#include "lldb/Target/Process.h" -#include "lldb/Symbol/ClangASTContext.h" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -class NSIndexPathSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ -public: - NSIndexPathSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd (*valobj_sp.get()), - m_ptr_size(0), - m_ast_ctx(nullptr), - m_uint_star_type() - { - m_ptr_size = m_backend.GetTargetSP()->GetArchitecture().GetAddressByteSize(); - } - - virtual size_t - CalculateNumChildren () - { - return m_impl.GetNumIndexes(); - } - - virtual lldb::ValueObjectSP - GetChildAtIndex (size_t idx) - { - return m_impl.GetIndexAtIndex(idx, m_uint_star_type); - } - - virtual bool - Update() - { - m_impl.Clear(); - - m_ast_ctx = ClangASTContext::GetASTContext(m_backend.GetClangType().GetASTContext()); - if (!m_ast_ctx) - return false; - - m_uint_star_type = m_ast_ctx->GetPointerSizedIntType(false); - - static ConstString g__indexes("_indexes"); - static ConstString g__length("_length"); - - ProcessSP process_sp = m_backend.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(m_backend)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint64_t info_bits(0),value_bits(0),payload(0); - - if (descriptor->GetTaggedPointerInfo(&info_bits, &value_bits, &payload)) - { - m_impl.m_inlined.SetIndexes(payload, *process_sp); - m_impl.m_mode = Mode::Inlined; - } - else - { - ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _indexes_id; - ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _length_id; - - bool has_indexes(false),has_length(false); - - for (size_t x = 0; - x < descriptor->GetNumIVars(); - x++) - { - const auto& ivar = descriptor->GetIVarAtIndex(x); - if (ivar.m_name == g__indexes) - { - _indexes_id = ivar; - has_indexes = true; - } - else if (ivar.m_name == g__length) - { - _length_id = ivar; - has_length = true; - } - - if (has_length && has_indexes) - break; - } - - if (has_length && has_indexes) - { - m_impl.m_outsourced.m_indexes = m_backend.GetSyntheticChildAtOffset(_indexes_id.m_offset, - m_uint_star_type.GetPointerType(), - true).get(); - ValueObjectSP length_sp(m_backend.GetSyntheticChildAtOffset(_length_id.m_offset, - m_uint_star_type, - true)); - if (length_sp) - { - m_impl.m_outsourced.m_count = length_sp->GetValueAsUnsigned(0); - if (m_impl.m_outsourced.m_indexes) - m_impl.m_mode = Mode::Outsourced; - } - } - } - return false; - } - - virtual bool - MightHaveChildren () - { - if (m_impl.m_mode == Mode::Invalid) - return false; - return true; - } - - virtual size_t - GetIndexOfChildWithName (const ConstString &name) - { - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; - } - - virtual lldb::ValueObjectSP - GetSyntheticValue () { return nullptr; } - - virtual - ~NSIndexPathSyntheticFrontEnd () {} - -protected: - ObjCLanguageRuntime::ClassDescriptorSP m_descriptor_sp; - - enum class Mode { - Inlined, - Outsourced, - Invalid - }; - - struct Impl { - Mode m_mode; - - size_t - GetNumIndexes () - { - switch (m_mode) - { - case Mode::Inlined: - return m_inlined.GetNumIndexes(); - case Mode::Outsourced: - return m_outsourced.m_count; - default: - return 0; - } - } - - lldb::ValueObjectSP - GetIndexAtIndex (size_t idx, const ClangASTType& desired_type) - { - if (idx >= GetNumIndexes()) - return nullptr; - switch (m_mode) - { - default: return nullptr; - case Mode::Inlined: - return m_inlined.GetIndexAtIndex (idx, desired_type); - case Mode::Outsourced: - return m_outsourced.GetIndexAtIndex (idx); - } - } - - struct InlinedIndexes { - public: - void SetIndexes(uint64_t value, Process& p) - { - m_indexes = value; - _lengthForInlinePayload(p.GetAddressByteSize()); - m_process = &p; - } - - size_t - GetNumIndexes () - { - return m_count; - } - - lldb::ValueObjectSP - GetIndexAtIndex (size_t idx, const ClangASTType& desired_type) - { - std::pair<uint64_t, bool> value(_indexAtPositionForInlinePayload(idx)); - if (!value.second) - return nullptr; - - Value v; - if (m_ptr_size == 8) - { - Scalar scalar( (unsigned long long)value.first ); - v = Value(scalar); - } - else - { - Scalar scalar( (unsigned int)value.first ); - v = Value(scalar); - } - - v.SetClangType(desired_type); - - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - - return ValueObjectConstResult::Create(m_process, v, ConstString(idx_name.GetData())); - } - - void - Clear () - { - m_indexes = 0; - m_count = 0; - m_ptr_size = 0; - m_process = nullptr; - } - - private: - uint64_t m_indexes; - size_t m_count; - uint32_t m_ptr_size; - Process *m_process; - - // cfr. Foundation for the details of this code - size_t _lengthForInlinePayload(uint32_t ptr_size) { - m_ptr_size = ptr_size; - if (m_ptr_size == 8) - m_count = ((m_indexes >> 3) & 0x7); - else - m_count = ((m_indexes >> 3) & 0x3); - return m_count; - } - - std::pair<uint64_t, bool> - _indexAtPositionForInlinePayload(size_t pos) - { - if (m_ptr_size == 8) - { - switch (pos) { - case 5: return {((m_indexes >> 51) & 0x1ff),true}; - case 4: return {((m_indexes >> 42) & 0x1ff),true}; - case 3: return {((m_indexes >> 33) & 0x1ff),true}; - case 2: return {((m_indexes >> 24) & 0x1ff),true}; - case 1: return {((m_indexes >> 15) & 0x1ff),true}; - case 0: return {((m_indexes >> 6) & 0x1ff),true}; - } - } - else - { - switch (pos) { - case 2: return {((m_indexes >> 23) & 0x1ff),true}; - case 1: return {((m_indexes >> 14) & 0x1ff),true}; - case 0: return {((m_indexes >> 5) & 0x1ff),true}; - } - } - return {0,false}; - } - - }; - struct OutsourcedIndexes { - ValueObject *m_indexes; - size_t m_count; - - lldb::ValueObjectSP - GetIndexAtIndex (size_t idx) - { - if (m_indexes) - { - ValueObjectSP index_sp(m_indexes->GetSyntheticArrayMember(idx, true)); - return index_sp; - } - return nullptr; - } - - void - Clear () - { - m_indexes = nullptr; - m_count = 0; - } - }; - - union { - struct InlinedIndexes m_inlined; - struct OutsourcedIndexes m_outsourced; - }; - - void - Clear () - { - m_mode = Mode::Invalid; - m_inlined.Clear(); - m_outsourced.Clear(); - } - } m_impl; - - uint32_t m_ptr_size; - ClangASTContext* m_ast_ctx; - ClangASTType m_uint_star_type; -}; - -namespace lldb_private { - namespace formatters { - - SyntheticChildrenFrontEnd* NSIndexPathSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) - { - if (valobj_sp) - return new NSIndexPathSyntheticFrontEnd(valobj_sp); - return nullptr; - } - } -} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/NSSet.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/NSSet.cpp deleted file mode 100644 index 116904ce99b4..000000000000 --- a/contrib/llvm/tools/lldb/source/DataFormatters/NSSet.cpp +++ /dev/null @@ -1,717 +0,0 @@ -//===-- NSSet.cpp ------------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#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" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -namespace lldb_private { - namespace formatters { - class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - private: - struct DataDescriptor_32 - { - uint32_t _used : 26; - uint32_t _szidx : 6; - }; - struct DataDescriptor_64 - { - uint64_t _used : 58; - uint32_t _szidx : 6; - }; - - struct SetItemDescriptor - { - lldb::addr_t item_ptr; - lldb::ValueObjectSP valobj_sp; - }; - - public: - NSSetISyntheticFrontEnd (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 - ~NSSetISyntheticFrontEnd (); - private: - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - lldb::addr_t m_data_ptr; - std::vector<SetItemDescriptor> m_children; - }; - - class NSOrderedSetSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - private: - - public: - NSOrderedSetSyntheticFrontEnd (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 - ~NSOrderedSetSyntheticFrontEnd (); - private: - uint32_t m_count; - std::map<uint32_t,lldb::ValueObjectSP> m_children; - }; - - class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - private: - struct DataDescriptor_32 - { - uint32_t _used : 26; - uint32_t _size; - uint32_t _mutations; - uint32_t _objs_addr; - }; - struct DataDescriptor_64 - { - uint64_t _used : 58; - uint64_t _size; - uint64_t _mutations; - uint64_t _objs_addr; - }; - struct SetItemDescriptor - { - lldb::addr_t item_ptr; - lldb::ValueObjectSP valobj_sp; - }; - public: - NSSetMSyntheticFrontEnd (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 - ~NSSetMSyntheticFrontEnd (); - private: - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - std::vector<SetItemDescriptor> m_children; - }; - - class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSSetCodeRunningSyntheticFrontEnd (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 - ~NSSetCodeRunningSyntheticFrontEnd (); - }; - } -} - -template<bool cf_style> -bool -lldb_private::formatters::NSSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - bool is_64bit = (ptr_size == 8); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint64_t value = 0; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"__NSSetI")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); - } - else if (!strcmp(class_name,"__NSSetM")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); - } - /*else if (!strcmp(class_name,"__NSCFSet")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), 4, 0, error); - if (error.Fail()) - return false; - if (is_64bit) - value &= ~0x1fff000000000000UL; - } - else if (!strcmp(class_name,"NSCountedSet")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value = process_sp->ReadUnsignedIntegerFromMemory(value + (is_64bit ? 20 : 12), 4, 0, error); - if (error.Fail()) - return false; - if (is_64bit) - value &= ~0x1fff000000000000UL; - }*/ - else - { - if (!ExtractValueFromObjCExpression(valobj, "int", "count", value)) - return false; - } - - stream.Printf("%s%" PRIu64 " %s%s", - (cf_style ? "@\"" : ""), - value, - (cf_style ? (value == 1 ? "value" : "values") : (value == 1 ? "object" : "objects")), - (cf_style ? "\"" : "")); - return true; -} - -SyntheticChildrenFrontEnd* lldb_private::formatters::NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); - if (!process_sp) - return NULL; - ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - if (!runtime) - return NULL; - - if (!valobj_sp->IsPointerType()) - { - Error error; - valobj_sp = valobj_sp->AddressOf(error); - if (error.Fail() || !valobj_sp) - return NULL; - } - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); - - if (!descriptor.get() || !descriptor->IsValid()) - return NULL; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return NULL; - - if (!strcmp(class_name,"__NSSetI")) - { - return (new NSSetISyntheticFrontEnd(valobj_sp)); - } - else if (!strcmp(class_name,"__NSSetM")) - { - return (new NSSetMSyntheticFrontEnd(valobj_sp)); - } - else if ((!strcmp(class_name,"__NSOrderedSetI")) || (!strcmp(class_name,"__NSOrderedSetM"))) - { - return new NSOrderedSetSyntheticFrontEnd(valobj_sp); // this runs code - } - else - { - return /*(new NSSetCodeRunningSyntheticFrontEnd(valobj_sp))*/ NULL; - } -} - -lldb_private::formatters::NSSetISyntheticFrontEnd::NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_exe_ctx_ref(), -m_ptr_size(8), -m_data_32(NULL), -m_data_64(NULL) -{ - if (valobj_sp) - Update(); -} - -lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd () -{ - delete m_data_32; - m_data_32 = NULL; - delete m_data_64; - m_data_64 = NULL; -} - -size_t -lldb_private::formatters::NSSetISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; -} - -size_t -lldb_private::formatters::NSSetISyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_data_32 && !m_data_64) - return 0; - return (m_data_32 ? m_data_32->_used : m_data_64->_used); -} - -bool -lldb_private::formatters::NSSetISyntheticFrontEnd::Update() -{ - m_children.clear(); - delete m_data_32; - m_data_32 = NULL; - delete m_data_64; - m_data_64 = NULL; - m_ptr_size = 0; - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - Error error; - if (valobj_sp->IsPointerType()) - { - valobj_sp = valobj_sp->Dereference(error); - if (error.Fail() || !valobj_sp) - return false; - } - 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->GetAddressOf() + 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; - m_data_ptr = data_location + m_ptr_size; - return false; -} - -bool -lldb_private::formatters::NSSetISyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -lldb::ValueObjectSP -lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - uint32_t num_children = CalculateNumChildren(); - - if (idx >= num_children) - return lldb::ValueObjectSP(); - - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) - return lldb::ValueObjectSP(); - - if (m_children.empty()) - { - // do the scan phase - lldb::addr_t obj_at_idx = 0; - - uint32_t tries = 0; - uint32_t test_idx = 0; - - while(tries < num_children) - { - obj_at_idx = m_data_ptr + (test_idx * m_ptr_size); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - test_idx++; - - if (!obj_at_idx) - continue; - tries++; - - SetItemDescriptor descriptor = {obj_at_idx,lldb::ValueObjectSP()}; - - m_children.push_back(descriptor); - } - } - - if (idx >= m_children.size()) // should never happen - return lldb::ValueObjectSP(); - - SetItemDescriptor &set_item = m_children[idx]; - if (!set_item.valobj_sp) - { - auto ptr_size = process_sp->GetAddressByteSize(); - DataBufferHeap buffer(ptr_size,0); - switch (ptr_size) - { - case 0: // architecture has no clue?? - fail - return lldb::ValueObjectSP(); - case 4: - *((uint32_t*)buffer.GetBytes()) = (uint32_t)set_item.item_ptr; - break; - case 8: - *((uint64_t*)buffer.GetBytes()) = (uint64_t)set_item.item_ptr; - break; - default: - assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); - } - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - - DataExtractor data(buffer.GetBytes(), - buffer.GetByteSize(), - process_sp->GetByteOrder(), - process_sp->GetAddressByteSize()); - - set_item.valobj_sp = - CreateValueObjectFromData(idx_name.GetData(), - data, - m_exe_ctx_ref, - m_backend.GetClangType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID)); - } - return set_item.valobj_sp; -} - -lldb_private::formatters::NSSetMSyntheticFrontEnd::NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_exe_ctx_ref(), -m_ptr_size(8), -m_data_32(NULL), -m_data_64(NULL) -{ - if (valobj_sp) - Update (); -} - -lldb_private::formatters::NSSetMSyntheticFrontEnd::~NSSetMSyntheticFrontEnd () -{ - delete m_data_32; - m_data_32 = NULL; - delete m_data_64; - m_data_64 = NULL; -} - -size_t -lldb_private::formatters::NSSetMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; -} - -size_t -lldb_private::formatters::NSSetMSyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_data_32 && !m_data_64) - return 0; - return (m_data_32 ? m_data_32->_used : m_data_64->_used); -} - -bool -lldb_private::formatters::NSSetMSyntheticFrontEnd::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; - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - Error error; - if (valobj_sp->IsPointerType()) - { - valobj_sp = valobj_sp->Dereference(error); - if (error.Fail() || !valobj_sp) - return false; - } - 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->GetAddressOf() + 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::NSSetMSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -lldb::ValueObjectSP -lldb_private::formatters::NSSetMSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - lldb::addr_t m_objs_addr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr); - - uint32_t num_children = CalculateNumChildren(); - - if (idx >= num_children) - return lldb::ValueObjectSP(); - - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) - return lldb::ValueObjectSP(); - - if (m_children.empty()) - { - // do the scan phase - lldb::addr_t obj_at_idx = 0; - - uint32_t tries = 0; - uint32_t test_idx = 0; - - while(tries < num_children) - { - obj_at_idx = m_objs_addr + (test_idx * m_ptr_size); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - test_idx++; - - if (!obj_at_idx) - continue; - tries++; - - SetItemDescriptor descriptor = {obj_at_idx,lldb::ValueObjectSP()}; - - m_children.push_back(descriptor); - } - } - - if (idx >= m_children.size()) // should never happen - return lldb::ValueObjectSP(); - - SetItemDescriptor &set_item = m_children[idx]; - if (!set_item.valobj_sp) - { - auto ptr_size = process_sp->GetAddressByteSize(); - DataBufferHeap buffer(ptr_size,0); - switch (ptr_size) - { - case 0: // architecture has no clue?? - fail - return lldb::ValueObjectSP(); - case 4: - *((uint32_t*)buffer.GetBytes()) = (uint32_t)set_item.item_ptr; - break; - case 8: - *((uint64_t*)buffer.GetBytes()) = (uint64_t)set_item.item_ptr; - break; - default: - assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); - } - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - - DataExtractor data(buffer.GetBytes(), - buffer.GetByteSize(), - process_sp->GetByteOrder(), - process_sp->GetAddressByteSize()); - - set_item.valobj_sp = - CreateValueObjectFromData(idx_name.GetData(), - data, - m_exe_ctx_ref, - m_backend.GetClangType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID)); - } - return set_item.valobj_sp; -} - -lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::NSOrderedSetSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_count(UINT32_MAX), -m_children() -{} - -size_t -lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::CalculateNumChildren () -{ - if (m_count != UINT32_MAX) - return m_count; - uint64_t count_temp; - if (ExtractValueFromObjCExpression(m_backend,"unsigned int","count",count_temp)) - return (m_count = count_temp); - return (m_count = 0); -} - -lldb::ValueObjectSP -lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - auto iter = m_children.find(idx); - if (iter == m_children.end()) - { - lldb::ValueObjectSP retval_sp; - if (idx <= m_count) - { - retval_sp = CallSelectorOnObject(m_backend, "id", "objectAtIndex", idx); - if (retval_sp) - { - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - retval_sp->SetName(ConstString(idx_name.GetData())); - } - m_children[idx] = retval_sp; - } - return retval_sp; - } - else - return iter->second; -} - -bool -lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::Update() -{ - return false; -} - -bool -lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} - -size_t -lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; -} - -lldb_private::formatters::NSOrderedSetSyntheticFrontEnd::~NSOrderedSetSyntheticFrontEnd () -{ -} - -template bool -lldb_private::formatters::NSSetSummaryProvider<true> (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - -template bool -lldb_private::formatters::NSSetSummaryProvider<false> (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/StringPrinter.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/StringPrinter.cpp index a011cd553d0c..b114add50640 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/StringPrinter.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/StringPrinter.cpp @@ -9,109 +9,26 @@ #include "lldb/DataFormatters/StringPrinter.h" -#include "lldb/Core/DataExtractor.h" #include "lldb/Core/Debugger.h" #include "lldb/Core/Error.h" #include "lldb/Core/ValueObject.h" +#include "lldb/Target/Language.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "llvm/Support/ConvertUTF.h" #include <ctype.h> -#include <functional> #include <locale> using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -// I can't use a std::unique_ptr for this because the Deleter is a template argument there -// and I want the same type to represent both pointers I want to free and pointers I don't need -// to free - which is what this class essentially is -// It's very specialized to the needs of this file, and not suggested for general use -template <typename T = uint8_t, typename U = char, typename S = size_t> -struct StringPrinterBufferPointer -{ -public: - - typedef std::function<void(const T*)> Deleter; - - StringPrinterBufferPointer (std::nullptr_t ptr) : - m_data(nullptr), - m_size(0), - m_deleter() - {} - - StringPrinterBufferPointer(const T* bytes, S size, Deleter deleter = nullptr) : - m_data(bytes), - m_size(size), - m_deleter(deleter) - {} - - StringPrinterBufferPointer(const U* bytes, S size, Deleter deleter = nullptr) : - m_data((T*)bytes), - m_size(size), - m_deleter(deleter) - {} - - StringPrinterBufferPointer(StringPrinterBufferPointer&& rhs) : - m_data(rhs.m_data), - m_size(rhs.m_size), - m_deleter(rhs.m_deleter) - { - rhs.m_data = nullptr; - } - - StringPrinterBufferPointer(const StringPrinterBufferPointer& rhs) : - m_data(rhs.m_data), - m_size(rhs.m_size), - m_deleter(rhs.m_deleter) - { - rhs.m_data = nullptr; // this is why m_data has to be mutable - } - - const T* - GetBytes () const - { - return m_data; - } - - const S - GetSize () const - { - return m_size; - } - - ~StringPrinterBufferPointer () - { - if (m_data && m_deleter) - m_deleter(m_data); - m_data = nullptr; - } - - StringPrinterBufferPointer& - operator = (const StringPrinterBufferPointer& rhs) - { - if (m_data && m_deleter) - m_deleter(m_data); - m_data = rhs.m_data; - m_size = rhs.m_size; - m_deleter = rhs.m_deleter; - rhs.m_data = nullptr; - return *this; - } - -private: - mutable const T* m_data; - size_t m_size; - Deleter m_deleter; -}; - // we define this for all values of type but only implement it for those we care about // that's good because we get linker errors for any unsupported type -template <StringElementType type> -static StringPrinterBufferPointer<> +template <lldb_private::formatters::StringPrinter::StringElementType type> +static StringPrinter::StringPrinterBufferPointer<> GetPrintableImpl(uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next); // mimic isprint() for Unicode codepoints @@ -142,10 +59,10 @@ isprint(char32_t codepoint) } template <> -StringPrinterBufferPointer<> -GetPrintableImpl<StringElementType::ASCII> (uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next) +StringPrinter::StringPrinterBufferPointer<> +GetPrintableImpl<StringPrinter::StringElementType::ASCII> (uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next) { - StringPrinterBufferPointer<> retval = {nullptr}; + StringPrinter::StringPrinterBufferPointer<> retval = {nullptr}; switch (*buffer) { @@ -212,10 +129,10 @@ ConvertUTF8ToCodePoint (unsigned char c0, unsigned char c1, unsigned char c2, un } template <> -StringPrinterBufferPointer<> -GetPrintableImpl<StringElementType::UTF8> (uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next) +StringPrinter::StringPrinterBufferPointer<> +GetPrintableImpl<StringPrinter::StringElementType::UTF8> (uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next) { - StringPrinterBufferPointer<> retval {nullptr}; + StringPrinter::StringPrinterBufferPointer<> retval {nullptr}; unsigned utf8_encoded_len = getNumBytesForUTF8(*buffer); @@ -232,7 +149,7 @@ GetPrintableImpl<StringElementType::UTF8> (uint8_t* buffer, uint8_t* buffer_end, { case 1: // this is just an ASCII byte - ask ASCII - return GetPrintableImpl<StringElementType::ASCII>(buffer, buffer_end, next); + return GetPrintableImpl<StringPrinter::StringElementType::ASCII>(buffer, buffer_end, next); case 2: codepoint = ConvertUTF8ToCodePoint((unsigned char)*buffer, (unsigned char)*(buffer+1)); break; @@ -309,23 +226,40 @@ GetPrintableImpl<StringElementType::UTF8> (uint8_t* buffer, uint8_t* buffer_end, // Given a sequence of bytes, this function returns: // a sequence of bytes to actually print out + a length // the following unscanned position of the buffer is in next -static StringPrinterBufferPointer<> -GetPrintable(StringElementType type, uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next) +static StringPrinter::StringPrinterBufferPointer<> +GetPrintable(StringPrinter::StringElementType type, uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next) { if (!buffer) return {nullptr}; switch (type) { - case StringElementType::ASCII: - return GetPrintableImpl<StringElementType::ASCII>(buffer, buffer_end, next); - case StringElementType::UTF8: - return GetPrintableImpl<StringElementType::UTF8>(buffer, buffer_end, next); + case StringPrinter::StringElementType::ASCII: + return GetPrintableImpl<StringPrinter::StringElementType::ASCII>(buffer, buffer_end, next); + case StringPrinter::StringElementType::UTF8: + return GetPrintableImpl<StringPrinter::StringElementType::UTF8>(buffer, buffer_end, next); default: return {nullptr}; } } +StringPrinter::EscapingHelper +StringPrinter::GetDefaultEscapingHelper (GetPrintableElementType elem_type) +{ + switch (elem_type) + { + case GetPrintableElementType::UTF8: + return [] (uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next) -> StringPrinter::StringPrinterBufferPointer<> { + return GetPrintable(StringPrinter::StringElementType::UTF8, buffer, buffer_end, next); + }; + case GetPrintableElementType::ASCII: + return [] (uint8_t* buffer, uint8_t* buffer_end, uint8_t*& next) -> StringPrinter::StringPrinterBufferPointer<> { + return GetPrintable(StringPrinter::StringElementType::ASCII, buffer, buffer_end, next); + }; + } + llvm_unreachable("bad element type"); +} + // use this call if you already have an LLDB-side buffer for the data template<typename SourceDataType> static bool @@ -334,41 +268,44 @@ DumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType UTF8**, UTF8*, ConversionFlags), - const DataExtractor& data, - Stream& stream, - char prefix_token, - char quote, - uint32_t sourceSize, - bool escapeNonPrintables) + const StringPrinter::ReadBufferAndDumpToStreamOptions& dump_options) { - if (prefix_token != 0) - stream.Printf("%c",prefix_token); - if (quote != 0) - stream.Printf("%c",quote); + Stream &stream(*dump_options.GetStream()); + if (dump_options.GetPrefixToken() != 0) + stream.Printf("%s",dump_options.GetPrefixToken()); + if (dump_options.GetQuote() != 0) + stream.Printf("%c",dump_options.GetQuote()); + auto data(dump_options.GetData()); + auto source_size(dump_options.GetSourceSize()); if (data.GetByteSize() && data.GetDataStart() && data.GetDataEnd()) { const int bufferSPSize = data.GetByteSize(); - if (sourceSize == 0) + if (dump_options.GetSourceSize() == 0) { const int origin_encoding = 8*sizeof(SourceDataType); - sourceSize = bufferSPSize/(origin_encoding / 4); + source_size = bufferSPSize/(origin_encoding / 4); } const SourceDataType *data_ptr = (const SourceDataType*)data.GetDataStart(); - const SourceDataType *data_end_ptr = data_ptr + sourceSize; + const SourceDataType *data_end_ptr = data_ptr + source_size; - while (data_ptr < data_end_ptr) + const bool zero_is_terminator = dump_options.GetBinaryZeroIsTerminator(); + + if (zero_is_terminator) { - if (!*data_ptr) + while (data_ptr < data_end_ptr) { - data_end_ptr = data_ptr; - break; + if (!*data_ptr) + { + data_end_ptr = data_ptr; + break; + } + data_ptr++; } - data_ptr++; + + data_ptr = (const SourceDataType*)data.GetDataStart(); } - data_ptr = (const SourceDataType*)data.GetDataStart(); - lldb::DataBufferSP utf8_data_buffer_sp; UTF8* utf8_data_ptr = nullptr; UTF8* utf8_data_end_ptr = nullptr; @@ -379,14 +316,26 @@ DumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); utf8_data_end_ptr = utf8_data_ptr + utf8_data_buffer_sp->GetByteSize(); ConvertFunction ( &data_ptr, data_end_ptr, &utf8_data_ptr, utf8_data_end_ptr, lenientConversion ); + if (false == zero_is_terminator) + utf8_data_end_ptr = utf8_data_ptr; utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); // needed because the ConvertFunction will change the value of the data_ptr } else { // just copy the pointers - the cast is necessary to make the compiler happy // but this should only happen if we are reading UTF8 data - utf8_data_ptr = (UTF8*)data_ptr; - utf8_data_end_ptr = (UTF8*)data_end_ptr; + utf8_data_ptr = const_cast<UTF8 *>(reinterpret_cast<const UTF8*>(data_ptr)); + utf8_data_end_ptr = const_cast<UTF8 *>(reinterpret_cast<const UTF8*>(data_end_ptr)); + } + + const bool escape_non_printables = dump_options.GetEscapeNonPrintables(); + lldb_private::formatters::StringPrinter::EscapingHelper escaping_callback; + if (escape_non_printables) + { + if (Language *language = Language::FindPlugin(dump_options.GetLanguage())) + escaping_callback = language->GetStringPrinterEscapingHelper(lldb_private::formatters::StringPrinter::GetPrintableElementType::UTF8); + else + escaping_callback = lldb_private::formatters::StringPrinter::GetDefaultEscapingHelper(lldb_private::formatters::StringPrinter::GetPrintableElementType::UTF8); } // since we tend to accept partial data (and even partially malformed data) @@ -394,13 +343,13 @@ DumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType // hence we need to take a slower route and ensure we stay within boundaries for (;utf8_data_ptr < utf8_data_end_ptr;) { - if (!*utf8_data_ptr) + if (zero_is_terminator && !*utf8_data_ptr) break; - if (escapeNonPrintables) + if (escape_non_printables) { uint8_t* next_data = nullptr; - auto printable = GetPrintable(StringElementType::UTF8, utf8_data_ptr, utf8_data_end_ptr, next_data); + auto printable = escaping_callback(utf8_data_ptr, utf8_data_end_ptr, next_data); auto printable_bytes = printable.GetBytes(); auto printable_size = printable.GetSize(); if (!printable_bytes || !next_data) @@ -421,23 +370,39 @@ DumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType } } } - if (quote != 0) - stream.Printf("%c",quote); + if (dump_options.GetQuote() != 0) + stream.Printf("%c",dump_options.GetQuote()); + if (dump_options.GetSuffixToken() != 0) + stream.Printf("%s",dump_options.GetSuffixToken()); + if (dump_options.GetIsTruncated()) + stream.Printf("..."); return true; } -lldb_private::formatters::ReadStringAndDumpToStreamOptions::ReadStringAndDumpToStreamOptions (ValueObject& valobj) : +lldb_private::formatters::StringPrinter::ReadStringAndDumpToStreamOptions::ReadStringAndDumpToStreamOptions (ValueObject& valobj) : ReadStringAndDumpToStreamOptions() { SetEscapeNonPrintables(valobj.GetTargetSP()->GetDebugger().GetEscapeNonPrintables()); } -lldb_private::formatters::ReadBufferAndDumpToStreamOptions::ReadBufferAndDumpToStreamOptions (ValueObject& valobj) : +lldb_private::formatters::StringPrinter::ReadBufferAndDumpToStreamOptions::ReadBufferAndDumpToStreamOptions (ValueObject& valobj) : ReadBufferAndDumpToStreamOptions() { SetEscapeNonPrintables(valobj.GetTargetSP()->GetDebugger().GetEscapeNonPrintables()); } +lldb_private::formatters::StringPrinter::ReadBufferAndDumpToStreamOptions::ReadBufferAndDumpToStreamOptions (const ReadStringAndDumpToStreamOptions& options) : + ReadBufferAndDumpToStreamOptions() +{ + SetStream(options.GetStream()); + SetPrefixToken(options.GetPrefixToken()); + SetSuffixToken(options.GetSuffixToken()); + SetQuote(options.GetQuote()); + SetEscapeNonPrintables(options.GetEscapeNonPrintables()); + SetBinaryZeroIsTerminator(options.GetBinaryZeroIsTerminator()); + SetLanguage(options.GetLanguage()); +} + namespace lldb_private { @@ -447,7 +412,7 @@ namespace formatters template <> bool -ReadStringAndDumpToStream<StringElementType::ASCII> (ReadStringAndDumpToStreamOptions options) +StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::ASCII> (const ReadStringAndDumpToStreamOptions& options) { assert(options.GetStream() && "need a Stream to print the string to"); Error my_error; @@ -458,11 +423,20 @@ ReadStringAndDumpToStream<StringElementType::ASCII> (ReadStringAndDumpToStreamOp return false; size_t size; + const auto max_size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); + bool is_truncated = false; if (options.GetSourceSize() == 0) - size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); + size = max_size; else if (!options.GetIgnoreMaxLength()) - size = std::min(options.GetSourceSize(),process_sp->GetTarget().GetMaximumSizeOfStringSummary()); + { + size = options.GetSourceSize(); + if (size > max_size) + { + size = max_size; + is_truncated = true; + } + } else size = options.GetSourceSize(); @@ -473,25 +447,35 @@ ReadStringAndDumpToStream<StringElementType::ASCII> (ReadStringAndDumpToStreamOp if (my_error.Fail()) return false; - char prefix_token = options.GetPrefixToken(); + const char* prefix_token = options.GetPrefixToken(); char quote = options.GetQuote(); if (prefix_token != 0) - options.GetStream()->Printf("%c%c",prefix_token,quote); + options.GetStream()->Printf("%s%c",prefix_token,quote); else if (quote != 0) options.GetStream()->Printf("%c",quote); uint8_t* data_end = buffer_sp->GetBytes()+buffer_sp->GetByteSize(); + const bool escape_non_printables = options.GetEscapeNonPrintables(); + lldb_private::formatters::StringPrinter::EscapingHelper escaping_callback; + if (escape_non_printables) + { + if (Language *language = Language::FindPlugin(options.GetLanguage())) + escaping_callback = language->GetStringPrinterEscapingHelper(lldb_private::formatters::StringPrinter::GetPrintableElementType::ASCII); + else + escaping_callback = lldb_private::formatters::StringPrinter::GetDefaultEscapingHelper(lldb_private::formatters::StringPrinter::GetPrintableElementType::ASCII); + } + // since we tend to accept partial data (and even partially malformed data) // we might end up with no NULL terminator before the end_ptr // hence we need to take a slower route and ensure we stay within boundaries for (uint8_t* data = buffer_sp->GetBytes(); *data && (data < data_end);) { - if (options.GetEscapeNonPrintables()) + if (escape_non_printables) { uint8_t* next_data = nullptr; - auto printable = GetPrintable(StringElementType::ASCII, data, data_end, next_data); + auto printable = escaping_callback(data, data_end, next_data); auto printable_bytes = printable.GetBytes(); auto printable_size = printable.GetSize(); if (!printable_bytes || !next_data) @@ -511,16 +495,23 @@ ReadStringAndDumpToStream<StringElementType::ASCII> (ReadStringAndDumpToStreamOp data++; } } - - if (quote != 0) + + const char* suffix_token = options.GetSuffixToken(); + + if (suffix_token != 0) + options.GetStream()->Printf("%c%s",quote, suffix_token); + else if (quote != 0) options.GetStream()->Printf("%c",quote); + if (is_truncated) + options.GetStream()->Printf("..."); + return true; } template<typename SourceDataType> static bool -ReadUTFBufferAndDumpToStream (const ReadStringAndDumpToStreamOptions& options, +ReadUTFBufferAndDumpToStream (const StringPrinter::ReadStringAndDumpToStreamOptions& options, ConversionResult (*ConvertFunction) (const SourceDataType**, const SourceDataType*, UTF8**, @@ -550,14 +541,23 @@ ReadUTFBufferAndDumpToStream (const ReadStringAndDumpToStreamOptions& options, uint32_t sourceSize = options.GetSourceSize(); bool needs_zero_terminator = options.GetNeedsZeroTermination(); + + bool is_truncated = false; + const auto max_size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); if (!sourceSize) { - sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); + sourceSize = max_size; needs_zero_terminator = true; } else if (!options.GetIgnoreMaxLength()) - sourceSize = std::min(sourceSize,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); + { + if (sourceSize > max_size) + { + sourceSize = max_size; + is_truncated = true; + } + } const int bufferSPSize = sourceSize * type_width; @@ -581,13 +581,18 @@ ReadUTFBufferAndDumpToStream (const ReadStringAndDumpToStreamOptions& options, } DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize()); + + StringPrinter::ReadBufferAndDumpToStreamOptions dump_options(options); + dump_options.SetData(data); + dump_options.SetSourceSize(sourceSize); + dump_options.SetIsTruncated(is_truncated); - return DumpUTFBufferToStream(ConvertFunction, data, *options.GetStream(), options.GetPrefixToken(), options.GetQuote(), sourceSize, options.GetEscapeNonPrintables()); + return DumpUTFBufferToStream(ConvertFunction, dump_options); } template <> bool -ReadStringAndDumpToStream<StringElementType::UTF8> (ReadStringAndDumpToStreamOptions options) +StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF8> (const ReadStringAndDumpToStreamOptions& options) { return ReadUTFBufferAndDumpToStream<UTF8>(options, nullptr); @@ -595,7 +600,7 @@ ReadStringAndDumpToStream<StringElementType::UTF8> (ReadStringAndDumpToStreamOpt template <> bool -ReadStringAndDumpToStream<StringElementType::UTF16> (ReadStringAndDumpToStreamOptions options) +StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16> (const ReadStringAndDumpToStreamOptions& options) { return ReadUTFBufferAndDumpToStream<UTF16>(options, ConvertUTF16toUTF8); @@ -603,7 +608,7 @@ ReadStringAndDumpToStream<StringElementType::UTF16> (ReadStringAndDumpToStreamOp template <> bool -ReadStringAndDumpToStream<StringElementType::UTF32> (ReadStringAndDumpToStreamOptions options) +StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF32> (const ReadStringAndDumpToStreamOptions& options) { return ReadUTFBufferAndDumpToStream<UTF32>(options, ConvertUTF32toUTF8); @@ -611,16 +616,16 @@ ReadStringAndDumpToStream<StringElementType::UTF32> (ReadStringAndDumpToStreamOp template <> bool -ReadBufferAndDumpToStream<StringElementType::UTF8> (ReadBufferAndDumpToStreamOptions options) +StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF8> (const ReadBufferAndDumpToStreamOptions& options) { assert(options.GetStream() && "need a Stream to print the string to"); - return DumpUTFBufferToStream<UTF8>(nullptr, options.GetData(), *options.GetStream(), options.GetPrefixToken(), options.GetQuote(), options.GetSourceSize(), options.GetEscapeNonPrintables()); + return DumpUTFBufferToStream<UTF8>(nullptr, options); } template <> bool -ReadBufferAndDumpToStream<StringElementType::ASCII> (ReadBufferAndDumpToStreamOptions options) +StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::ASCII> (const ReadBufferAndDumpToStreamOptions& options) { // treat ASCII the same as UTF8 // FIXME: can we optimize ASCII some more? @@ -629,20 +634,20 @@ ReadBufferAndDumpToStream<StringElementType::ASCII> (ReadBufferAndDumpToStreamOp template <> bool -ReadBufferAndDumpToStream<StringElementType::UTF16> (ReadBufferAndDumpToStreamOptions options) +StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF16> (const ReadBufferAndDumpToStreamOptions& options) { assert(options.GetStream() && "need a Stream to print the string to"); - return DumpUTFBufferToStream(ConvertUTF16toUTF8, options.GetData(), *options.GetStream(), options.GetPrefixToken(), options.GetQuote(), options.GetSourceSize(), options.GetEscapeNonPrintables()); + return DumpUTFBufferToStream(ConvertUTF16toUTF8, options); } template <> bool -ReadBufferAndDumpToStream<StringElementType::UTF32> (ReadBufferAndDumpToStreamOptions options) +StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF32> (const ReadBufferAndDumpToStreamOptions& options) { assert(options.GetStream() && "need a Stream to print the string to"); - return DumpUTFBufferToStream(ConvertUTF32toUTF8, options.GetData(), *options.GetStream(), options.GetPrefixToken(), options.GetQuote(), options.GetSourceSize(), options.GetEscapeNonPrintables()); + return DumpUTFBufferToStream(ConvertUTF32toUTF8, options); } } // namespace formatters diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/TypeCategory.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/TypeCategory.cpp index b05cea55ff51..636d935b7625 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/TypeCategory.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/TypeCategory.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "lldb/DataFormatters/TypeCategory.h" +#include "lldb/Target/Language.h" // C Includes // C++ Includes @@ -18,7 +19,8 @@ using namespace lldb; using namespace lldb_private; TypeCategoryImpl::TypeCategoryImpl(IFormatChangeListener* clist, - ConstString name) : + ConstString name, + std::initializer_list<lldb::LanguageType> langs) : m_format_cont("format","regex-format",clist), m_summary_cont("summary","regex-summary",clist), m_filter_cont("filter","regex-filter",clist), @@ -29,8 +31,118 @@ m_validator_cont("validator","regex-validator",clist), m_enabled(false), m_change_listener(clist), m_mutex(Mutex::eMutexTypeRecursive), -m_name(name) -{} +m_name(name), +m_languages() +{ + for (const lldb::LanguageType lang : langs) + AddLanguage(lang); +} + +static bool +IsApplicable(lldb::LanguageType category_lang, + lldb::LanguageType valobj_lang) +{ + switch (category_lang) + { + // these are not languages that LLDB would ordinarily deal with + // only allow an exact equality here, since we really don't know + // any better + case eLanguageTypeAda83: + case eLanguageTypeCobol74: + case eLanguageTypeCobol85: + case eLanguageTypeFortran77: + case eLanguageTypeFortran90: + case eLanguageTypePascal83: + case eLanguageTypeModula2: + case eLanguageTypeJava: + case eLanguageTypeAda95: + case eLanguageTypeFortran95: + case eLanguageTypePLI: + case eLanguageTypeUPC: + case eLanguageTypeD: + case eLanguageTypePython: + return category_lang == valobj_lang; + + // the C family, we consider it as one + case eLanguageTypeC89: + case eLanguageTypeC: + case eLanguageTypeC99: + return valobj_lang == eLanguageTypeC89 || + valobj_lang == eLanguageTypeC || + valobj_lang == eLanguageTypeC99; + + // ObjC knows about C and itself + case eLanguageTypeObjC: + return valobj_lang == eLanguageTypeC89 || + valobj_lang == eLanguageTypeC || + valobj_lang == eLanguageTypeC99 || + valobj_lang == eLanguageTypeObjC; + + // C++ knows about C and C++ + case eLanguageTypeC_plus_plus: + return valobj_lang == eLanguageTypeC89 || + valobj_lang == eLanguageTypeC || + valobj_lang == eLanguageTypeC99 || + valobj_lang == eLanguageTypeC_plus_plus; + + // ObjC++ knows about C,C++,ObjC and ObjC++ + case eLanguageTypeObjC_plus_plus: + return valobj_lang == eLanguageTypeC89 || + valobj_lang == eLanguageTypeC || + valobj_lang == eLanguageTypeC99 || + valobj_lang == eLanguageTypeC_plus_plus || + valobj_lang == eLanguageTypeObjC; + + default: + case eLanguageTypeUnknown: + return true; + } +} + +bool +TypeCategoryImpl::IsApplicable (ValueObject& valobj) +{ + lldb::LanguageType valobj_lang = valobj.GetObjectRuntimeLanguage(); + for (size_t idx = 0; + idx < GetNumLanguages(); + idx++) + { + const lldb::LanguageType category_lang = GetLanguageAtIndex(idx); + if (::IsApplicable(category_lang,valobj_lang)) + return true; + } + return false; +} + +size_t +TypeCategoryImpl::GetNumLanguages () +{ + if (m_languages.empty()) + return 1; + return m_languages.size(); +} + +lldb::LanguageType +TypeCategoryImpl::GetLanguageAtIndex (size_t idx) +{ + if (m_languages.empty()) + return lldb::eLanguageTypeUnknown; + return m_languages[idx]; +} + +void +TypeCategoryImpl::AddLanguage (lldb::LanguageType lang) +{ + m_languages.push_back(lang); +} + +bool +TypeCategoryImpl::HasLanguage (lldb::LanguageType lang) +{ + const auto iter = std::find(m_languages.begin(), m_languages.end(), lang), + end = m_languages.end(); + return (iter != end); +} bool TypeCategoryImpl::Get (ValueObject& valobj, @@ -38,7 +150,7 @@ TypeCategoryImpl::Get (ValueObject& valobj, lldb::TypeFormatImplSP& entry, uint32_t* reason) { - if (!IsEnabled()) + if (!IsEnabled() || !IsApplicable(valobj)) return false; if (GetTypeFormatsContainer()->Get(candidates, entry, reason)) return true; @@ -54,7 +166,7 @@ TypeCategoryImpl::Get (ValueObject& valobj, lldb::TypeSummaryImplSP& entry, uint32_t* reason) { - if (!IsEnabled()) + if (!IsEnabled() || !IsApplicable(valobj)) return false; if (GetTypeSummariesContainer()->Get(candidates, entry, reason)) return true; @@ -70,7 +182,7 @@ TypeCategoryImpl::Get (ValueObject& valobj, lldb::SyntheticChildrenSP& entry, uint32_t* reason) { - if (!IsEnabled()) + if (!IsEnabled() || !IsApplicable(valobj)) return false; TypeFilterImpl::SharedPointer filter_sp; uint32_t reason_filter = 0; @@ -567,3 +679,30 @@ TypeCategoryImpl::Enable (bool value, uint32_t position) if (m_change_listener) m_change_listener->Changed(); } + +std::string +TypeCategoryImpl::GetDescription () +{ + StreamString stream; + stream.Printf("%s (%s", + GetName(), + (IsEnabled() ? "enabled" : "disabled")); + StreamString lang_stream; + lang_stream.Printf(", applicable for language(s): "); + bool print_lang = false; + for (size_t idx = 0; + idx < GetNumLanguages(); + idx++) + { + const lldb::LanguageType lang = GetLanguageAtIndex(idx); + if (lang != lldb::eLanguageTypeUnknown) + print_lang = true; + lang_stream.Printf("%s%s", + Language::GetNameForLanguageType(lang), + idx+1<GetNumLanguages() ? ", " : ""); + } + if (print_lang) + stream.Printf("%s",lang_stream.GetData()); + stream.PutChar(')'); + return stream.GetData(); +} diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/TypeCategoryMap.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/TypeCategoryMap.cpp index 96b9e6df8a47..58e4e2117bb6 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/TypeCategoryMap.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/TypeCategoryMap.cpp @@ -9,8 +9,8 @@ #include "lldb/DataFormatters/TypeCategoryMap.h" +#include "lldb/Core/Log.h" #include "lldb/DataFormatters/FormatClasses.h" -#include "lldb/DataFormatters/FormatManager.h" // C Includes // C++ Includes @@ -218,25 +218,35 @@ TypeCategoryMap::AnyMatches (ConstString type_name, } lldb::TypeFormatImplSP -TypeCategoryMap::GetFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +TypeCategoryMap::GetFormat (FormattersMatchData& match_data) { Mutex::Locker locker(m_map_mutex); uint32_t reason_why; ActiveCategoriesIterator begin, end = m_active_categories.end(); - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - - FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic); + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS)); + if (log) + { + for (auto match : match_data.GetMatchesVector()) + { + log->Printf("[CategoryMap::GetSummaryFormat] candidate match = %s %s %s %s reason = %" PRIu32, + match.GetTypeName().GetCString(), + match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers", + match.DidStripReference() ? "strip-reference" : "no-strip-reference", + match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef", + match.GetReason()); + } + } + for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; lldb::TypeFormatImplSP current_format; if (log) - log->Printf("\n[TypeCategoryMap::GetFormat] Trying to use category %s", category_sp->GetName()); - if (!category_sp->Get(valobj, matches, current_format, &reason_why)) + log->Printf("[TypeCategoryMap::GetFormat] Trying to use category %s", category_sp->GetName()); + if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why)) continue; return current_format; } @@ -246,25 +256,35 @@ TypeCategoryMap::GetFormat (ValueObject& valobj, } lldb::TypeSummaryImplSP -TypeCategoryMap::GetSummaryFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +TypeCategoryMap::GetSummaryFormat (FormattersMatchData& match_data) { Mutex::Locker locker(m_map_mutex); uint32_t reason_why; ActiveCategoriesIterator begin, end = m_active_categories.end(); - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - - FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic); + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS)); + if (log) + { + for (auto match : match_data.GetMatchesVector()) + { + log->Printf("[CategoryMap::GetSummaryFormat] candidate match = %s %s %s %s reason = %" PRIu32, + match.GetTypeName().GetCString(), + match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers", + match.DidStripReference() ? "strip-reference" : "no-strip-reference", + match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef", + match.GetReason()); + } + } + for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; lldb::TypeSummaryImplSP current_format; if (log) - log->Printf("\n[CategoryMap::GetSummaryFormat] Trying to use category %s", category_sp->GetName()); - if (!category_sp->Get(valobj, matches, current_format, &reason_why)) + log->Printf("[CategoryMap::GetSummaryFormat] Trying to use category %s", category_sp->GetName()); + if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why)) continue; return current_format; } @@ -275,8 +295,7 @@ TypeCategoryMap::GetSummaryFormat (ValueObject& valobj, #ifndef LLDB_DISABLE_PYTHON lldb::SyntheticChildrenSP -TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +TypeCategoryMap::GetSyntheticChildren (FormattersMatchData& match_data) { Mutex::Locker locker(m_map_mutex); @@ -284,17 +303,28 @@ TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj, ActiveCategoriesIterator begin, end = m_active_categories.end(); - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - - FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic); + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS)); + if (log) + { + for (auto match : match_data.GetMatchesVector()) + { + log->Printf("[CategoryMap::GetSummaryFormat] candidate match = %s %s %s %s reason = %" PRIu32, + match.GetTypeName().GetCString(), + match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers", + match.DidStripReference() ? "strip-reference" : "no-strip-reference", + match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef", + match.GetReason()); + } + } + for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; lldb::SyntheticChildrenSP current_format; if (log) - log->Printf("\n[CategoryMap::GetSyntheticChildren] Trying to use category %s", category_sp->GetName()); - if (!category_sp->Get(valobj, matches, current_format, &reason_why)) + log->Printf("[CategoryMap::GetSyntheticChildren] Trying to use category %s", category_sp->GetName()); + if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why)) continue; return current_format; } @@ -305,25 +335,35 @@ TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj, #endif lldb::TypeValidatorImplSP -TypeCategoryMap::GetValidator (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +TypeCategoryMap::GetValidator (FormattersMatchData& match_data) { Mutex::Locker locker(m_map_mutex); uint32_t reason_why; ActiveCategoriesIterator begin, end = m_active_categories.end(); - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - - FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic); + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_DATAFORMATTERS)); + if (log) + { + for (auto match : match_data.GetMatchesVector()) + { + log->Printf("[CategoryMap::GetValidator] candidate match = %s %s %s %s reason = %" PRIu32, + match.GetTypeName().GetCString(), + match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers", + match.DidStripReference() ? "strip-reference" : "no-strip-reference", + match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef", + match.GetReason()); + } + } + for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; lldb::TypeValidatorImplSP current_format; if (log) - log->Printf("\n[CategoryMap::GetValidator] Trying to use category %s", category_sp->GetName()); - if (!category_sp->Get(valobj, matches, current_format, &reason_why)) + log->Printf("[CategoryMap::GetValidator] Trying to use category %s", category_sp->GetName()); + if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why)) continue; return current_format; } @@ -333,7 +373,7 @@ TypeCategoryMap::GetValidator (ValueObject& valobj, } void -TypeCategoryMap::LoopThrough(CallbackType callback, void* param) +TypeCategoryMap::ForEach(ForEachCallback callback) { if (callback) { @@ -345,8 +385,7 @@ TypeCategoryMap::LoopThrough(CallbackType callback, void* param) for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category = *begin; - ConstString type = ConstString(category->GetName()); - if (!callback(param, category)) + if (!callback(category)) break; } } @@ -359,7 +398,7 @@ TypeCategoryMap::LoopThrough(CallbackType callback, void* param) if (pos->second->IsEnabled()) continue; KeyType type = pos->first; - if (!callback(param, pos->second)) + if (!callback(pos->second)) break; } } diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/TypeFormat.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/TypeFormat.cpp index c4a65fea7da5..6ab8d298f94b 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/TypeFormat.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/TypeFormat.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +#include "lldb/DataFormatters/TypeFormat.h" + // C Includes // C++ Includes @@ -17,15 +19,11 @@ #include "lldb/lldb-public.h" #include "lldb/lldb-enumerations.h" -#include "lldb/Core/Debugger.h" #include "lldb/Core/StreamString.h" -#include "lldb/Core/Timer.h" #include "lldb/DataFormatters/FormatManager.h" -#include "lldb/DataFormatters/TypeFormat.h" -#include "lldb/Interpreter/CommandInterpreter.h" -#include "lldb/Symbol/ClangASTType.h" +#include "lldb/Symbol/CompilerType.h" +#include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/TypeList.h" -#include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" using namespace lldb; @@ -91,13 +89,13 @@ TypeFormatImpl_Format::FormatObject (ValueObject *valobj, } else { - ClangASTType clang_type = value.GetClangType (); - if (clang_type) + CompilerType compiler_type = value.GetCompilerType (); + if (compiler_type) { // put custom bytes to display in the DataExtractor to override the default value logic if (GetFormat() == eFormatCString) { - lldb_private::Flags type_flags(clang_type.GetTypeInfo(NULL)); // disambiguate w.r.t. TypeFormatImpl::Flags + lldb_private::Flags type_flags(compiler_type.GetTypeInfo(NULL)); // disambiguate w.r.t. TypeFormatImpl::Flags if (type_flags.Test(eTypeIsPointer) && !type_flags.Test(eTypeIsObjC)) { // if we are dumping a pointer as a c-string, get the pointee data as a string @@ -122,7 +120,7 @@ TypeFormatImpl_Format::FormatObject (ValueObject *valobj, } StreamString sstr; - clang_type.DumpTypeValue (&sstr, // The stream to use for display + compiler_type.DumpTypeValue (&sstr, // The stream to use for display GetFormat(), // Format to display this type with data, // Data to extract from 0, // Byte offset into "m_data" @@ -134,7 +132,7 @@ TypeFormatImpl_Format::FormatObject (ValueObject *valobj, // for a formatting error (or else we wouldn't be able to reformat // until a next update), an empty string is treated as a "false" // return from here, but that's about as severe as we get - // ClangASTType::DumpTypeValue() should always return + // CompilerType::DumpTypeValue() should always return // something, even if that something is an error message if (sstr.GetString().empty()) dest.clear(); @@ -192,7 +190,7 @@ TypeFormatImpl_EnumType::FormatObject (ValueObject *valobj, return false; auto iter = m_types.find(valobj_key), end = m_types.end(); - ClangASTType valobj_enum_type; + CompilerType valobj_enum_type; if (iter == end) { // probably a redundant check @@ -208,9 +206,9 @@ TypeFormatImpl_EnumType::FormatObject (ValueObject *valobj, { if (!type_sp) continue; - if ( (type_sp->GetClangForwardType().GetTypeInfo() & eTypeIsEnumeration) == eTypeIsEnumeration) + if ( (type_sp->GetForwardCompilerType().GetTypeInfo() & eTypeIsEnumeration) == eTypeIsEnumeration) { - valobj_enum_type = type_sp->GetClangFullType(); + valobj_enum_type = type_sp->GetFullCompilerType (); m_types.emplace(valobj_key,valobj_enum_type); break; } diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/TypeSummary.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/TypeSummary.cpp index fa06f297f829..2806ba20c6a9 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/TypeSummary.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/TypeSummary.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +#include "lldb/DataFormatters/TypeSummary.h" + // C Includes // C++ Includes @@ -19,16 +21,13 @@ #include "lldb/Core/Debugger.h" #include "lldb/Core/StreamString.h" -#include "lldb/Core/Timer.h" -#include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/Core/ValueObject.h" #include "lldb/DataFormatters/ValueObjectPrinter.h" #include "lldb/Interpreter/CommandInterpreter.h" -#include "lldb/Symbol/ClangASTType.h" +#include "lldb/Symbol/CompilerType.h" #include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" -#include "lldb/Host/Host.h" - using namespace lldb; using namespace lldb_private; @@ -76,15 +75,17 @@ TypeSummaryOptions::SetCapping (lldb::TypeSummaryCapping cap) return *this; } -TypeSummaryImpl::TypeSummaryImpl (const TypeSummaryImpl::Flags& flags) : -m_flags(flags) +TypeSummaryImpl::TypeSummaryImpl (Kind kind, + const TypeSummaryImpl::Flags& flags) : + m_flags(flags), + m_kind(kind) { } StringSummaryFormat::StringSummaryFormat (const TypeSummaryImpl::Flags& flags, const char *format_cstr) : - TypeSummaryImpl(flags), + TypeSummaryImpl(Kind::eSummaryString,flags), m_format_str() { SetSummaryString (format_cstr); @@ -170,7 +171,7 @@ StringSummaryFormat::GetDescription () CXXFunctionSummaryFormat::CXXFunctionSummaryFormat (const TypeSummaryImpl::Flags& flags, Callback impl, const char* description) : -TypeSummaryImpl(flags), + TypeSummaryImpl(Kind::eCallback,flags), m_impl(impl), m_description(description ? description : "") { @@ -193,28 +194,25 @@ std::string CXXFunctionSummaryFormat::GetDescription () { StreamString sstr; - sstr.Printf ("`%s (%p) `%s%s%s%s%s%s%s", m_description.c_str(), - static_cast<void*>(&m_impl), + sstr.Printf ("%s%s%s%s%s%s%s %s", Cascades() ? "" : " (not cascading)", !DoesPrintChildren(nullptr) ? "" : " (show children)", !DoesPrintValue(nullptr) ? " (hide value)" : "", IsOneLiner() ? " (one-line printout)" : "", SkipsPointers() ? " (skip pointers)" : "", SkipsReferences() ? " (skip references)" : "", - HideNames(nullptr) ? " (hide member names)" : ""); + HideNames(nullptr) ? " (hide member names)" : "", + m_description.c_str()); return sstr.GetString(); } -#ifndef LLDB_DISABLE_PYTHON - - ScriptSummaryFormat::ScriptSummaryFormat (const TypeSummaryImpl::Flags& flags, const char * function_name, const char * python_script) : -TypeSummaryImpl(flags), -m_function_name(), -m_python_script(), -m_script_function_sp() + TypeSummaryImpl(Kind::eScript,flags), + m_function_name(), + m_python_script(), + m_script_function_sp() { if (function_name) m_function_name.assign(function_name); @@ -227,15 +225,9 @@ ScriptSummaryFormat::FormatObject (ValueObject *valobj, std::string& retval, const TypeSummaryOptions& options) { - Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); - if (!valobj) return false; - Host::SetCrashDescriptionWithFormat("[Python summary] Name: %s - Function: %s", - valobj->GetName().AsCString("unknown"), - m_function_name.c_str()); - TargetSP target_sp(valobj->GetTargetSP()); if (!target_sp) @@ -275,5 +267,3 @@ ScriptSummaryFormat::GetDescription () return sstr.GetString(); } - -#endif // #ifndef LLDB_DISABLE_PYTHON diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/TypeSynthetic.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/TypeSynthetic.cpp index 5bd8d30e4873..e49cd99b02ea 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/TypeSynthetic.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/TypeSynthetic.cpp @@ -22,8 +22,7 @@ #include "lldb/DataFormatters/TypeSynthetic.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/ScriptInterpreter.h" -#include "lldb/Symbol/ClangASTType.h" -#include "lldb/Target/StackFrame.h" +#include "lldb/Symbol/CompilerType.h" #include "lldb/Target/Target.h" using namespace lldb; @@ -111,11 +110,10 @@ std::string CXXSyntheticChildren::GetDescription() { StreamString sstr; - sstr.Printf("%s%s%s Generator at %p - %s", + sstr.Printf("%s%s%s %s", Cascades() ? "" : " (not cascading)", SkipsPointers() ? " (skip pointers)" : "", SkipsReferences() ? " (skip references)" : "", - reinterpret_cast<void*>(reinterpret_cast<intptr_t>(m_create_callback)), m_description.c_str()); return sstr.GetString(); @@ -136,7 +134,7 @@ lldb::ValueObjectSP SyntheticChildrenFrontEnd::CreateValueObjectFromAddress (const char* name, uint64_t address, const ExecutionContext& exe_ctx, - ClangASTType type) + CompilerType type) { ValueObjectSP valobj_sp(ValueObject::CreateValueObjectFromAddress(name, address, exe_ctx, type)); if (valobj_sp) @@ -148,7 +146,7 @@ lldb::ValueObjectSP SyntheticChildrenFrontEnd::CreateValueObjectFromData (const char* name, const DataExtractor& data, const ExecutionContext& exe_ctx, - ClangASTType type) + CompilerType type) { ValueObjectSP valobj_sp(ValueObject::CreateValueObjectFromData(name, data, exe_ctx, type)); if (valobj_sp) @@ -202,7 +200,15 @@ ScriptedSyntheticChildren::FrontEnd::CalculateNumChildren () { if (!m_wrapper_sp || m_interpreter == NULL) return 0; - return m_interpreter->CalculateNumChildren(m_wrapper_sp); + return m_interpreter->CalculateNumChildren(m_wrapper_sp, UINT32_MAX); +} + +size_t +ScriptedSyntheticChildren::FrontEnd::CalculateNumChildren (uint32_t max) +{ + if (!m_wrapper_sp || m_interpreter == NULL) + return 0; + return m_interpreter->CalculateNumChildren(m_wrapper_sp, max); } bool diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp index 7c794ee2ddac..04c291283546 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/ValueObjectPrinter.cpp @@ -13,33 +13,28 @@ // C++ Includes // Other libraries and framework includes // Project includes -#include "lldb/Core/Debugger.h" +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Target/Language.h" #include "lldb/Target/Target.h" using namespace lldb; using namespace lldb_private; -DumpValueObjectOptions::DumpValueObjectOptions (ValueObject& valobj) : -DumpValueObjectOptions() -{ - m_use_dynamic = valobj.GetDynamicValueType(); - m_use_synthetic = valobj.IsSynthetic(); -} - ValueObjectPrinter::ValueObjectPrinter (ValueObject* valobj, Stream* s) { if (valobj) { DumpValueObjectOptions options(*valobj); - Init (valobj,s,options,options.m_max_ptr_depth,0); + Init (valobj,s,options,m_options.m_max_ptr_depth,0, nullptr); } else { DumpValueObjectOptions options; - Init (valobj,s,options,options.m_max_ptr_depth,0); + Init (valobj,s,options,m_options.m_max_ptr_depth,0, nullptr); } } @@ -47,42 +42,48 @@ ValueObjectPrinter::ValueObjectPrinter (ValueObject* valobj, Stream* s, const DumpValueObjectOptions& options) { - Init(valobj,s,options,options.m_max_ptr_depth,0); + Init(valobj,s,options,m_options.m_max_ptr_depth,0, nullptr); } ValueObjectPrinter::ValueObjectPrinter (ValueObject* valobj, Stream* s, const DumpValueObjectOptions& options, - uint32_t ptr_depth, - uint32_t curr_depth) + const DumpValueObjectOptions::PointerDepth& ptr_depth, + uint32_t curr_depth, + InstancePointersSetSP printed_instance_pointers) { - Init(valobj,s,options,ptr_depth,curr_depth); + Init(valobj,s,options,ptr_depth,curr_depth, printed_instance_pointers); } void ValueObjectPrinter::Init (ValueObject* valobj, Stream* s, const DumpValueObjectOptions& options, - uint32_t ptr_depth, - uint32_t curr_depth) + const DumpValueObjectOptions::PointerDepth& ptr_depth, + uint32_t curr_depth, + InstancePointersSetSP printed_instance_pointers) { m_orig_valobj = valobj; m_valobj = nullptr; m_stream = s; - this->options = options; + m_options = options; m_ptr_depth = ptr_depth; m_curr_depth = curr_depth; assert (m_orig_valobj && "cannot print a NULL ValueObject"); assert (m_stream && "cannot print to a NULL Stream"); m_should_print = eLazyBoolCalculate; m_is_nil = eLazyBoolCalculate; + m_is_uninit = eLazyBoolCalculate; m_is_ptr = eLazyBoolCalculate; m_is_ref = eLazyBoolCalculate; m_is_aggregate = eLazyBoolCalculate; + m_is_instance_ptr = eLazyBoolCalculate; m_summary_formatter = {nullptr,false}; m_value.assign(""); m_summary.assign(""); m_error.assign(""); + m_val_summary_ok = false; + m_printed_instance_pointers = printed_instance_pointers ? printed_instance_pointers : InstancePointersSetSP(new InstancePointersSet()); } bool @@ -98,17 +99,15 @@ ValueObjectPrinter::PrintValueObject () PrintLocationIfNeeded(); m_stream->Indent(); - bool show_type = PrintTypeIfNeeded(); - - PrintNameIfNeeded(show_type); + PrintDecl(); } bool value_printed = false; bool summary_printed = false; - bool val_summary_ok = PrintValueAndSummaryIfNeeded (value_printed,summary_printed); + m_val_summary_ok = PrintValueAndSummaryIfNeeded (value_printed,summary_printed); - if (val_summary_ok) + if (m_val_summary_ok) PrintChildrenIfNeeded (value_printed, summary_printed); else m_stream->EOL(); @@ -132,7 +131,7 @@ ValueObjectPrinter::GetMostSpecializedValue () { if (m_orig_valobj->IsDynamic()) { - if (options.m_use_dynamic == eNoDynamicValues) + if (m_options.m_use_dynamic == eNoDynamicValues) { ValueObject *static_value = m_orig_valobj->GetStaticValue().get(); if (static_value) @@ -145,9 +144,9 @@ ValueObjectPrinter::GetMostSpecializedValue () } else { - if (options.m_use_dynamic != eNoDynamicValues) + if (m_options.m_use_dynamic != eNoDynamicValues) { - ValueObject *dynamic_value = m_orig_valobj->GetDynamicValue(options.m_use_dynamic).get(); + ValueObject *dynamic_value = m_orig_valobj->GetDynamicValue(m_options.m_use_dynamic).get(); if (dynamic_value) m_valobj = dynamic_value; else @@ -159,7 +158,7 @@ ValueObjectPrinter::GetMostSpecializedValue () if (m_valobj->IsSynthetic()) { - if (options.m_use_synthetic == false) + if (m_options.m_use_synthetic == false) { ValueObject *non_synthetic = m_valobj->GetNonSyntheticValue().get(); if (non_synthetic) @@ -168,7 +167,7 @@ ValueObjectPrinter::GetMostSpecializedValue () } else { - if (options.m_use_synthetic == true) + if (m_options.m_use_synthetic == true) { ValueObject *synthetic = m_valobj->GetSyntheticValue().get(); if (synthetic) @@ -176,8 +175,8 @@ ValueObjectPrinter::GetMostSpecializedValue () } } } - m_clang_type = m_valobj->GetClangType(); - m_type_flags = m_clang_type.GetTypeInfo (); + m_compiler_type = m_valobj->GetCompilerType(); + m_type_flags = m_compiler_type.GetTypeInfo (); return true; } @@ -195,9 +194,9 @@ ValueObjectPrinter::GetDescriptionForDisplay () const char* ValueObjectPrinter::GetRootNameForDisplay (const char* if_fail) { - const char *root_valobj_name = options.m_root_valobj_name.empty() ? + const char *root_valobj_name = m_options.m_root_valobj_name.empty() ? m_valobj->GetName().AsCString() : - options.m_root_valobj_name.c_str(); + m_options.m_root_valobj_name.c_str(); return root_valobj_name ? root_valobj_name : if_fail; } @@ -205,7 +204,7 @@ bool ValueObjectPrinter::ShouldPrintValueObject () { if (m_should_print == eLazyBoolCalculate) - m_should_print = (options.m_flat_output == false || m_type_flags.Test (eTypeHasValue)) ? eLazyBoolYes : eLazyBoolNo; + m_should_print = (m_options.m_flat_output == false || m_type_flags.Test (eTypeHasValue)) ? eLazyBoolYes : eLazyBoolNo; return m_should_print == eLazyBoolYes; } @@ -213,11 +212,19 @@ bool ValueObjectPrinter::IsNil () { if (m_is_nil == eLazyBoolCalculate) - m_is_nil = m_valobj->IsObjCNil() ? eLazyBoolYes : eLazyBoolNo; + m_is_nil = m_valobj->IsNilReference() ? eLazyBoolYes : eLazyBoolNo; return m_is_nil == eLazyBoolYes; } bool +ValueObjectPrinter::IsUninitialized () +{ + if (m_is_uninit == eLazyBoolCalculate) + m_is_uninit = m_valobj->IsUninitializedReference() ? eLazyBoolYes : eLazyBoolNo; + return m_is_uninit == eLazyBoolYes; +} + +bool ValueObjectPrinter::IsPtr () { if (m_is_ptr == eLazyBoolCalculate) @@ -242,9 +249,20 @@ ValueObjectPrinter::IsAggregate () } bool +ValueObjectPrinter::IsInstancePointer () +{ + // you need to do this check on the value's clang type + if (m_is_instance_ptr == eLazyBoolCalculate) + m_is_instance_ptr = (m_valobj->GetValue().GetCompilerType().GetTypeInfo() & eTypeInstanceIsPointer) != 0 ? eLazyBoolYes : eLazyBoolNo; + if ((eLazyBoolYes == m_is_instance_ptr) && m_valobj->IsBaseClass()) + m_is_instance_ptr = eLazyBoolNo; + return m_is_instance_ptr == eLazyBoolYes; +} + +bool ValueObjectPrinter::PrintLocationIfNeeded () { - if (options.m_show_location) + if (m_options.m_show_location) { m_stream->Printf("%s: ", m_valobj->GetLocationAsCString()); return true; @@ -252,88 +270,155 @@ ValueObjectPrinter::PrintLocationIfNeeded () return false; } -bool -ValueObjectPrinter::PrintTypeIfNeeded () +void +ValueObjectPrinter::PrintDecl () { bool show_type = true; // if we are at the root-level and been asked to hide the root's type, then hide it - if (m_curr_depth == 0 && options.m_hide_root_type) + if (m_curr_depth == 0 && m_options.m_hide_root_type) show_type = false; else // otherwise decide according to the usual rules (asked to show types - always at the root level) - show_type = options.m_show_types || (m_curr_depth == 0 && !options.m_flat_output); + show_type = m_options.m_show_types || (m_curr_depth == 0 && !m_options.m_flat_output); + + StreamString typeName; + // always show the type at the root level if it is invalid if (show_type) { // Some ValueObjects don't have types (like registers sets). Only print // the type if there is one to print ConstString type_name; - if (options.m_use_type_display_name) - type_name = m_valobj->GetDisplayTypeName(); + if (m_compiler_type.IsValid()) + { + if (m_options.m_use_type_display_name) + type_name = m_valobj->GetDisplayTypeName(); + else + type_name = m_valobj->GetQualifiedTypeName(); + } else - type_name = m_valobj->GetQualifiedTypeName(); + { + // only show an invalid type name if the user explicitly triggered show_type + if (m_options.m_show_types) + type_name = ConstString("<invalid type>"); + else + type_name.Clear(); + } + if (type_name) - m_stream->Printf("(%s) ", type_name.GetCString()); - else - show_type = false; + { + std::string type_name_str(type_name.GetCString()); + if (m_options.m_hide_pointer_value) + { + for(auto iter = type_name_str.find(" *"); + iter != std::string::npos; + iter = type_name_str.find(" *")) + { + type_name_str.erase(iter, 2); + } + } + typeName.Printf("%s", type_name_str.c_str()); + } } - return show_type; -} - -bool -ValueObjectPrinter::PrintNameIfNeeded (bool show_type) -{ - if (options.m_flat_output) + + StreamString varName; + + if (m_options.m_flat_output) { // If we are showing types, also qualify the C++ base classes const bool qualify_cxx_base_classes = show_type; - if (!options.m_hide_name) + if (!m_options.m_hide_name) { - m_valobj->GetExpressionPath(*m_stream, qualify_cxx_base_classes); - m_stream->PutCString(" ="); - return true; + m_valobj->GetExpressionPath(varName, qualify_cxx_base_classes); } } - else if (!options.m_hide_name) + else if (!m_options.m_hide_name) { const char *name_cstr = GetRootNameForDisplay(""); - m_stream->Printf ("%s =", name_cstr); - return true; + varName.Printf ("%s", name_cstr); + } + + bool decl_printed = false; + if (!m_options.m_decl_printing_helper) + { + // if the user didn't give us a custom helper, pick one based upon the language, either the one that this printer is bound to, or the preferred one for the ValueObject + lldb::LanguageType lang_type = (m_options.m_varformat_language == lldb::eLanguageTypeUnknown) ? m_valobj->GetPreferredDisplayLanguage() : m_options.m_varformat_language; + if (Language *lang_plugin = Language::FindPlugin(lang_type)) + { + m_options.m_decl_printing_helper = lang_plugin->GetDeclPrintingHelper(); + } + } + + if (m_options.m_decl_printing_helper) + { + ConstString type_name_cstr(typeName.GetData()); + ConstString var_name_cstr(varName.GetData()); + + StreamString dest_stream; + if (m_options.m_decl_printing_helper (type_name_cstr, + var_name_cstr, + m_options, + dest_stream)) + { + decl_printed = true; + m_stream->Printf("%s", dest_stream.GetData()); + } + } + + // if the helper failed, or there is none, do a default thing + if (!decl_printed) + { + if (typeName.GetSize()) + m_stream->Printf("(%s) ", typeName.GetData()); + if (varName.GetSize()) + m_stream->Printf("%s =", varName.GetData()); + else if (!m_options.m_hide_name) + m_stream->Printf(" ="); } - return false; } bool ValueObjectPrinter::CheckScopeIfNeeded () { - if (options.m_scope_already_checked) + if (m_options.m_scope_already_checked) return true; return m_valobj->IsInScope(); } TypeSummaryImpl* -ValueObjectPrinter::GetSummaryFormatter () +ValueObjectPrinter::GetSummaryFormatter (bool null_if_omitted) { if (m_summary_formatter.second == false) { - TypeSummaryImpl* entry = options.m_summary_sp ? options.m_summary_sp.get() : m_valobj->GetSummaryFormat().get(); + TypeSummaryImpl* entry = m_options.m_summary_sp ? m_options.m_summary_sp.get() : m_valobj->GetSummaryFormat().get(); - if (options.m_omit_summary_depth > 0) + if (m_options.m_omit_summary_depth > 0) entry = NULL; m_summary_formatter.first = entry; m_summary_formatter.second = true; } + if (m_options.m_omit_summary_depth > 0 && null_if_omitted) + return nullptr; return m_summary_formatter.first; } +static bool +IsPointerValue (const CompilerType &type) +{ + Flags type_flags(type.GetTypeInfo()); + if (type_flags.AnySet(eTypeInstanceIsPointer | eTypeIsPointer)) + return type_flags.AllClear(eTypeIsBuiltIn); + return false; +} + void ValueObjectPrinter::GetValueSummaryError (std::string& value, std::string& summary, std::string& error) { - if (options.m_format != eFormatDefault && options.m_format != m_valobj->GetFormat()) + if (m_options.m_format != eFormatDefault && m_options.m_format != m_valobj->GetFormat()) { - m_valobj->GetValueAsCString(options.m_format, + m_valobj->GetValueAsCString(m_options.m_format, value); } else @@ -350,14 +435,16 @@ ValueObjectPrinter::GetValueSummaryError (std::string& value, { if (IsNil()) summary.assign("nil"); - else if (options.m_omit_summary_depth == 0) + else if (IsUninitialized()) + summary.assign("<uninitialized>"); + else if (m_options.m_omit_summary_depth == 0) { TypeSummaryImpl* entry = GetSummaryFormatter(); if (entry) - m_valobj->GetSummaryAsCString(entry, summary); + m_valobj->GetSummaryAsCString(entry, summary, m_options.m_varformat_language); else { - const char* sum_cstr = m_valobj->GetSummaryAsCString(); + const char* sum_cstr = m_valobj->GetSummaryAsCString(m_options.m_varformat_language); if (sum_cstr) summary.assign(sum_cstr); } @@ -380,6 +467,16 @@ ValueObjectPrinter::PrintValueAndSummaryIfNeeded (bool& value_printed, } if (m_error.size()) { + // we need to support scenarios in which it is actually fine for a value to have no type + // but - on the other hand - if we get an error *AND* have no type, we try to get out + // gracefully, since most often that combination means "could not resolve a type" + // and the default failure mode is quite ugly + if (!m_compiler_type.IsValid()) + { + m_stream->Printf(" <could not resolve type>"); + return false; + } + error_printed = true; m_stream->Printf (" <%s>\n", m_error.c_str()); } @@ -390,10 +487,14 @@ 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(m_valobj) || options.m_format != eFormatDefault) || m_summary.empty()) && !options.m_hide_value) + if (!IsNil() && !IsUninitialized() && !m_value.empty() && (entry == NULL || (entry->DoesPrintValue(m_valobj) || m_options.m_format != eFormatDefault) || m_summary.empty()) && !m_options.m_hide_value) { - m_stream->Printf(" %s", m_value.c_str()); - value_printed = true; + if (m_options.m_hide_pointer_value && IsPointerValue(m_valobj->GetCompilerType())) {} + else + { + m_stream->Printf(" %s", m_value.c_str()); + value_printed = true; + } } if (m_summary.size()) @@ -413,9 +514,9 @@ ValueObjectPrinter::PrintObjectDescriptionIfNeeded (bool value_printed, if (ShouldPrintValueObject()) { // let's avoid the overly verbose no description error for a nil thing - if (options.m_use_objc && !IsNil()) + if (m_options.m_use_objc && !IsNil() && !IsUninitialized()) { - if (!options.m_hide_value || !options.m_hide_name) + if (!m_options.m_hide_value || !m_options.m_hide_name) m_stream->Printf(" "); const char *object_desc = nullptr; if (value_printed || summary_printed) @@ -437,13 +538,61 @@ ValueObjectPrinter::PrintObjectDescriptionIfNeeded (bool value_printed, } bool +DumpValueObjectOptions::PointerDepth::CanAllowExpansion (bool is_root, + TypeSummaryImpl* entry, + ValueObject *valobj, + const std::string& summary) +{ + switch (m_mode) + { + case Mode::Always: + return (m_count > 0); + case Mode::Never: + return false; + case Mode::Default: + if (is_root) + m_count = std::min<decltype(m_count)>(m_count,1); + return m_count > 0; + case Mode::Formatters: + if (!entry || entry->DoesPrintChildren(valobj) || summary.empty()) + return m_count > 0; + return false; + } + return false; +} + +bool +DumpValueObjectOptions::PointerDepth::CanAllowExpansion () const +{ + switch (m_mode) + { + case Mode::Always: + case Mode::Default: + case Mode::Formatters: + return (m_count > 0); + case Mode::Never: + return false; + } + return false; +} + +bool ValueObjectPrinter::ShouldPrintChildren (bool is_failed_description, - uint32_t& curr_ptr_depth) + DumpValueObjectOptions::PointerDepth& curr_ptr_depth) { const bool is_ref = IsRef (); const bool is_ptr = IsPtr (); - - if (is_failed_description || m_curr_depth < options.m_max_depth) + const bool is_uninit = IsUninitialized(); + + if (is_uninit) + return false; + + TypeSummaryImpl* entry = GetSummaryFormatter(); + + if (m_options.m_use_objc) + return false; + + if (is_failed_description || m_curr_depth < m_options.m_max_depth) { // We will show children for all concrete types. We won't show // pointer contents unless a pointer depth has been specified. @@ -461,25 +610,37 @@ ValueObjectPrinter::ShouldPrintChildren (bool is_failed_description, if (m_valobj->GetPointerValue (&ptr_address_type) == 0) return false; - else if (is_ref && m_curr_depth == 0 && curr_ptr_depth == 0) + const bool is_root_level = m_curr_depth == 0; + + if (is_ref && + is_root_level) { // If this is the root object (depth is zero) that we are showing // and it is a reference, and no pointer depth has been supplied // print out what it references. Don't do this at deeper depths // otherwise we can end up with infinite recursion... - curr_ptr_depth = 1; + return true; } - return (curr_ptr_depth > 0); + return curr_ptr_depth.CanAllowExpansion(false, entry, m_valobj, m_summary); } - TypeSummaryImpl* entry = GetSummaryFormatter(); - return (!entry || entry->DoesPrintChildren(m_valobj) || m_summary.empty()); } return false; } +bool +ValueObjectPrinter::ShouldExpandEmptyAggregates () +{ + TypeSummaryImpl* entry = GetSummaryFormatter(); + + if (!entry) + return true; + + return entry->DoesPrintEmptyAggregates(); +} + ValueObject* ValueObjectPrinter::GetValueObjectForChildrenGeneration () { @@ -489,7 +650,7 @@ ValueObjectPrinter::GetValueObjectForChildrenGeneration () void ValueObjectPrinter::PrintChildrenPreamble () { - if (options.m_flat_output) + if (m_options.m_flat_output) { if (ShouldPrintValueObject()) m_stream->EOL(); @@ -504,22 +665,23 @@ ValueObjectPrinter::PrintChildrenPreamble () void ValueObjectPrinter::PrintChild (ValueObjectSP child_sp, - uint32_t curr_ptr_depth) + const DumpValueObjectOptions::PointerDepth& curr_ptr_depth) { - DumpValueObjectOptions child_options(options); - child_options.SetFormat(options.m_format).SetSummary().SetRootValueObjectName(); - child_options.SetScopeChecked(true).SetHideName(options.m_hide_name).SetHideValue(options.m_hide_value) + DumpValueObjectOptions child_options(m_options); + child_options.SetFormat(m_options.m_format).SetSummary().SetRootValueObjectName(); + child_options.SetScopeChecked(true).SetHideName(m_options.m_hide_name).SetHideValue(m_options.m_hide_value) .SetOmitSummaryDepth(child_options.m_omit_summary_depth > 1 ? child_options.m_omit_summary_depth - 1 : 0); + if (child_sp.get()) { ValueObjectPrinter child_printer(child_sp.get(), m_stream, child_options, - (IsPtr() || IsRef()) && curr_ptr_depth >= 1 ? curr_ptr_depth - 1 : curr_ptr_depth, - m_curr_depth + 1); + (IsPtr() || IsRef()) ? --curr_ptr_depth : curr_ptr_depth, + m_curr_depth + 1, + m_printed_instance_pointers); child_printer.PrintValueObject(); } - } uint32_t @@ -533,7 +695,7 @@ ValueObjectPrinter::GetMaxNumChildrenToPrint (bool& print_dotdotdot) { const size_t max_num_children = m_valobj->GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); - if (num_children > max_num_children && !options.m_ignore_cap) + if (num_children > max_num_children && !m_options.m_ignore_cap) { print_dotdotdot = true; return max_num_children; @@ -545,7 +707,7 @@ ValueObjectPrinter::GetMaxNumChildrenToPrint (bool& print_dotdotdot) void ValueObjectPrinter::PrintChildrenPostamble (bool print_dotdotdot) { - if (!options.m_flat_output) + if (!m_options.m_flat_output) { if (print_dotdotdot) { @@ -557,8 +719,34 @@ ValueObjectPrinter::PrintChildrenPostamble (bool print_dotdotdot) } } +bool +ValueObjectPrinter::ShouldPrintEmptyBrackets (bool value_printed, + bool summary_printed) +{ + ValueObject* synth_m_valobj = GetValueObjectForChildrenGeneration(); + + if (!IsAggregate()) + return false; + + if (m_options.m_reveal_empty_aggregates == false) + { + if (value_printed || summary_printed) + return false; + } + + if (synth_m_valobj->MightHaveChildren()) + return true; + + if (m_val_summary_ok) + return false; + + return true; +} + void -ValueObjectPrinter::PrintChildren (uint32_t curr_ptr_depth) +ValueObjectPrinter::PrintChildren (bool value_printed, + bool summary_printed, + const DumpValueObjectOptions::PointerDepth& curr_ptr_depth) { ValueObject* synth_m_valobj = GetValueObjectForChildrenGeneration(); @@ -566,23 +754,44 @@ ValueObjectPrinter::PrintChildren (uint32_t curr_ptr_depth) size_t num_children = GetMaxNumChildrenToPrint(print_dotdotdot); if (num_children) { - PrintChildrenPreamble (); + bool any_children_printed = false; for (size_t idx=0; idx<num_children; ++idx) { ValueObjectSP child_sp(synth_m_valobj->GetChildAtIndex(idx, true)); - PrintChild (child_sp, curr_ptr_depth); + if (child_sp) + { + if (!any_children_printed) + { + PrintChildrenPreamble (); + any_children_printed = true; + } + PrintChild (child_sp, curr_ptr_depth); + } } - PrintChildrenPostamble (print_dotdotdot); + if (any_children_printed) + PrintChildrenPostamble (print_dotdotdot); + else + { + if (ShouldPrintEmptyBrackets(value_printed, summary_printed)) + { + if (ShouldPrintValueObject()) + m_stream->PutCString(" {}\n"); + else + m_stream->EOL(); + } + else + m_stream->EOL(); + } } - else if (IsAggregate()) + else if (ShouldPrintEmptyBrackets(value_printed, summary_printed)) { // Aggregate, no children... if (ShouldPrintValueObject()) { // if it has a synthetic value, then don't print {}, the synthetic children are probably only being used to vend a value - if (m_valobj->DoesProvideSyntheticValue()) + if (m_valobj->DoesProvideSyntheticValue() || !ShouldExpandEmptyAggregates()) m_stream->PutCString( "\n"); else m_stream->PutCString(" {}\n"); @@ -614,7 +823,7 @@ ValueObjectPrinter::PrintChildrenOneLiner (bool hide_names) { lldb::ValueObjectSP child_sp(synth_m_valobj->GetChildAtIndex(idx, true)); if (child_sp) - child_sp = child_sp->GetQualifiedRepresentationIfAvailable(options.m_use_dynamic, options.m_use_synthetic); + child_sp = child_sp->GetQualifiedRepresentationIfAvailable(m_options.m_use_dynamic, m_options.m_use_synthetic); if (child_sp) { if (idx) @@ -630,7 +839,7 @@ ValueObjectPrinter::PrintChildrenOneLiner (bool hide_names) } child_sp->DumpPrintableRepresentation(*m_stream, ValueObject::eValueObjectRepresentationStyleSummary, - lldb::eFormatInvalid, + m_options.m_format, ValueObject::ePrintableRepresentationSpecialCasesDisable); } } @@ -651,13 +860,30 @@ ValueObjectPrinter::PrintChildrenIfNeeded (bool value_printed, // if that happens, we want to display the children, if any bool is_failed_description = !PrintObjectDescriptionIfNeeded(value_printed, summary_printed); - uint32_t curr_ptr_depth = m_ptr_depth; + auto curr_ptr_depth = m_ptr_depth; bool print_children = ShouldPrintChildren (is_failed_description,curr_ptr_depth); - bool print_oneline = (curr_ptr_depth > 0 || - options.m_show_types || - !options.m_allow_oneliner_mode || - options.m_flat_output || - options.m_show_location) ? false : DataVisualization::ShouldPrintAsOneLiner(*m_valobj); + bool print_oneline = (curr_ptr_depth.CanAllowExpansion() || + m_options.m_show_types || + !m_options.m_allow_oneliner_mode || + m_options.m_flat_output || + m_options.m_show_location) ? false : DataVisualization::ShouldPrintAsOneLiner(*m_valobj); + bool is_instance_ptr = IsInstancePointer(); + uint64_t instance_ptr_value = LLDB_INVALID_ADDRESS; + + if (print_children && is_instance_ptr) + { + instance_ptr_value = m_valobj->GetValueAsUnsigned(0); + if (m_printed_instance_pointers->count(instance_ptr_value)) + { + // we already printed this instance-is-pointer thing, so don't expand it + m_stream->PutCString(" {...}\n"); + + // we're done here - get out fast + return; + } + else + m_printed_instance_pointers->emplace(instance_ptr_value); // remember this guy for future reference + } if (print_children) { @@ -668,11 +894,11 @@ ValueObjectPrinter::PrintChildrenIfNeeded (bool value_printed, m_stream->EOL(); } else - PrintChildren (curr_ptr_depth); + PrintChildren (value_printed, summary_printed, curr_ptr_depth); } - else if (m_curr_depth >= options.m_max_depth && IsAggregate() && ShouldPrintValueObject()) + else if (m_curr_depth >= m_options.m_max_depth && IsAggregate() && ShouldPrintValueObject()) { - m_stream->PutCString("{...}\n"); + m_stream->PutCString("{...}\n"); } else m_stream->EOL(); @@ -681,7 +907,7 @@ ValueObjectPrinter::PrintChildrenIfNeeded (bool value_printed, bool ValueObjectPrinter::ShouldPrintValidation () { - return options.m_run_validator; + return m_options.m_run_validator; } bool diff --git a/contrib/llvm/tools/lldb/source/DataFormatters/VectorType.cpp b/contrib/llvm/tools/lldb/source/DataFormatters/VectorType.cpp index 316d7b540bcd..347afa5c0559 100644 --- a/contrib/llvm/tools/lldb/source/DataFormatters/VectorType.cpp +++ b/contrib/llvm/tools/lldb/source/DataFormatters/VectorType.cpp @@ -1,4 +1,4 @@ -//===-- VectorType.cpp ---------------------------------------------*- C++ -*-===// +//===-- VectorType.cpp ------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,12 +7,17 @@ // //===----------------------------------------------------------------------===// +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes #include "lldb/DataFormatters/VectorType.h" #include "lldb/Core/ValueObject.h" -#include "lldb/DataFormatters/CXXFormatterFunctions.h" -#include "lldb/Symbol/ClangASTContext.h" -#include "lldb/Symbol/ClangASTType.h" +#include "lldb/DataFormatters/FormattersHelpers.h" +#include "lldb/Symbol/CompilerType.h" +#include "lldb/Symbol/TypeSystem.h" +#include "lldb/Target/Target.h" #include "lldb/Utility/LLDBAssert.h" @@ -20,87 +25,87 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -static ClangASTType -GetClangTypeForFormat (lldb::Format format, - ClangASTType element_type, - ClangASTContext *ast_ctx) +static CompilerType +GetCompilerTypeForFormat (lldb::Format format, + CompilerType element_type, + TypeSystem *type_system) { - lldbassert(ast_ctx && "ast_ctx needs to be not NULL"); + lldbassert(type_system && "type_system needs to be not NULL"); switch (format) { case lldb::eFormatAddressInfo: case lldb::eFormatPointer: - return ast_ctx->GetPointerSizedIntType(false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8*type_system->GetPointerByteSize()); case lldb::eFormatBoolean: - return ast_ctx->GetBasicType(lldb::eBasicTypeBool); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeBool); case lldb::eFormatBytes: case lldb::eFormatBytesWithASCII: case lldb::eFormatChar: case lldb::eFormatCharArray: case lldb::eFormatCharPrintable: - return ast_ctx->GetBasicType(lldb::eBasicTypeChar); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar); case lldb::eFormatComplex /* lldb::eFormatComplexFloat */: - return ast_ctx->GetBasicType(lldb::eBasicTypeFloatComplex); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloatComplex); case lldb::eFormatCString: - return ast_ctx->GetBasicType(lldb::eBasicTypeChar).GetPointerType(); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar).GetPointerType(); case lldb::eFormatFloat: - return ast_ctx->GetBasicType(lldb::eBasicTypeFloat); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloat); case lldb::eFormatHex: case lldb::eFormatHexUppercase: case lldb::eFormatOctal: - return ast_ctx->GetBasicType(lldb::eBasicTypeInt); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeInt); case lldb::eFormatHexFloat: - return ast_ctx->GetBasicType(lldb::eBasicTypeFloat); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloat); case lldb::eFormatUnicode16: case lldb::eFormatUnicode32: case lldb::eFormatUnsigned: - return ast_ctx->GetBasicType(lldb::eBasicTypeUnsignedInt); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeUnsignedInt); case lldb::eFormatVectorOfChar: - return ast_ctx->GetBasicType(lldb::eBasicTypeChar); + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar); case lldb::eFormatVectorOfFloat32: - return ast_ctx->GetFloatTypeFromBitSize(32); + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingIEEE754, 32); case lldb::eFormatVectorOfFloat64: - return ast_ctx->GetFloatTypeFromBitSize(64); + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingIEEE754, 64); case lldb::eFormatVectorOfSInt16: - return ast_ctx->GetIntTypeFromBitSize(16, true); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 16); case lldb::eFormatVectorOfSInt32: - return ast_ctx->GetIntTypeFromBitSize(32, true); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 32); case lldb::eFormatVectorOfSInt64: - return ast_ctx->GetIntTypeFromBitSize(64, true); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 64); case lldb::eFormatVectorOfSInt8: - return ast_ctx->GetIntTypeFromBitSize(8, true); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 8); case lldb::eFormatVectorOfUInt128: - return ast_ctx->GetIntTypeFromBitSize(128, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 128); case lldb::eFormatVectorOfUInt16: - return ast_ctx->GetIntTypeFromBitSize(16, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 16); case lldb::eFormatVectorOfUInt32: - return ast_ctx->GetIntTypeFromBitSize(32, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 32); case lldb::eFormatVectorOfUInt64: - return ast_ctx->GetIntTypeFromBitSize(64, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 64); case lldb::eFormatVectorOfUInt8: - return ast_ctx->GetIntTypeFromBitSize(8, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8); case lldb::eFormatDefault: return element_type; @@ -113,13 +118,13 @@ GetClangTypeForFormat (lldb::Format format, case lldb::eFormatOSType: case lldb::eFormatVoid: default: - return ast_ctx->GetIntTypeFromBitSize(8, false); + return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8); } } static lldb::Format GetItemFormatForFormat (lldb::Format format, - ClangASTType element_type) + CompilerType element_type) { switch (format) { @@ -169,8 +174,8 @@ GetItemFormatForFormat (lldb::Format format, } static size_t -CalculateNumChildren (ClangASTType container_type, - ClangASTType element_type, +CalculateNumChildren (CompilerType container_type, + CompilerType element_type, lldb_private::ExecutionContextScope *exe_scope = nullptr // does not matter here because all we trade in are basic types ) { @@ -199,15 +204,17 @@ namespace lldb_private { m_child_type(), m_num_children(0) {} - - virtual size_t - CalculateNumChildren () + + ~VectorTypeSyntheticFrontEnd() override = default; + + size_t + CalculateNumChildren() override { return m_num_children; } - - virtual lldb::ValueObjectSP - GetChildAtIndex (size_t idx) + + lldb::ValueObjectSP + GetChildAtIndex(size_t idx) override { if (idx >= CalculateNumChildren()) return lldb::ValueObjectSP(); @@ -225,29 +232,32 @@ namespace lldb_private { return child_sp; } - virtual bool - Update() + bool + Update() override { m_parent_format = m_backend.GetFormat(); - ClangASTType parent_type(m_backend.GetClangType()); - ClangASTType element_type; + CompilerType parent_type(m_backend.GetCompilerType()); + CompilerType element_type; parent_type.IsVectorType(&element_type, nullptr); - m_child_type = ::GetClangTypeForFormat(m_parent_format, element_type, ClangASTContext::GetASTContext(parent_type.GetASTContext())); + TargetSP target_sp(m_backend.GetTargetSP()); + m_child_type = ::GetCompilerTypeForFormat(m_parent_format, + element_type, + target_sp ? target_sp->GetScratchTypeSystemForLanguage(nullptr, lldb::eLanguageTypeC) : nullptr); m_num_children = ::CalculateNumChildren(parent_type, m_child_type); m_item_format = GetItemFormatForFormat(m_parent_format, m_child_type); return false; } - - virtual bool - MightHaveChildren () + + bool + MightHaveChildren() override { return true; } - - virtual size_t - GetIndexOfChildWithName (const ConstString &name) + + size_t + GetIndexOfChildWithName(const ConstString &name) override { const char* item_name = name.GetCString(); uint32_t idx = ExtractIndexFromString(item_name); @@ -255,18 +265,16 @@ namespace lldb_private { return UINT32_MAX; return idx; } - - virtual - ~VectorTypeSyntheticFrontEnd () {} - + private: lldb::Format m_parent_format; lldb::Format m_item_format; - ClangASTType m_child_type; + CompilerType m_child_type; size_t m_num_children; }; - } -} + + } // namespace formatters +} // namespace lldb_private bool lldb_private::formatters::VectorTypeSummaryProvider (ValueObject& valobj, @@ -317,6 +325,6 @@ lldb_private::SyntheticChildrenFrontEnd* lldb_private::formatters::VectorTypeSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) { if (!valobj_sp) - return NULL; - return (new VectorTypeSyntheticFrontEnd(valobj_sp)); + return nullptr; + return new VectorTypeSyntheticFrontEnd(valobj_sp); } |