CXXFormatterFunctions.cpp revision 39ebb982b3f9de4a15744078e9c6ba231187b5dc
1caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===// 2caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// 3caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// The LLVM Compiler Infrastructure 4caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// 5caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// This file is distributed under the University of Illinois Open Source 6caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// License. See LICENSE.TXT for details. 7caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata// 8caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata//===----------------------------------------------------------------------===// 9caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 10f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/CXXFormatterFunctions.h" 11caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 122a64f9ad2f6abf7a43bb03346a5af50f9df204f7Dmitri Gribenko#include "llvm/Support/ConvertUTF.h" 13caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 14f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/DataBufferHeap.h" 15f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/Error.h" 16caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/Stream.h" 17caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/ValueObject.h" 18f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/ValueObjectConstResult.h" 19f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Host/Endian.h" 20db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Symbol/ClangASTContext.h" 21caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/ObjCLanguageRuntime.h" 22caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/Target.h" 23caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 24fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#include <algorithm> 25fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 26caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb; 27caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private; 28caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private::formatters; 29caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 30caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 31f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj, 32f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* target_type, 33f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 34f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t &value) 35caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 36caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target_type || !*target_type) 37caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 38caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!selector || !*selector) 39caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 40caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr; 41b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); 42caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 43caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::ValueObjectSP result_sp; 44caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Target* target = exe_ctx.GetTargetPtr(); 45caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 46caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target || !stack_frame) 47caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 48d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 4947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 50d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options.SetCoerceToId(false) 51d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUnwindOnError(true) 5299611fe5a2a450087e7d9cbdb91c7d3fdcb5a5c2Sean Callanan .SetKeepInMemory(true); 53d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 54caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata target->EvaluateExpression(expr.GetData(), 55caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stack_frame, 56d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata result_sp, 57d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options); 58caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!result_sp) 59caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 60caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = result_sp->GetValueAsUnsigned(0); 61caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 62caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 63caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 64ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 65ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::ExtractSummaryFromObjCExpression (ValueObject &valobj, 66ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata const char* target_type, 67ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata const char* selector, 68ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Stream &stream) 69ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 70ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!target_type || !*target_type) 71ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 72ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!selector || !*selector) 73ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 74ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata StreamString expr; 7504d3bb2436e3cbecd3d461715aaf5cc99e93c828Enrico Granata expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); 76ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 77ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::ValueObjectSP result_sp; 78ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 79ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 80ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!target || !stack_frame) 81ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 82ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 83ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata EvaluateExpressionOptions options; 84ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata options.SetCoerceToId(false) 85ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata .SetUnwindOnError(true) 86ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata .SetKeepInMemory(true) 87ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 88ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 89ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata target->EvaluateExpression(expr.GetData(), 90ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata stack_frame, 91ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata result_sp, 92ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata options); 93ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!result_sp) 94ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 95ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata stream.Printf("%s",result_sp->GetSummaryAsCString()); 96ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return true; 97ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 98ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 99f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 100f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, 101f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* return_type, 102f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 103f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t index) 104f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 105f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp; 106f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!return_type || !*return_type) 107f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 108f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!selector || !*selector) 109f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 110f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr_path_stream; 111f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 112f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 1135f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index); 114f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 115f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP result_sp; 116f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 117f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 118f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target || !stack_frame) 119f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 120f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 12147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 122f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options.SetCoerceToId(false) 123f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUnwindOnError(true) 124f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetKeepInMemory(true) 125f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 126f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 127f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target->EvaluateExpression(expr.GetData(), 128f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata stack_frame, 129f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp, 130f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options); 131f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 132f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 133f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 134f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 135f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, 136f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* return_type, 137f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 138f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* key) 139f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 140f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp; 141f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!return_type || !*return_type) 142f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 143f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!selector || !*selector) 144f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 145f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!key || !*key) 146f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 147f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr_path_stream; 148f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 149f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 150f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key); 151f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 152f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP result_sp; 153f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 154f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 155f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target || !stack_frame) 156f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 157f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 15847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 159f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options.SetCoerceToId(false) 160f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUnwindOnError(true) 161f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetKeepInMemory(true) 162f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 163f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 164f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target->EvaluateExpression(expr.GetData(), 165f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata stack_frame, 166f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp, 167f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options); 168f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 169f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 170f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 171cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata// use this call if you already have an LLDB-side buffer for the data 172cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType> 173f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatastatic bool 174cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico GranataDumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType**, 175cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const SourceDataType*, 176cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata UTF8**, 177cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata UTF8*, 178cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata ConversionFlags), 179cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor& data, 180cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata Stream& stream, 181cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata char prefix_token = '@', 182cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata char quote = '"', 183fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uint32_t sourceSize = 0) 184f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 185cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (prefix_token != 0) 186cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",prefix_token); 187cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (quote != 0) 188cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",quote); 189cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (data.GetByteSize() && data.GetDataStart() && data.GetDataEnd()) 190f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 191cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const int bufferSPSize = data.GetByteSize(); 192cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (sourceSize == 0) 193cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 194cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const int origin_encoding = 8*sizeof(SourceDataType); 1950cd33406723ceed5c08d41ff6946006298f3f133Greg Clayton sourceSize = bufferSPSize/(origin_encoding / 4); 196cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 197cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 198cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata SourceDataType *data_ptr = (SourceDataType*)data.GetDataStart(); 199f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata SourceDataType *data_end_ptr = data_ptr + sourceSize; 200f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 201f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata while (data_ptr < data_end_ptr) 202f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 203f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!*data_ptr) 204f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 205f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata data_end_ptr = data_ptr; 206f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata break; 207f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 208f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata data_ptr++; 209f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 210f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 211cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data_ptr = (SourceDataType*)data.GetDataStart(); 212f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 21306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata lldb::DataBufferSP utf8_data_buffer_sp; 21406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata UTF8* utf8_data_ptr = nullptr; 21506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata UTF8* utf8_data_end_ptr = nullptr; 216cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 217f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (ConvertFunction) 21806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata { 21966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata utf8_data_buffer_sp.reset(new DataBufferHeap(4*bufferSPSize,0)); 22006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); 22166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata utf8_data_end_ptr = utf8_data_ptr + utf8_data_buffer_sp->GetByteSize(); 222f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ConvertFunction ( (const SourceDataType**)&data_ptr, data_end_ptr, &utf8_data_ptr, utf8_data_end_ptr, lenientConversion ); 22306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); // needed because the ConvertFunction will change the value of the data_ptr 22406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata } 225f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata else 226f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 227f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata // just copy the pointers - the cast is necessary to make the compiler happy 228f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata // but this should only happen if we are reading UTF8 data 229f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata utf8_data_ptr = (UTF8*)data_ptr; 230f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata utf8_data_end_ptr = (UTF8*)data_end_ptr; 231f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 232f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 233b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // since we tend to accept partial data (and even partially malformed data) 234b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // we might end up with no NULL terminator before the end_ptr 235b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // hence we need to take a slower route and ensure we stay within boundaries 236f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata for (;utf8_data_ptr != utf8_data_end_ptr; utf8_data_ptr++) 237f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 238f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!*utf8_data_ptr) 239f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata break; 240f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("%c",*utf8_data_ptr); 241f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 242f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 243cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (quote != 0) 244cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",quote); 245f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 246f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 247f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 248cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType> 24966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granataclass ReadUTFBufferAndDumpToStreamOptions 25066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata{ 25166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granatapublic: 25266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata typedef ConversionResult (*ConvertFunctionType) (const SourceDataType**, 25366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata const SourceDataType*, 25466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata UTF8**, 25566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata UTF8*, 25666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ConversionFlags); 25766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 25866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions () : 25966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_conversion_function(NULL), 26066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_location(0), 26166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_process_sp(), 26266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_stream(NULL), 26366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_prefix_token('@'), 26466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_quote('"'), 26566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_source_size(0), 26666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_needs_zero_termination(true) 26766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 26866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 26966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 27066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 27166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetConversionFunction (ConvertFunctionType f) 27266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 27366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_conversion_function = f; 27466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 27566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 27666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 27766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ConvertFunctionType 27866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetConversionFunction () const 27966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 28066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_conversion_function; 28166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 28266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 28366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 28466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetLocation (uint64_t l) 28566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 28666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_location = l; 28766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 28866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 28966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 29066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint64_t 29166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetLocation () const 29266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 29366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_location; 29466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 29566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 29666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 29766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetProcessSP (ProcessSP p) 29866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 29966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_process_sp = p; 30066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 30166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 30266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 30366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ProcessSP 30466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetProcessSP () const 30566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 30666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_process_sp; 30766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 30866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 30966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 31066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetStream (Stream* s) 31166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 31266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_stream = s; 31366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 31466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 31566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 31666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata Stream* 31766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetStream () const 31866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 31966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_stream; 32066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 32166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 32266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 32366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetPrefixToken (char p) 32466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 32566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_prefix_token = p; 32666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 32766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 32866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 32966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata char 33066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetPrefixToken () const 33166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 33266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_prefix_token; 33366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 33466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 33566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 33666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetQuote (char q) 33766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 33866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_quote = q; 33966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 34066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 34166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 34266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata char 34366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetQuote () const 34466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 34566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_quote; 34666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 34766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 34866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 34966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetSourceSize (uint32_t s) 35066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 35166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_source_size = s; 35266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 35366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 35466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 35566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint32_t 35666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetSourceSize () const 35766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 35866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_source_size; 35966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 36066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 36166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 36266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetNeedsZeroTermination (bool z) 36366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 36466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_needs_zero_termination = z; 36566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 36666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 36766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 36866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata bool 36966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetNeedsZeroTermination () const 37066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 37166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_needs_zero_termination; 37266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 37366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 37466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granataprivate: 37566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ConvertFunctionType m_conversion_function; 37666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint64_t m_location; 37766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ProcessSP m_process_sp; 37866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata Stream* m_stream; 37966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata char m_prefix_token; 38066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata char m_quote; 38166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint32_t m_source_size; 38266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata bool m_needs_zero_termination; 38366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata}; 38466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 38566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granatatemplate<typename SourceDataType> 386cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatastatic bool 38766cd2b51a3e5003e2692215277525f79bb86c55bEnrico GranataReadUTFBufferAndDumpToStream (const ReadUTFBufferAndDumpToStreamOptions<SourceDataType>& options) 388cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 38966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (options.GetLocation() == 0 || options.GetLocation() == LLDB_INVALID_ADDRESS) 390cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 39166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 39266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ProcessSP process_sp(options.GetProcessSP()); 39366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 394cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!process_sp) 395cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 396cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 397347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi const int type_width = sizeof(SourceDataType); 398347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi const int origin_encoding = 8 * type_width ; 399cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32) 400cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 401cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // if not UTF8, I need a conversion function to return proper UTF8 40266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (origin_encoding != 8 && !options.GetConversionFunction()) 40366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return false; 40466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 40566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (!options.GetStream()) 406cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 407cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 40866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint32_t sourceSize = options.GetSourceSize(); 40966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata bool needs_zero_terminator = options.GetNeedsZeroTermination(); 41066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 41154f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata if (!sourceSize) 41266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 41354f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); 41466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata needs_zero_terminator = true; 41566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 41654f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata else 41754f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata sourceSize = std::min(sourceSize,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); 41854f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata 419347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi const int bufferSPSize = sourceSize * type_width; 420cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 421cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0)); 422cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 423cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!buffer_sp->GetBytes()) 424cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 425cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 426347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi Error error; 427347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi char *buffer = reinterpret_cast<char *>(buffer_sp->GetBytes()); 428347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 42966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata size_t data_read = 0; 43066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (needs_zero_terminator) 43166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata data_read = process_sp->ReadStringFromMemory(options.GetLocation(), buffer, bufferSPSize, error, type_width); 43266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata else 43366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata data_read = process_sp->ReadMemoryFromInferior(options.GetLocation(), (char*)buffer_sp->GetBytes(), bufferSPSize, error); 43466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 435cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (error.Fail() || data_read == 0) 436cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 43766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.GetStream()->Printf("unable to read data"); 438cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 439cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 440cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 441cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize()); 442cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 44366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return DumpUTFBufferToStream(options.GetConversionFunction(), data, *options.GetStream(), options.GetPrefixToken(), options.GetQuote(), sourceSize); 444cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 445cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 446f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 447f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream) 448f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 449f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 450f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!process_sp) 451f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 452f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 453f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 454f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 455f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!valobj_addr) 456f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 457f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 45866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 45966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(valobj_addr); 46066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 46166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 46266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 46366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('u'); 46466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 46566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (!ReadUTFBufferAndDumpToStream(options)) 466f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 467f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("Summary Unavailable"); 468f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 469f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 470f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 471f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 472f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 473f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 474f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 475f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char32StringSummaryProvider (ValueObject& valobj, Stream& stream) 476f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 477f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 478f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!process_sp) 479f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 480f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 481f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 482f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 483f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!valobj_addr) 484f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 485f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 48666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF32> options; 48766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(valobj_addr); 48866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF32toUTF8); 48966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 49066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 491bf5d9d4730cd1fedef4ff02ed25cc47be06e0c8aEnrico Granata options.SetPrefixToken('U'); 49266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 49366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (!ReadUTFBufferAndDumpToStream(options)) 494f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 495f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("Summary Unavailable"); 496f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 497f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 498f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 499f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 500f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 501f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 502f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 503f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::WCharStringSummaryProvider (ValueObject& valobj, Stream& stream) 504f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 50506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 50606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata if (!process_sp) 50706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 50806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 509b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata lldb::addr_t data_addr = 0; 510b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 511b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (valobj.IsPointerType()) 512b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata data_addr = valobj.GetValueAsUnsigned(0); 513b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata else if (valobj.IsArrayType()) 514b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata data_addr = valobj.GetAddressOf(); 51506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 516b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (data_addr == 0 || data_addr == LLDB_INVALID_ADDRESS) 51706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 51806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 51906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata clang::ASTContext* ast = valobj.GetClangAST(); 52006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 52106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata if (!ast) 52206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 52306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 52406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType()); 52506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 52606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata switch (wchar_size) 52706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata { 52806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 8: 52966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 53006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 8 53166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 53266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF8> options; 53366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(data_addr); 53466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(nullptr); 53566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 53666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 53766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('L'); 53866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 53966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream(options); 54066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 54106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 16: 54266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 54306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 16 54466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 54566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(data_addr); 54666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 54766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 54866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 54966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('L'); 55066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 55166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream(options); 55266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 55306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 32: 55466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 55506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 32 55666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF32> options; 55766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(data_addr); 55866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF32toUTF8); 55966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 56066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 56166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('L'); 56266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 56366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream(options); 56466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 565cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata default: 566cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("size for wchar_t is not valid"); 567cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 568cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 569cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 570cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 571cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 572cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 573cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream) 574cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 575cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 576cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 577cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 578cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 579cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode16, value); 580cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 581cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 582cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 583cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,data,stream, 'u','\'',1); 584cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 585cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 586cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 587cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream) 588cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 589cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 590cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 591cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 592cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 593cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode32, value); 594cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 595cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 596cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 597cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,data,stream, 'U','\'',1); 598cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 599cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 600cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 601cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream) 602cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 603cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 604cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 605cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 606cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata clang::ASTContext* ast = valobj.GetClangAST(); 607cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 608cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!ast) 609cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 610cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 611cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 612cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 613cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType()); 614cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 615cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata switch (wchar_size) 616cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 617cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 8: 618cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 8 619cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatChar, value); 620cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 621cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 622cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF8>(nullptr, 623cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 624cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 625cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 626cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 627cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 628cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 16: 629cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 16 630cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode16, value); 631cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 632cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 633cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8, 634cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 635cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 636cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 637cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 638cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 639cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 32: 640cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 32 641cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode32, value); 642cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 643cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 644cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8, 645cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 646cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 647cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 648cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 649cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 65006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata default: 65106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata stream.Printf("size for wchar_t is not valid"); 65206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return true; 65306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata } 65406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return true; 655f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 656f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 657b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// this function extracts information from a libcxx std::basic_string<> 658b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// irregardless of template arguments. it reports the size (in item count not bytes) 659b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata// and the location in memory where the string data can be found 660b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatastatic bool 661b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataExtractLibcxxStringInfo (ValueObject& valobj, 662b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP &location_sp, 663b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t& size) 664b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 665b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP D(valobj.GetChildAtIndexPath({0,0,0,0})); 666b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!D) 667b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 668b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 669b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP size_mode(D->GetChildAtIndexPath({1,0,0})); 670b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!size_mode) 671b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 672b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 673b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t size_mode_value(size_mode->GetValueAsUnsigned(0)); 674b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 675b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if ((size_mode_value & 1) == 0) // this means the string is in short-mode and the data is stored inline 676b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 677b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP s(D->GetChildAtIndex(1, true)); 678b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!s) 679b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 680b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata size = ((size_mode_value >> 1) % 256); 681b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata location_sp = s->GetChildAtIndex(1, true); 682b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return (location_sp.get() != nullptr); 683b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 684b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata else 685b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 686b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP l(D->GetChildAtIndex(0, true)); 687b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!l) 688b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 689b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata location_sp = l->GetChildAtIndex(2, true); 690b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP size_vo(l->GetChildAtIndex(1, true)); 691b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!size_vo || !location_sp) 692b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 693b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata size = size_vo->GetValueAsUnsigned(0); 694b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 695b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 696b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 697b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 698b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool 699b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream) 700b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 701b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t size = 0; 702b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP location_sp((ValueObject*)nullptr); 703b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) 704b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 705b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (size == 0) 706b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 707b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata stream.Printf("L\"\""); 708b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 709b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 710b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!location_sp) 711b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 712b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return WCharStringSummaryProvider(*location_sp.get(), stream); 713b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 714b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 715b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool 716b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream) 717b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 718b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t size = 0; 719b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP location_sp((ValueObject*)nullptr); 720b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) 721b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 722b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (size == 0) 723b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 724b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata stream.Printf("\"\""); 725b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 726b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 727b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!location_sp) 728b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 729b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata Error error; 73032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (location_sp->ReadPointedString(stream, 73132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata error, 73232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 0, // max length is decided by the settings 73332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata false) == 0) // do not honor array (terminates on first 0 byte even for a char[]) 73432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata stream.Printf("\"\""); // if nothing was read, print an empty string 735b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return error.Success(); 736b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 737b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 738280b30f0315211c54ce1c34366b586e9700629f4Enrico Granatabool 739280b30f0315211c54ce1c34366b586e9700629f4Enrico Granatalldb_private::formatters::ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream) 740280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata{ 741280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 742280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata if (!process_sp) 743280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return false; 744280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 745280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 746280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 747280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata if (!runtime) 748280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return false; 749280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 750d387b462eecb908af265ecc7006781b4532073adGreg Clayton ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptorFromISA(valobj.GetValueAsUnsigned(0))); 751280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 752280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 753280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return false; 754280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 755280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 756280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 757280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata if (!class_name || !*class_name) 758280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return false; 759280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 760280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata stream.Printf("%s",class_name); 761280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return true; 762280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata} 763280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 76439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granataclass ObjCClassSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd 76539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata{ 76639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granatapublic: 76739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata ObjCClassSyntheticChildrenFrontEnd (lldb::ValueObjectSP valobj_sp) : 76839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata SyntheticChildrenFrontEnd(*valobj_sp.get()) 76939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 77039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 77139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 77239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual size_t 77339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata CalculateNumChildren () 77439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 77539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return 0; 77639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 77739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 77839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual lldb::ValueObjectSP 77939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata GetChildAtIndex (size_t idx) 78039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 78139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return lldb::ValueObjectSP(); 78239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 78339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 78439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual bool 78539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata Update() 78639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 78739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return false; 78839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 78939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 79039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual bool 79139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata MightHaveChildren () 79239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 79339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return false; 79439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 79539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 79639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual size_t 79739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata GetIndexOfChildWithName (const ConstString &name) 79839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 79939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return UINT32_MAX; 80039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 80139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 80239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual 80339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata ~ObjCClassSyntheticChildrenFrontEnd () 80439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 80539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 80639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata}; 80739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 80839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico GranataSyntheticChildrenFrontEnd* 80939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granatalldb_private::formatters::ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 81039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata{ 81139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return new ObjCClassSyntheticChildrenFrontEnd(valobj_sp); 81239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata} 81339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 814caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool needs_at> 815caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 816f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream) 817caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 818caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 819caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 820caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 821caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 822caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 823caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 824caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 825caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 826caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 827caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 828caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 829caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 830caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 831caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 832caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_64bit = (process_sp->GetAddressByteSize() == 8); 833caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 834caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 835caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 836caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 837caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 838caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 839caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 840caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 8417685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 8427685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 8437685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 8447685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 845caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"NSConcreteData") || 846caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata !strcmp(class_name,"NSConcreteMutableData") || 847caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata !strcmp(class_name,"__NSCFData")) 848caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 849caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t offset = (is_64bit ? 16 : 8); 850caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 851caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error); 852caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 853caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 854caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 855caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 856caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 857f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "length", value)) 858caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 859caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 860caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 8615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea stream.Printf("%s%" PRIu64 " byte%s%s", 862caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (needs_at ? "@\"" : ""), 863caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value, 864caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (value > 1 ? "s" : ""), 865caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (needs_at ? "\"" : "")); 866caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 867caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 868caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 869caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 870f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granatastatic bool 871f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico GranataReadAsciiBufferAndDumpToStream (lldb::addr_t location, 872f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata lldb::ProcessSP& process_sp, 873f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata Stream& dest, 874fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uint32_t size = 0, 875f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata Error* error = NULL, 876f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata size_t *data_read = NULL, 877f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata char prefix_token = '@', 878f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata char quote = '"') 879f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata{ 880f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata Error my_error; 881f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata size_t my_data_read; 882f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (!process_sp || location == 0) 883f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata return false; 884f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 88554f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata if (!size) 88654f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); 88754f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata else 88854f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata size = std::min(size,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); 889f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 890f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(size,0)); 891f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 892f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata my_data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), size, my_error); 893f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 894f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (error) 895f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata *error = my_error; 896f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (data_read) 897f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata *data_read = my_data_read; 898f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 899f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (my_error.Fail()) 900f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata return false; 901f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (my_data_read) 902f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata dest.Printf("%c%c%s%c",prefix_token,quote,(char*)buffer_sp->GetBytes(),quote); 903f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 904f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata return true; 905f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata} 906f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 907fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#ifdef WANT_DEEP_PRINT 908fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granatastruct lldb__notInlineMutable { 909fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void *buffer; 910fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata signed long length; 911fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata signed long capacity; 912fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned int hasGap:1; 913fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned int isFixedCapacity:1; 914fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned int isExternalMutable:1; 915fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned int capacityProvidedExternally:1; 916fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#if __LP64__ 917fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned long desiredCapacity:60; 918fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#else 919fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned long desiredCapacity:28; 920fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#endif 921fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void* contentsAllocator; 922fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata}; 923fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 924fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granatastruct lldb__CFString { 925fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uintptr_t _cfisa; 926fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uint8_t _cfinfo[4]; 927fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uint32_t _rc; 928fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata union { 929fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata struct __inline1 { 930fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata signed long length; 931fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } inline1; 932fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata struct __notInlineImmutable1 { 933fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void *buffer; 934fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata signed long length; 935fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void* contentsDeallocator; 936fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } notInlineImmutable1; 937fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata struct __notInlineImmutable2 { 938fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void *buffer; 939fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void* contentsDeallocator; 940fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } notInlineImmutable2; 941fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata struct lldb__notInlineMutable notInlineMutable; 942fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } variants; 943fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata}; 944fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#endif 945fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 946caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 947f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream) 948caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 949caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 950caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 951caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 952caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 953caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 954caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 955caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 956caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 957caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 958caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 959caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 960caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 961caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 962caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 963caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 964caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 965caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 966caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 967caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 968caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 969caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 970caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 971caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 97225c9adecf763053ff953b4d437b022075d30dd13Enrico Granata if (!class_name || !*class_name) 97325c9adecf763053ff953b4d437b022075d30dd13Enrico Granata return false; 97425c9adecf763053ff953b4d437b022075d30dd13Enrico Granata 975caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t info_bits_location = valobj_addr + ptr_size; 976caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (process_sp->GetByteOrder() != lldb::eByteOrderLittle) 977caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata info_bits_location += 3; 978caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 979f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata Error error; 980caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 981caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error); 982caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 983caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 984caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 985caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_mutable = (info_bits & 1) == 1; 986caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_inline = (info_bits & 0x60) == 0; 987caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool has_explicit_length = (info_bits & (1 | 4)) != 4; 988caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_unicode = (info_bits & 0x10) == 0x10; 989caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_special = strcmp(class_name,"NSPathStore2") == 0; 990fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata bool has_null = (info_bits & 8) == 8; 991fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 992fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata size_t explicit_length = 0; 993fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata if (!has_null && has_explicit_length && !is_special) 994fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata { 995fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata lldb::addr_t explicit_length_offset = 2*ptr_size; 996fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata if (is_mutable and not is_inline) 997fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length_offset = explicit_length_offset + ptr_size; // notInlineMutable.length; 998fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata else if (is_inline) 999fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length = explicit_length + 0; // inline1.length; 1000fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata else if (not is_inline and not is_mutable) 1001fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length_offset = explicit_length_offset + ptr_size; // notInlineImmutable1.length; 1002fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata else 1003fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length_offset = 0; 1004fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 1005fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata if (explicit_length_offset) 1006fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata { 1007fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length_offset = valobj_addr + explicit_length_offset; 1008fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length = process_sp->ReadUnsignedIntegerFromMemory(explicit_length_offset, 4, 0, error); 1009fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } 1010fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } 1011fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 1012fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#ifdef WANT_DEEP_PRINT 1013fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata lldb__CFString my_string_data; 1014fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata process_sp->ReadMemory(valobj_addr, &my_string_data, sizeof(lldb__CFString),error); 1015fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 1016fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata printf(R"( 1017fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata __CFString my_string_data = { 1018fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uintptr_t _cfisa = %lu 1019fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uint8_t _cfinfo[4] = %c%c%c%c 1020fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uint32_t _rc = %d 1021fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata union { 1022fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata struct __inline1 { 1023fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata signed long length = %ld 1024fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } inline1; 1025fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata struct __notInlineImmutable1 { 1026fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void *buffer = %p 1027fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata signed long length = %ld 1028fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void* contentsDeallocator = %p 1029fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } notInlineImmutable1; 1030fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata struct __notInlineImmutable2 { 1031fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void *buffer = %p 1032fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void* contentsDeallocator = %p 1033fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } notInlineImmutable2; 1034fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata struct __notInlineMutable notInlineMutable { 1035fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void *buffer = %p 1036fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata signed long length = %ld 1037fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata signed long capacity = %ld 1038fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned int hasGap:1 = %d 1039fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned int isFixedCapacity:1 = %d 1040fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned int isExternalMutable:1 = %d 1041fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned int capacityProvidedExternally:1 = %d 1042fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#if __LP64__ 1043fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned long desiredCapacity:60 = %lu 1044fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#else 1045fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata unsigned long desiredCapacity:28 = %lu 1046fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#endif 1047fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata void* contentsAllocator = %p 1048fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } 104966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } variants; ==> (M:%dI:%dL:%zuU:%dS:%dN:%d) 1050fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata };\n)", 1051fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data._cfisa, 1052fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data._cfinfo[0],my_string_data._cfinfo[1],my_string_data._cfinfo[2],my_string_data._cfinfo[3], 1053fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data._rc, 1054fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.inline1.length, 1055fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineImmutable1.buffer, 1056fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineImmutable1.length, 1057fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineImmutable1.contentsDeallocator, 1058fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineImmutable2.buffer, 1059fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineImmutable2.contentsDeallocator, 1060fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.buffer, 1061fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.length, 1062fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.capacity, 1063fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.hasGap, 1064fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.isFixedCapacity, 1065fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.isExternalMutable, 1066fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.capacityProvidedExternally, 1067fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.desiredCapacity, 1068fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata my_string_data.variants.notInlineMutable.desiredCapacity, 106966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata my_string_data.variants.notInlineMutable.contentsAllocator, 107066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata is_mutable, 107166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata is_inline, 107266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata explicit_length, 107366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata is_unicode, 107466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata is_special, 107566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata has_null); 1076fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#endif 1077caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1078caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (strcmp(class_name,"NSString") && 1079caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"CFStringRef") && 1080caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"CFMutableStringRef") && 1081caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"__NSCFConstantString") && 1082caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"__NSCFString") && 1083caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSCFConstantString") && 1084caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSCFString") && 1085caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSPathStore2")) 1086caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1087f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata // not one of us - but tell me class name 1088f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata stream.Printf("class name = %s",class_name); 1089f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata return true; 1090caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1091caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1092caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_mutable) 1093caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1094caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = 2 * ptr_size + valobj_addr; 1095caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 1096caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 1097caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 1098caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (has_explicit_length and is_unicode) 109966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 110066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 110166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 110266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(location); 110366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 110466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 110566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('@'); 110666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetQuote('"'); 110766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetSourceSize(explicit_length); 110866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetNeedsZeroTermination(false); 110966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream (options); 111066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 1111caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 1112fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata return ReadAsciiBufferAndDumpToStream(location+1,process_sp,stream, explicit_length); 1113caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1114caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable) 1115caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1116caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = 3 * ptr_size + valobj_addr; 1117fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); 1118caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1119caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_unicode) 1120caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1121f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata uint64_t location = valobj_addr + 2*ptr_size; 1122caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_inline) 1123caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1124caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!has_explicit_length) 1125caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1126caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("found new combo"); 1127caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 1128caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1129caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 1130caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location += ptr_size; 113166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 1132caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 1133caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1134caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 1135caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 1136caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 1137caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 113866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 113966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 114066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(location); 114166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 114266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 114366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('@'); 114466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetQuote('"'); 114566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetSourceSize(explicit_length); 114666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetNeedsZeroTermination(has_explicit_length == false); 114766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream (options); 1148caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1149caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_special) 1150caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1151caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8); 115266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 115366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 115466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(location); 115566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 115666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 115766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('@'); 115866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetQuote('"'); 115966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetSourceSize(explicit_length); 116066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetNeedsZeroTermination(has_explicit_length == false); 116166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream (options); 1162caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1163caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_inline) 1164caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1165f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata uint64_t location = valobj_addr + 2*ptr_size; 1166caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!has_explicit_length) 1167caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location++; 1168fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); 1169caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1170caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 1171caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1172f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata uint64_t location = valobj_addr + 2*ptr_size; 1173caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 1174caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 1175caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 1176fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); 1177caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1178caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1179caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("class name = %s",class_name); 1180caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 1181caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1182caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 1183caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 11849abbfba957db139beed19866f61599424ddcd37aEnrico Granatabool 1185dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream) 1186dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{ 1187dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata TargetSP target_sp(valobj.GetTargetSP()); 1188dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (!target_sp) 1189dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1190dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata uint32_t addr_size = target_sp->GetArchitecture().GetAddressByteSize(); 1191dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata uint64_t pointee = valobj.GetValueAsUnsigned(0); 1192dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (!pointee) 1193dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1194dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata pointee += addr_size; 1195dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ClangASTType type(valobj.GetClangAST(),valobj.GetClangType()); 1196dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ExecutionContext exe_ctx(target_sp,false); 1197dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ValueObjectSP child_ptr_sp(valobj.CreateValueObjectFromAddress("string_ptr", pointee, exe_ctx, type)); 1198dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (!child_ptr_sp) 1199dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1200dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata DataExtractor data; 1201dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata child_ptr_sp->GetData(data); 1202dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData("string_data", data, exe_ctx, type)); 1203dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata child_sp->GetValueAsUnsigned(0); 1204dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (child_sp) 1205dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return NSStringSummaryProvider(*child_sp, stream); 1206dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1207dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata} 1208dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata 1209dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool 1210dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream) 1211dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{ 1212dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return NSAttributedStringSummaryProvider(valobj, stream); 1213dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata} 1214dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata 1215dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool 12169abbfba957db139beed19866f61599424ddcd37aEnrico Granatalldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream) 12179abbfba957db139beed19866f61599424ddcd37aEnrico Granata{ 12189abbfba957db139beed19866f61599424ddcd37aEnrico Granata stream.Printf("%s",valobj.GetObjectDescription()); 12199abbfba957db139beed19866f61599424ddcd37aEnrico Granata return true; 12209abbfba957db139beed19866f61599424ddcd37aEnrico Granata} 12219abbfba957db139beed19866f61599424ddcd37aEnrico Granata 1222db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool 1223db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream) 1224db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{ 1225db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata const uint32_t type_info = ClangASTContext::GetTypeInfo(valobj.GetClangType(), 1226db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata valobj.GetClangAST(), 1227db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata NULL); 1228db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1229db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata ValueObjectSP real_guy_sp = valobj.GetSP(); 1230db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1231db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (type_info & ClangASTContext::eTypeIsPointer) 1232db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1233db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata Error err; 1234db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata real_guy_sp = valobj.Dereference(err); 1235db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (err.Fail() || !real_guy_sp) 1236db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return false; 1237db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 1238db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata else if (type_info & ClangASTContext::eTypeIsReference) 1239db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1240db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata real_guy_sp = valobj.GetChildAtIndex(0, true); 1241db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (!real_guy_sp) 1242db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return false; 1243db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 1244db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata uint64_t value = real_guy_sp->GetValueAsUnsigned(0); 1245db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (value == 0) 1246db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1247db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("NO"); 1248db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1249db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 1250db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("YES"); 1251db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1252db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata} 1253db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1254db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate <bool is_sel_ptr> 1255db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool 1256db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream) 1257db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{ 12581f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata lldb::ValueObjectSP valobj_sp; 1259db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 12601f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (!valobj.GetClangAST()) 1261db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return false; 1262db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata void* char_opaque_type = valobj.GetClangAST()->CharTy.getAsOpaquePtr(); 12631f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (!char_opaque_type) 12641f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 1265db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata ClangASTType charstar(valobj.GetClangAST(),ClangASTType::GetPointerType(valobj.GetClangAST(), char_opaque_type)); 12661f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata 12671f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata ExecutionContext exe_ctx(valobj.GetExecutionContextRef()); 1268db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 12691f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (is_sel_ptr) 12701f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata { 12711f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata lldb::addr_t data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); 12721f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (data_address == LLDB_INVALID_ADDRESS) 12731f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 12741f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address, exe_ctx, charstar); 12751f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata } 12761f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata else 12771f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata { 12781f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata DataExtractor data; 12791f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj.GetData(data); 12801f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj_sp = ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar); 12811f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata } 12821f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata 12831f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (!valobj_sp) 12841f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 1285db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1286db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("%s",valobj_sp->GetSummaryAsCString()); 1287db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1288db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata} 1289db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1290cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata// POSIX has an epoch on Jan-1-1970, but Cocoa prefers Jan-1-2001 1291cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata// this call gives the POSIX equivalent of the Cocoa epoch 1292cba09f60618744e2155bc97c9049fa9c797698adEnrico Granatatime_t 1293cc5d27417b9f958d596a438290a9adb17674b487Enrico Granatalldb_private::formatters::GetOSXEpoch () 1294cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata{ 1295cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata static time_t epoch = 0; 1296cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata if (!epoch) 1297cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata { 1298cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tzset(); 1299cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm tm_epoch; 1300cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_sec = 0; 1301cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_hour = 0; 1302cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_min = 0; 1303cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_mon = 0; 1304cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_mday = 1; 1305cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_year = 2001-1900; // for some reason, we need to subtract 1900 from this field. not sure why. 1306cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_isdst = -1; 1307cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_gmtoff = 0; 1308cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_zone = NULL; 1309cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata epoch = timegm(&tm_epoch); 1310cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata } 1311cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata return epoch; 1312cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata} 1313cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata 1314ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t 1315ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::ExtractIndexFromString (const char* item_name) 1316f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1317ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!item_name || !*item_name) 1318ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 1319ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (*item_name != '[') 1320ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 1321ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata item_name++; 1322ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata char* endptr = NULL; 1323ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata unsigned long int idx = ::strtoul(item_name, &endptr, 0); 1324ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (idx == 0 && endptr == item_name) 1325ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 1326ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (idx == ULONG_MAX) 1327ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 1328ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return idx; 1329ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 1330ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 133132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp, 133232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ConstString item_name) : 133332d7ee3d2969211e104a27fcfcd636f249b26559Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()), 133432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_exe_ctx_ref(), 133532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_item_name(item_name), 133632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_item_sp() 1337f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 133832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (valobj_sp) 133932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata Update(); 1340f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1341f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1342f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool 134332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::Update() 1344f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1345d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata m_item_sp.reset(); 1346d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata 1347247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 1348ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!valobj_sp) 1349ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 135032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 1351247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!valobj_sp) 1352247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 135332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 135432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ValueObjectSP item_ptr(valobj_sp->GetChildMemberWithName(m_item_name,true)); 135532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (!item_ptr) 1356ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 135732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (item_ptr->GetValueAsUnsigned(0) == 0) 1358689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 135932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata Error err; 136032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 136132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata m_item_sp = ValueObject::CreateValueObjectFromAddress("item", item_ptr->GetValueAsUnsigned(0), m_exe_ctx_ref, ClangASTType(item_ptr->GetClangAST(),ClangASTType::GetPointeeType(item_ptr->GetClangType()))); 136232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (err.Fail()) 136332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata m_item_sp.reset(); 1364d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata return false; 1365689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1366689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1367689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t 136832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::CalculateNumChildren () 1369689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 137032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return 1; 1371689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1372689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1373689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb::ValueObjectSP 137432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) 1375689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 137632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (idx == 0) 137732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return m_item_sp; 137832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return lldb::ValueObjectSP(); 1379689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1380689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1381689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool 138232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::MightHaveChildren () 1383689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 1384689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return true; 1385689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1386689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1387689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t 138832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 1389689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 139032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (name == ConstString("item")) 139132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return 0; 139232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return UINT32_MAX; 1393689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1394689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 139532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::~VectorIteratorSyntheticFrontEnd () 1396689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 1397689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1398689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1399caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 1400f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&) ; 1401caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1402caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 1403f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&) ; 1404db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1405db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool 1406db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<true> (ValueObject&, Stream&) ; 1407db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1408db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool 1409db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<false> (ValueObject&, Stream&) ; 1410