diff options
Diffstat (limited to 'lldb')
| -rw-r--r-- | lldb/source/DataFormatters/CXXFormatterFunctions.cpp | 160 |
1 files changed, 144 insertions, 16 deletions
diff --git a/lldb/source/DataFormatters/CXXFormatterFunctions.cpp b/lldb/source/DataFormatters/CXXFormatterFunctions.cpp index 20231d9689d..54c51f532bf 100644 --- a/lldb/source/DataFormatters/CXXFormatterFunctions.cpp +++ b/lldb/source/DataFormatters/CXXFormatterFunctions.cpp @@ -7,8 +7,6 @@ // //===----------------------------------------------------------------------===// -#include "lldb/lldb-python.h" - #include "lldb/DataFormatters/CXXFormatterFunctions.h" #include "llvm/Support/ConvertUTF.h" @@ -23,6 +21,8 @@ #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Target.h" +#include <algorithm> + using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; @@ -180,7 +180,7 @@ DumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType Stream& stream, char prefix_token = '@', char quote = '"', - int sourceSize = 0) + uint32_t sourceSize = 0) { if (prefix_token != 0) stream.Printf("%c",prefix_token); @@ -257,7 +257,7 @@ ReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceD Stream& stream, char prefix_token = '@', char quote = '"', - int sourceSize = 0) + uint32_t sourceSize = 0) { if (location == 0 || location == LLDB_INVALID_ADDRESS) return false; @@ -271,8 +271,7 @@ ReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceD if (origin_encoding != 8 && !ConvertFunction) return false; - if (sourceSize == 0) - sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); + sourceSize = std::min(sourceSize,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); const int bufferSPSize = sourceSize * (origin_encoding >> 2); Error error; @@ -644,7 +643,7 @@ static bool ReadAsciiBufferAndDumpToStream (lldb::addr_t location, lldb::ProcessSP& process_sp, Stream& dest, - size_t size = 0, + uint32_t size = 0, Error* error = NULL, size_t *data_read = NULL, char prefix_token = '@', @@ -655,8 +654,7 @@ ReadAsciiBufferAndDumpToStream (lldb::addr_t location, if (!process_sp || location == 0) return false; - if (size == 0) - size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); + size = std::min(size,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); lldb::DataBufferSP buffer_sp(new DataBufferHeap(size,0)); @@ -675,6 +673,45 @@ ReadAsciiBufferAndDumpToStream (lldb::addr_t location, return true; } +#ifdef WANT_DEEP_PRINT +struct lldb__notInlineMutable { + void *buffer; + signed long length; + signed long capacity; + unsigned int hasGap:1; + unsigned int isFixedCapacity:1; + unsigned int isExternalMutable:1; + unsigned int capacityProvidedExternally:1; +#if __LP64__ + unsigned long desiredCapacity:60; +#else + unsigned long desiredCapacity:28; +#endif + void* contentsAllocator; +}; + +struct lldb__CFString { + uintptr_t _cfisa; + uint8_t _cfinfo[4]; + uint32_t _rc; + union { + struct __inline1 { + signed long length; + } inline1; + struct __notInlineImmutable1 { + void *buffer; + signed long length; + void* contentsDeallocator; + } notInlineImmutable1; + struct __notInlineImmutable2 { + void *buffer; + void* contentsDeallocator; + } notInlineImmutable2; + struct lldb__notInlineMutable notInlineMutable; + } variants; +}; +#endif + bool lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream) { @@ -719,6 +756,87 @@ lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& 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 and not 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 (not is_inline and not 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); + } + } + +#ifdef WANT_DEEP_PRINT + lldb__CFString my_string_data; + process_sp->ReadMemory(valobj_addr, &my_string_data, sizeof(lldb__CFString),error); + + printf(R"( + __CFString my_string_data = { + uintptr_t _cfisa = %lu + uint8_t _cfinfo[4] = %c%c%c%c + uint32_t _rc = %d + union { + struct __inline1 { + signed long length = %ld + } inline1; + struct __notInlineImmutable1 { + void *buffer = %p + signed long length = %ld + void* contentsDeallocator = %p + } notInlineImmutable1; + struct __notInlineImmutable2 { + void *buffer = %p + void* contentsDeallocator = %p + } notInlineImmutable2; + struct __notInlineMutable notInlineMutable { + void *buffer = %p + signed long length = %ld + signed long capacity = %ld + unsigned int hasGap:1 = %d + unsigned int isFixedCapacity:1 = %d + unsigned int isExternalMutable:1 = %d + unsigned int capacityProvidedExternally:1 = %d +#if __LP64__ + unsigned long desiredCapacity:60 = %lu +#else + unsigned long desiredCapacity:28 = %lu +#endif + void* contentsAllocator = %p + } + } variants; + };\n)", + my_string_data._cfisa, + my_string_data._cfinfo[0],my_string_data._cfinfo[1],my_string_data._cfinfo[2],my_string_data._cfinfo[3], + my_string_data._rc, + my_string_data.variants.inline1.length, + my_string_data.variants.notInlineImmutable1.buffer, + my_string_data.variants.notInlineImmutable1.length, + my_string_data.variants.notInlineImmutable1.contentsDeallocator, + my_string_data.variants.notInlineImmutable2.buffer, + my_string_data.variants.notInlineImmutable2.contentsDeallocator, + my_string_data.variants.notInlineMutable.buffer, + my_string_data.variants.notInlineMutable.length, + my_string_data.variants.notInlineMutable.capacity, + my_string_data.variants.notInlineMutable.hasGap, + my_string_data.variants.notInlineMutable.isFixedCapacity, + my_string_data.variants.notInlineMutable.isExternalMutable, + my_string_data.variants.notInlineMutable.capacityProvidedExternally, + my_string_data.variants.notInlineMutable.desiredCapacity, + my_string_data.variants.notInlineMutable.desiredCapacity, + my_string_data.variants.notInlineMutable.contentsAllocator); +#endif if (strcmp(class_name,"NSString") && strcmp(class_name,"CFStringRef") && @@ -734,6 +852,16 @@ lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& return true; } +#ifdef WANT_DEEP_PRNT + stream.Printf("(M:%dI:%dL:%zuU:%dS:%dN:%d) ", + is_mutable, + is_inline, + explicit_length, + is_unicode, + is_special, + has_null); +#endif + if (is_mutable) { uint64_t location = 2 * ptr_size + valobj_addr; @@ -741,14 +869,14 @@ lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& if (error.Fail()) return false; if (has_explicit_length and is_unicode) - return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8,location, process_sp, stream, '@'); + return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8,location, process_sp, stream, '@', '"', explicit_length); else - return ReadAsciiBufferAndDumpToStream(location+1,process_sp,stream); + return ReadAsciiBufferAndDumpToStream(location+1,process_sp,stream, explicit_length); } 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); + return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); } else if (is_unicode) { @@ -769,19 +897,19 @@ lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& if (error.Fail()) return false; } - return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@'); + return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@', '"', explicit_length); } else if (is_special) { uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8); - return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@'); + return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@', '"', explicit_length); } else if (is_inline) { uint64_t location = valobj_addr + 2*ptr_size; if (!has_explicit_length) location++; - return ReadAsciiBufferAndDumpToStream(location,process_sp,stream); + return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); } else { @@ -789,7 +917,7 @@ lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& location = process_sp->ReadPointerFromMemory(location, error); if (error.Fail()) return false; - return ReadAsciiBufferAndDumpToStream(location,process_sp,stream); + return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); } stream.Printf("class name = %s",class_name); |

