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 10884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec#include "lldb/lldb-python.h" 11884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec 12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/CXXFormatterFunctions.h" 13caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 142a64f9ad2f6abf7a43bb03346a5af50f9df204f7Dmitri Gribenko#include "llvm/Support/ConvertUTF.h" 15caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 16f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/DataBufferHeap.h" 17f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/Error.h" 18caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/Stream.h" 19caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Core/ValueObject.h" 20f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Core/ValueObjectConstResult.h" 21f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata#include "lldb/Host/Endian.h" 22db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Symbol/ClangASTContext.h" 23caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/ObjCLanguageRuntime.h" 24caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata#include "lldb/Target/Target.h" 25caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 26fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata#include <algorithm> 27fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 28caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb; 29caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private; 30caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatausing namespace lldb_private::formatters; 31caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 32caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 33f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj, 34f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* target_type, 35f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 36f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t &value) 37caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 38caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target_type || !*target_type) 39caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 40caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!selector || !*selector) 41caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 42caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StreamString expr; 43b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); 44caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 45caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::ValueObjectSP result_sp; 46caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Target* target = exe_ctx.GetTargetPtr(); 47caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 48caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!target || !stack_frame) 49caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 50d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 5147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 52d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options.SetCoerceToId(false) 53d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata .SetUnwindOnError(true) 5499611fe5a2a450087e7d9cbdb91c7d3fdcb5a5c2Sean Callanan .SetKeepInMemory(true); 55d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata 56caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata target->EvaluateExpression(expr.GetData(), 57caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stack_frame, 58d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata result_sp, 59d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata options); 60caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!result_sp) 61caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 62caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = result_sp->GetValueAsUnsigned(0); 63caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 64caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 65caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 66ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatabool 67ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::ExtractSummaryFromObjCExpression (ValueObject &valobj, 68ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata const char* target_type, 69ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata const char* selector, 70ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Stream &stream) 71ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata{ 72ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!target_type || !*target_type) 73ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 74ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!selector || !*selector) 75ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 76ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata StreamString expr; 7704d3bb2436e3cbecd3d461715aaf5cc99e93c828Enrico Granata expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); 78ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 79ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata lldb::ValueObjectSP result_sp; 80ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 81ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 82ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!target || !stack_frame) 83ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 84ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 85ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata EvaluateExpressionOptions options; 86ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata options.SetCoerceToId(false) 87ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata .SetUnwindOnError(true) 88ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata .SetKeepInMemory(true) 89ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 90ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 91ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata target->EvaluateExpression(expr.GetData(), 92ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata stack_frame, 93ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata result_sp, 94ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata options); 95ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!result_sp) 96ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 97ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata stream.Printf("%s",result_sp->GetSummaryAsCString()); 98ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return true; 99ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 100ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 101f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 102f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, 103f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* return_type, 104f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 105f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata uint64_t index) 106f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 107f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp; 108f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!return_type || !*return_type) 109f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 110f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!selector || !*selector) 111f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 112f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr_path_stream; 113f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 114f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 1155f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index); 116f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 117f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP result_sp; 118f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 119f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 120f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target || !stack_frame) 121f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 122f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 12347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 124f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options.SetCoerceToId(false) 125f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUnwindOnError(true) 126f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetKeepInMemory(true) 127f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 128f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 129f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target->EvaluateExpression(expr.GetData(), 130f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata stack_frame, 131f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp, 132f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options); 133f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 134f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 135f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 136f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb::ValueObjectSP 137f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, 138f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* return_type, 139f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* selector, 140f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata const char* key) 141f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 142f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP valobj_sp; 143f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!return_type || !*return_type) 144f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 145f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!selector || !*selector) 146f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 147f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!key || !*key) 148f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 149f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr_path_stream; 150f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj.GetExpressionPath(expr_path_stream, false); 151f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StreamString expr; 152f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key); 153f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); 154f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata lldb::ValueObjectSP result_sp; 155f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata Target* target = exe_ctx.GetTargetPtr(); 156f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata StackFrame* stack_frame = exe_ctx.GetFramePtr(); 157f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!target || !stack_frame) 158f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 159f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 16047beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham EvaluateExpressionOptions options; 161f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options.SetCoerceToId(false) 162f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUnwindOnError(true) 163f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetKeepInMemory(true) 164f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata .SetUseDynamic(lldb::eDynamicCanRunTarget); 165f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 166f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata target->EvaluateExpression(expr.GetData(), 167f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata stack_frame, 168f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata valobj_sp, 169f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata options); 170f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata return valobj_sp; 171f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 172f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 173cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata// use this call if you already have an LLDB-side buffer for the data 174cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType> 175f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatastatic bool 176cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico GranataDumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType**, 177cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const SourceDataType*, 178cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata UTF8**, 179cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata UTF8*, 180cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata ConversionFlags), 181cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor& data, 182cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata Stream& stream, 183cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata char prefix_token = '@', 184cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata char quote = '"', 185fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uint32_t sourceSize = 0) 186f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 187cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (prefix_token != 0) 188cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",prefix_token); 189cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (quote != 0) 190cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",quote); 191cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (data.GetByteSize() && data.GetDataStart() && data.GetDataEnd()) 192f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 193cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const int bufferSPSize = data.GetByteSize(); 194cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (sourceSize == 0) 195cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 196cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata const int origin_encoding = 8*sizeof(SourceDataType); 1970cd33406723ceed5c08d41ff6946006298f3f133Greg Clayton sourceSize = bufferSPSize/(origin_encoding / 4); 198cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 199cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 200cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata SourceDataType *data_ptr = (SourceDataType*)data.GetDataStart(); 201f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata SourceDataType *data_end_ptr = data_ptr + sourceSize; 202f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 203f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata while (data_ptr < data_end_ptr) 204f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 205f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!*data_ptr) 206f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 207f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata data_end_ptr = data_ptr; 208f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata break; 209f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 210f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata data_ptr++; 211f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 212f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 213cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data_ptr = (SourceDataType*)data.GetDataStart(); 214f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 21506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata lldb::DataBufferSP utf8_data_buffer_sp; 21606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata UTF8* utf8_data_ptr = nullptr; 21706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata UTF8* utf8_data_end_ptr = nullptr; 218cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 219f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (ConvertFunction) 22006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata { 22166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata utf8_data_buffer_sp.reset(new DataBufferHeap(4*bufferSPSize,0)); 22206d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); 22366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata utf8_data_end_ptr = utf8_data_ptr + utf8_data_buffer_sp->GetByteSize(); 224f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ConvertFunction ( (const SourceDataType**)&data_ptr, data_end_ptr, &utf8_data_ptr, utf8_data_end_ptr, lenientConversion ); 22506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); // needed because the ConvertFunction will change the value of the data_ptr 22606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata } 227f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata else 228f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 229f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata // just copy the pointers - the cast is necessary to make the compiler happy 230f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata // but this should only happen if we are reading UTF8 data 231f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata utf8_data_ptr = (UTF8*)data_ptr; 232f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata utf8_data_end_ptr = (UTF8*)data_end_ptr; 233f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 234f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 235b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // since we tend to accept partial data (and even partially malformed data) 236b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // we might end up with no NULL terminator before the end_ptr 237b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata // hence we need to take a slower route and ensure we stay within boundaries 238f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata for (;utf8_data_ptr != utf8_data_end_ptr; utf8_data_ptr++) 239f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 240f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!*utf8_data_ptr) 241f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata break; 242f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("%c",*utf8_data_ptr); 243f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 244f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 245cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (quote != 0) 246cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%c",quote); 247f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 248f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 249f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 250cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatatemplate<typename SourceDataType> 25166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granataclass ReadUTFBufferAndDumpToStreamOptions 25266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata{ 25366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granatapublic: 25466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata typedef ConversionResult (*ConvertFunctionType) (const SourceDataType**, 25566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata const SourceDataType*, 25666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata UTF8**, 25766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata UTF8*, 25866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ConversionFlags); 25966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 26066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions () : 26166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_conversion_function(NULL), 26266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_location(0), 26366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_process_sp(), 26466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_stream(NULL), 26566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_prefix_token('@'), 26666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_quote('"'), 26766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_source_size(0), 26866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_needs_zero_termination(true) 26966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 27066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 27166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 27266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 27366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetConversionFunction (ConvertFunctionType f) 27466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 27566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_conversion_function = f; 27666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 27766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 27866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 27966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ConvertFunctionType 28066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetConversionFunction () const 28166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 28266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_conversion_function; 28366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 28466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 28566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 28666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetLocation (uint64_t l) 28766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 28866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_location = l; 28966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 29066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 29166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 29266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint64_t 29366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetLocation () const 29466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 29566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_location; 29666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 29766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 29866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 29966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetProcessSP (ProcessSP p) 30066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 30166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_process_sp = p; 30266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 30366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 30466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 30566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ProcessSP 30666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetProcessSP () const 30766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 30866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_process_sp; 30966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 31066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 31166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 31266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetStream (Stream* s) 31366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 31466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_stream = s; 31566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 31666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 31766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 31866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata Stream* 31966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetStream () const 32066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 32166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_stream; 32266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 32366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 32466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 32566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetPrefixToken (char p) 32666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 32766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_prefix_token = p; 32866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 32966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 33066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 33166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata char 33266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetPrefixToken () const 33366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 33466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_prefix_token; 33566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 33666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 33766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 33866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetQuote (char q) 33966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 34066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_quote = q; 34166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 34266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 34366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 34466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata char 34566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetQuote () const 34666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 34766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_quote; 34866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 34966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 35066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 35166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetSourceSize (uint32_t s) 35266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 35366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_source_size = s; 35466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 35566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 35666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 35766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint32_t 35866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetSourceSize () const 35966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 36066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_source_size; 36166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 36266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 36366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions& 36466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata SetNeedsZeroTermination (bool z) 36566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 36666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata m_needs_zero_termination = z; 36766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return *this; 36866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 36966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 37066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata bool 37166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata GetNeedsZeroTermination () const 37266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 37366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return m_needs_zero_termination; 37466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 37566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 37666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granataprivate: 37766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ConvertFunctionType m_conversion_function; 37866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint64_t m_location; 37966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ProcessSP m_process_sp; 38066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata Stream* m_stream; 38166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata char m_prefix_token; 38266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata char m_quote; 38366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint32_t m_source_size; 38466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata bool m_needs_zero_termination; 38566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata}; 38666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 38766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granatatemplate<typename SourceDataType> 388cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatastatic bool 38966cd2b51a3e5003e2692215277525f79bb86c55bEnrico GranataReadUTFBufferAndDumpToStream (const ReadUTFBufferAndDumpToStreamOptions<SourceDataType>& options) 390cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 39166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (options.GetLocation() == 0 || options.GetLocation() == LLDB_INVALID_ADDRESS) 392cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 39366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 39466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ProcessSP process_sp(options.GetProcessSP()); 39566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 396cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!process_sp) 397cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 398cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 399347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi const int type_width = sizeof(SourceDataType); 400347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi const int origin_encoding = 8 * type_width ; 401cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32) 402cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 403cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // if not UTF8, I need a conversion function to return proper UTF8 40466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (origin_encoding != 8 && !options.GetConversionFunction()) 40566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return false; 40666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 40766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (!options.GetStream()) 408cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 409cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 41066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata uint32_t sourceSize = options.GetSourceSize(); 41166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata bool needs_zero_terminator = options.GetNeedsZeroTermination(); 41266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 41354f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata if (!sourceSize) 41466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 41554f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); 41666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata needs_zero_terminator = true; 41766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 41854f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata else 41954f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata sourceSize = std::min(sourceSize,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); 42054f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata 421347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi const int bufferSPSize = sourceSize * type_width; 422cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 423cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0)); 424cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 425cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!buffer_sp->GetBytes()) 426cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 427cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 428347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi Error error; 429347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi char *buffer = reinterpret_cast<char *>(buffer_sp->GetBytes()); 430347d722127cc6a19b077244305c3d350ea4ef80eAshok Thirumurthi 43166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata size_t data_read = 0; 43266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (needs_zero_terminator) 43366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata data_read = process_sp->ReadStringFromMemory(options.GetLocation(), buffer, bufferSPSize, error, type_width); 43466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata else 43566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata data_read = process_sp->ReadMemoryFromInferior(options.GetLocation(), (char*)buffer_sp->GetBytes(), bufferSPSize, error); 43666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 437cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (error.Fail() || data_read == 0) 438cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 43966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.GetStream()->Printf("unable to read data"); 440cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 441cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 442cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 443cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize()); 444cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 44566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return DumpUTFBufferToStream(options.GetConversionFunction(), data, *options.GetStream(), options.GetPrefixToken(), options.GetQuote(), sourceSize); 446cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 447cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 448f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 449f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream) 450f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 451f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 452f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!process_sp) 453f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 454f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 455f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 456f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 457f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!valobj_addr) 458f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 459f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 46066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 46166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(valobj_addr); 46266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 46366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 46466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 46566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('u'); 46666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 46766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (!ReadUTFBufferAndDumpToStream(options)) 468f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 469f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("Summary Unavailable"); 470f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 471f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 472f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 473f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 474f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 475f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 476f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 477f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::Char32StringSummaryProvider (ValueObject& valobj, Stream& stream) 478f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 479f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 480f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!process_sp) 481f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 482f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 483f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 484f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 485f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata if (!valobj_addr) 486f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return false; 487f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 48866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF32> options; 48966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(valobj_addr); 49066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF32toUTF8); 49166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 49266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 493bf5d9d4730cd1fedef4ff02ed25cc47be06e0c8aEnrico Granata options.SetPrefixToken('U'); 49466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 49566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata if (!ReadUTFBufferAndDumpToStream(options)) 496f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata { 497f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata stream.Printf("Summary Unavailable"); 498f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 499f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata } 500f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 501f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata return true; 502f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 503f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 504f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatabool 505f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granatalldb_private::formatters::WCharStringSummaryProvider (ValueObject& valobj, Stream& stream) 506f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata{ 50706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 50806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata if (!process_sp) 50906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 51006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 511b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata lldb::addr_t data_addr = 0; 512b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 513b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (valobj.IsPointerType()) 514b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata data_addr = valobj.GetValueAsUnsigned(0); 515b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata else if (valobj.IsArrayType()) 516b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata data_addr = valobj.GetAddressOf(); 51706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 518b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (data_addr == 0 || data_addr == LLDB_INVALID_ADDRESS) 51906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 52006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 52152f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::ASTContext* ast = valobj.GetClangType().GetASTContext(); 52252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 52306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata if (!ast) 52406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return false; 52506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 52652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType wchar_clang_type = ClangASTContext::GetBasicType(ast, lldb::eBasicTypeWChar); 52752f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t wchar_size = wchar_clang_type.GetBitSize(); 52806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata 52906d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata switch (wchar_size) 53006d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata { 53106d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 8: 53266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 53306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 8 53466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 53566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF8> options; 53666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(data_addr); 53766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(nullptr); 53866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 53966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 54066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('L'); 54166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 54266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream(options); 54366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 54406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 16: 54566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 54606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 16 54766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 54866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(data_addr); 54966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 55066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 55166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 55266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('L'); 55366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 55466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream(options); 55566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 55606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata case 32: 55766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 55806d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata // utf 32 55966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF32> options; 56066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(data_addr); 56166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF32toUTF8); 56266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 56366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 56466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('L'); 56566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata 56666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream(options); 56766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 568cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata default: 569cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("size for wchar_t is not valid"); 570cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 571cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata } 572cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return true; 573cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 574cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 575cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 576cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream) 577cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 578cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 579cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 580cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 581cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 582cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode16, value); 583cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 584cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 585cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 586cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,data,stream, 'u','\'',1); 587cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 588cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 589cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 590cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream) 591cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 592cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 593cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 594cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 595cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 596cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode32, value); 597cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 598cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 599cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 600cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,data,stream, 'U','\'',1); 601cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata} 602cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 603cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatabool 604cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granatalldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream) 605cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata{ 606cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata DataExtractor data; 607cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetData(data); 608cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 60952f792329be5db8e38961350589e97e8f2823acdGreg Clayton clang::ASTContext* ast = valobj.GetClangType().GetASTContext(); 610cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 611cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!ast) 612cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return false; 613cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 61452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType wchar_clang_type = ClangASTContext::GetBasicType(ast, lldb::eBasicTypeWChar); 61552f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t wchar_size = wchar_clang_type.GetBitSize(); 616cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata std::string value; 617cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 618cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata switch (wchar_size) 619cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata { 620cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 8: 621cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 8 622cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatChar, value); 623cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 624cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 625cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF8>(nullptr, 626cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 627cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 628cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 629cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 630cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 631cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 16: 632cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 16 633cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode16, value); 634cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 635cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 636cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8, 637cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 638cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 639cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 640cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 641cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 642cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata case 32: 643cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata // utf 32 644cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata valobj.GetValueAsCString(lldb::eFormatUnicode32, value); 645cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata if (!value.empty()) 646cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream.Printf("%s ", value.c_str()); 647cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8, 648cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata data, 649cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata stream, 650cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 'L', 651cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata '\'', 652cd8cd61e7280b9c050a85ba29fa4d3b20737df3aEnrico Granata 1); 65306d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata default: 65406d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata stream.Printf("size for wchar_t is not valid"); 65506d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return true; 65606d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata } 65706d58b0c68d98bfef948861e722789d7c7b1172cEnrico Granata return true; 658f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata} 659f5545f966367811c36e2a3db2d82b1398b58c2c4Enrico Granata 660829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata// the field layout in a libc++ string (cap, side, data or data, size, cap) 661829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granataenum LibcxxStringLayoutMode 662829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata{ 663829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata eLibcxxStringLayoutModeCSD = 0, 664829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata eLibcxxStringLayoutModeDSC = 1, 665829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata eLibcxxStringLayoutModeInvalid = 0xffff 666829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata}; 667829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata 668829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata// this function abstracts away the layout and mode details of a libc++ string 669829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata// and returns the address of the data and the size ready for callers to consume 670b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatastatic bool 671b6985793ce97364e6fa86643b942326b218dcb3dEnrico GranataExtractLibcxxStringInfo (ValueObject& valobj, 672b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP &location_sp, 673b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t& size) 674b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 675b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP D(valobj.GetChildAtIndexPath({0,0,0,0})); 676b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!D) 677b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 678b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 679829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata ValueObjectSP layout_decider(D->GetChildAtIndexPath({0,0})); 680829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata 681829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata // this child should exist 682829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata if (!layout_decider) 683b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 684b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 685829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata ConstString g_data_name("__data_"); 686829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata ConstString g_size_name("__size_"); 687829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata bool short_mode = false; // this means the string is in short-mode and the data is stored inline 688829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata LibcxxStringLayoutMode layout = (layout_decider->GetName() == g_data_name) ? eLibcxxStringLayoutModeDSC : eLibcxxStringLayoutModeCSD; 689829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata uint64_t size_mode_value = 0; 690829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata 691829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata if (layout == eLibcxxStringLayoutModeDSC) 692829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata { 693829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata ValueObjectSP size_mode(D->GetChildAtIndexPath({1,1,0})); 694829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata if (!size_mode) 695829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata return false; 696829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata 697829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata if (size_mode->GetName() != g_size_name) 698829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata { 699829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata // we are hitting the padding structure, move along 700829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata size_mode = D->GetChildAtIndexPath({1,1,1}); 701829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata if (!size_mode) 702829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata return false; 703829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata } 704829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata 705829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata size_mode_value = (size_mode->GetValueAsUnsigned(0)); 706829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata short_mode = ((size_mode_value & 0x80) == 0); 707829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata } 708829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata else 709829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata { 710829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata ValueObjectSP size_mode(D->GetChildAtIndexPath({1,0,0})); 711829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata if (!size_mode) 712829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata return false; 713829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata 714829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata size_mode_value = (size_mode->GetValueAsUnsigned(0)); 715829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata short_mode = ((size_mode_value & 1) == 0); 716829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata } 717b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 718829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata if (short_mode) 719b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 720b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP s(D->GetChildAtIndex(1, true)); 721b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!s) 722b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 723829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata location_sp = s->GetChildAtIndex((layout == eLibcxxStringLayoutModeDSC) ? 0 : 1, true); 724829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata size = (layout == eLibcxxStringLayoutModeDSC) ? size_mode_value : ((size_mode_value >> 1) % 256); 725b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return (location_sp.get() != nullptr); 726b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 727b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata else 728b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 729b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP l(D->GetChildAtIndex(0, true)); 730b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!l) 731b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 732829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata // we can use the layout_decider object as the data pointer 733829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata location_sp = (layout == eLibcxxStringLayoutModeDSC) ? layout_decider : l->GetChildAtIndex(2, true); 734b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP size_vo(l->GetChildAtIndex(1, true)); 735b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!size_vo || !location_sp) 736b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 737b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata size = size_vo->GetValueAsUnsigned(0); 738b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 739b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 740b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 741b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 742b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool 743b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream) 744b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 745b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t size = 0; 746b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP location_sp((ValueObject*)nullptr); 747b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) 748b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 749b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (size == 0) 750b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 751b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata stream.Printf("L\"\""); 752b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 753829526245fc45b968bb7d0beef6f2d8b01bb52e5Enrico Granata } 754b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!location_sp) 755b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 756b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return WCharStringSummaryProvider(*location_sp.get(), stream); 757b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 758b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 759b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatabool 760b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granatalldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream) 761b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata{ 762b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata uint64_t size = 0; 763b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata ValueObjectSP location_sp((ValueObject*)nullptr); 764b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) 765b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 766b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (size == 0) 767b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata { 768b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata stream.Printf("\"\""); 769b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return true; 770b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata } 771b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata if (!location_sp) 772b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return false; 773b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata Error error; 77432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (location_sp->ReadPointedString(stream, 77532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata error, 77632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 0, // max length is decided by the settings 77732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata false) == 0) // do not honor array (terminates on first 0 byte even for a char[]) 77832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata stream.Printf("\"\""); // if nothing was read, print an empty string 779b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata return error.Success(); 780b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata} 781b6985793ce97364e6fa86643b942326b218dcb3dEnrico Granata 782280b30f0315211c54ce1c34366b586e9700629f4Enrico Granatabool 783280b30f0315211c54ce1c34366b586e9700629f4Enrico Granatalldb_private::formatters::ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream) 784280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata{ 785280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 786280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata if (!process_sp) 787280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return false; 788280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 789280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 790280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 791280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata if (!runtime) 792280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return false; 793280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 794d387b462eecb908af265ecc7006781b4532073adGreg Clayton ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptorFromISA(valobj.GetValueAsUnsigned(0))); 795280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 796280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata if (!descriptor.get() || !descriptor->IsValid()) 797280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return false; 798280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 799280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 800280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 801280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata if (!class_name || !*class_name) 802280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return false; 803280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 804280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata stream.Printf("%s",class_name); 805280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata return true; 806280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata} 807280b30f0315211c54ce1c34366b586e9700629f4Enrico Granata 80839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granataclass ObjCClassSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd 80939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata{ 81039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granatapublic: 81139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata ObjCClassSyntheticChildrenFrontEnd (lldb::ValueObjectSP valobj_sp) : 81239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata SyntheticChildrenFrontEnd(*valobj_sp.get()) 81339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 81439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 81539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 81639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual size_t 81739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata CalculateNumChildren () 81839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 81939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return 0; 82039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 82139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 82239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual lldb::ValueObjectSP 82339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata GetChildAtIndex (size_t idx) 82439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 82539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return lldb::ValueObjectSP(); 82639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 82739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 82839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual bool 82939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata Update() 83039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 83139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return false; 83239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 83339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 83439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual bool 83539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata MightHaveChildren () 83639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 83739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return false; 83839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 83939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 84039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual size_t 84139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata GetIndexOfChildWithName (const ConstString &name) 84239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 84339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return UINT32_MAX; 84439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 84539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 84639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata virtual 84739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata ~ObjCClassSyntheticChildrenFrontEnd () 84839ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata { 84939ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata } 85039ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata}; 85139ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 85239ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico GranataSyntheticChildrenFrontEnd* 85339ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granatalldb_private::formatters::ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) 85439ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata{ 85539ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata return new ObjCClassSyntheticChildrenFrontEnd(valobj_sp); 85639ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata} 85739ebb982b3f9de4a15744078e9c6ba231187b5dcEnrico Granata 858caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate<bool needs_at> 859caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 860f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream) 861caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 862caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 863caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 864caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 865caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 866caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 867caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 868caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 869caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 870caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 871caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 872caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 873caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 874caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 875caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 876caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_64bit = (process_sp->GetAddressByteSize() == 8); 877caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 878caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 879caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 880caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 881caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 882caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t value = 0; 883caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 884caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 8857685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 8867685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata if (!class_name || !*class_name) 8877685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata return false; 8887685a56184b3e8639a42f26e5b8aba9e70b85647Enrico Granata 889caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!strcmp(class_name,"NSConcreteData") || 890caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata !strcmp(class_name,"NSConcreteMutableData") || 891caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata !strcmp(class_name,"__NSCFData")) 892caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 893caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t offset = (is_64bit ? 16 : 8); 894caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata Error error; 895caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error); 896caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 897caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 898caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 899caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 900caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 901f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata if (!ExtractValueFromObjCExpression(valobj, "int", "length", value)) 902caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 903caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 904caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 9055f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea stream.Printf("%s%" PRIu64 " byte%s%s", 906caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (needs_at ? "@\"" : ""), 907caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata value, 9087b61b79d4a6a606b8efc11d7a8b2aa63a9880d46Enrico Granata (value != 1 ? "s" : ""), 909caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata (needs_at ? "\"" : "")); 910caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 911caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 912caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 913caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 914f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granatastatic bool 915f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico GranataReadAsciiBufferAndDumpToStream (lldb::addr_t location, 916f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata lldb::ProcessSP& process_sp, 917f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata Stream& dest, 918fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata uint32_t size = 0, 919f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata Error* error = NULL, 920f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata size_t *data_read = NULL, 921f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata char prefix_token = '@', 922f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata char quote = '"') 923f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata{ 924f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata Error my_error; 925f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata size_t my_data_read; 926f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (!process_sp || location == 0) 927f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata return false; 928f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 92954f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata if (!size) 93054f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata size = process_sp->GetTarget().GetMaximumSizeOfStringSummary(); 93154f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata else 93254f30207231b5b9fe4ed6ca05f6774618326b27dEnrico Granata size = std::min(size,process_sp->GetTarget().GetMaximumSizeOfStringSummary()); 933f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 934f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata lldb::DataBufferSP buffer_sp(new DataBufferHeap(size,0)); 935f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 936f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata my_data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), size, my_error); 937f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 938f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (error) 939f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata *error = my_error; 940f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (data_read) 941f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata *data_read = my_data_read; 942f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 943f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (my_error.Fail()) 944f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata return false; 945d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata 946d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata dest.Printf("%c%c",prefix_token,quote); 947d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata 948f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata if (my_data_read) 949d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata dest.Printf("%s",(char*)buffer_sp->GetBytes()); 950d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata 951d9222720d49a2f82234f5f9d3ffd0afe086b7251Enrico Granata dest.Printf("%c",quote); 952f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 953f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata return true; 954f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata} 955f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata 956caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatabool 957f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream) 958caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata{ 959caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ProcessSP process_sp = valobj.GetProcessSP(); 960caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!process_sp) 961caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 962caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 963caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 964caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 965caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!runtime) 966caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 967caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 968caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); 969caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 970caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!descriptor.get() || !descriptor->IsValid()) 971caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 972caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 973caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint32_t ptr_size = process_sp->GetAddressByteSize(); 974caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 975caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); 976caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 977caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!valobj_addr) 978caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 979caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 980caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata const char* class_name = descriptor->GetClassName().GetCString(); 981caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 98225c9adecf763053ff953b4d437b022075d30dd13Enrico Granata if (!class_name || !*class_name) 98325c9adecf763053ff953b4d437b022075d30dd13Enrico Granata return false; 98425c9adecf763053ff953b4d437b022075d30dd13Enrico Granata 985caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t info_bits_location = valobj_addr + ptr_size; 986caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (process_sp->GetByteOrder() != lldb::eByteOrderLittle) 987caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata info_bits_location += 3; 988caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 989f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata Error error; 990caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 991caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error); 992caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 993caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 994caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 995caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_mutable = (info_bits & 1) == 1; 996caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_inline = (info_bits & 0x60) == 0; 997caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool has_explicit_length = (info_bits & (1 | 4)) != 4; 998caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_unicode = (info_bits & 0x10) == 0x10; 999caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata bool is_special = strcmp(class_name,"NSPathStore2") == 0; 1000fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata bool has_null = (info_bits & 8) == 8; 1001fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 1002fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata size_t explicit_length = 0; 1003fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata if (!has_null && has_explicit_length && !is_special) 1004fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata { 1005fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata lldb::addr_t explicit_length_offset = 2*ptr_size; 1006fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata if (is_mutable and not is_inline) 1007fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length_offset = explicit_length_offset + ptr_size; // notInlineMutable.length; 1008fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata else if (is_inline) 1009fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length = explicit_length + 0; // inline1.length; 1010fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata else if (not is_inline and not is_mutable) 1011fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length_offset = explicit_length_offset + ptr_size; // notInlineImmutable1.length; 1012fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata else 1013fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length_offset = 0; 1014fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 1015fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata if (explicit_length_offset) 1016fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata { 1017fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length_offset = valobj_addr + explicit_length_offset; 1018fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata explicit_length = process_sp->ReadUnsignedIntegerFromMemory(explicit_length_offset, 4, 0, error); 1019fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } 1020fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata } 1021fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata 1022caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (strcmp(class_name,"NSString") && 1023caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"CFStringRef") && 1024caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"CFMutableStringRef") && 1025caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"__NSCFConstantString") && 1026caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"__NSCFString") && 1027caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSCFConstantString") && 1028caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSCFString") && 1029caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata strcmp(class_name,"NSPathStore2")) 1030caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1031f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata // not one of us - but tell me class name 1032f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata stream.Printf("class name = %s",class_name); 1033f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata return true; 1034caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1035caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1036caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_mutable) 1037caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1038caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = 2 * ptr_size + valobj_addr; 1039caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 1040caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 1041caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 1042caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (has_explicit_length and is_unicode) 104366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata { 104466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 104566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 104666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(location); 104766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 104866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 104966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('@'); 105066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetQuote('"'); 105166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetSourceSize(explicit_length); 105266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetNeedsZeroTermination(false); 105366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream (options); 105466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 1055caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 1056fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata return ReadAsciiBufferAndDumpToStream(location+1,process_sp,stream, explicit_length); 1057caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1058caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable) 1059caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1060caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = 3 * ptr_size + valobj_addr; 1061fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); 1062caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1063caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_unicode) 1064caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1065f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata uint64_t location = valobj_addr + 2*ptr_size; 1066caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (is_inline) 1067caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1068caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!has_explicit_length) 1069caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1070caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("found new combo"); 1071caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 1072caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1073caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 1074caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location += ptr_size; 107566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata } 1076caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 1077caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1078caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 1079caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 1080caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 1081caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 108266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 108366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 108466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(location); 108566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 108666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 108766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('@'); 108866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetQuote('"'); 108966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetSourceSize(explicit_length); 109066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetNeedsZeroTermination(has_explicit_length == false); 109166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream (options); 1092caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1093caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_special) 1094caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1095caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8); 109666cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata ReadUTFBufferAndDumpToStreamOptions<UTF16> options; 109766cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetConversionFunction(ConvertUTF16toUTF8); 109866cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetLocation(location); 109966cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetProcessSP(process_sp); 110066cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetStream(&stream); 110166cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetPrefixToken('@'); 110266cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetQuote('"'); 110366cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetSourceSize(explicit_length); 110466cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata options.SetNeedsZeroTermination(has_explicit_length == false); 110566cd2b51a3e5003e2692215277525f79bb86c55bEnrico Granata return ReadUTFBufferAndDumpToStream (options); 1106caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1107caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else if (is_inline) 1108caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1109f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata uint64_t location = valobj_addr + 2*ptr_size; 1110caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (!has_explicit_length) 1111caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location++; 1112fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); 1113caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1114caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata else 1115caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata { 1116f3a217e676b9aa7cadbec2216cf0d69f16ce57a3Enrico Granata uint64_t location = valobj_addr + 2*ptr_size; 1117caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata location = process_sp->ReadPointerFromMemory(location, error); 1118caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata if (error.Fail()) 1119caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return false; 1120237bbc15b73b4244279e4e155d54d804baadfd81Enrico Granata if (has_explicit_length && !has_null) 1121237bbc15b73b4244279e4e155d54d804baadfd81Enrico Granata explicit_length++; // account for the fact that there is no NULL and we need to have one added 1122fb1493d5c569100d8c029162a6b5d30413a14570Enrico Granata return ReadAsciiBufferAndDumpToStream(location,process_sp,stream,explicit_length); 1123caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata } 1124caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1125caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata stream.Printf("class name = %s",class_name); 1126caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata return true; 1127caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1128caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata} 1129caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 11309abbfba957db139beed19866f61599424ddcd37aEnrico Granatabool 1131dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream) 1132dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{ 1133dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata TargetSP target_sp(valobj.GetTargetSP()); 1134dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (!target_sp) 1135dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1136dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata uint32_t addr_size = target_sp->GetArchitecture().GetAddressByteSize(); 113752f792329be5db8e38961350589e97e8f2823acdGreg Clayton uint64_t pointer_value = valobj.GetValueAsUnsigned(0); 113852f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!pointer_value) 1139dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 114052f792329be5db8e38961350589e97e8f2823acdGreg Clayton pointer_value += addr_size; 114152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType type(valobj.GetClangType()); 1142dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ExecutionContext exe_ctx(target_sp,false); 114352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ValueObjectSP child_ptr_sp(valobj.CreateValueObjectFromAddress("string_ptr", pointer_value, exe_ctx, type)); 1144dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (!child_ptr_sp) 1145dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1146dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata DataExtractor data; 1147dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata child_ptr_sp->GetData(data); 1148dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData("string_data", data, exe_ctx, type)); 1149dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata child_sp->GetValueAsUnsigned(0); 1150dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata if (child_sp) 1151dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return NSStringSummaryProvider(*child_sp, stream); 1152dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return false; 1153dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata} 1154dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata 1155dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool 1156dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatalldb_private::formatters::NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream) 1157dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata{ 1158dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata return NSAttributedStringSummaryProvider(valobj, stream); 1159dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata} 1160dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granata 1161dcffc1a667665936b3dd33a9861a3de9d1d35636Enrico Granatabool 11629abbfba957db139beed19866f61599424ddcd37aEnrico Granatalldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream) 11639abbfba957db139beed19866f61599424ddcd37aEnrico Granata{ 11649abbfba957db139beed19866f61599424ddcd37aEnrico Granata stream.Printf("%s",valobj.GetObjectDescription()); 11659abbfba957db139beed19866f61599424ddcd37aEnrico Granata return true; 11669abbfba957db139beed19866f61599424ddcd37aEnrico Granata} 11679abbfba957db139beed19866f61599424ddcd37aEnrico Granata 1168db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool 1169db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream) 1170db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{ 117152f792329be5db8e38961350589e97e8f2823acdGreg Clayton const uint32_t type_info = valobj.GetClangType().GetTypeInfo(); 1172db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1173db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata ValueObjectSP real_guy_sp = valobj.GetSP(); 1174db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 117552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (type_info & ClangASTType::eTypeIsPointer) 1176db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1177db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata Error err; 1178db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata real_guy_sp = valobj.Dereference(err); 1179db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (err.Fail() || !real_guy_sp) 1180db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return false; 1181db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 118252f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (type_info & ClangASTType::eTypeIsReference) 1183db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1184db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata real_guy_sp = valobj.GetChildAtIndex(0, true); 1185db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (!real_guy_sp) 1186db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return false; 1187db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 1188db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata uint64_t value = real_guy_sp->GetValueAsUnsigned(0); 1189db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata if (value == 0) 1190db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata { 1191db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("NO"); 1192db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1193db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata } 1194db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("YES"); 1195db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1196db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata} 1197db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1198db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate <bool is_sel_ptr> 1199db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatabool 1200db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream) 1201db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata{ 12021f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata lldb::ValueObjectSP valobj_sp; 1203db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 120452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType charstar (valobj.GetClangType().GetBasicTypeFromAST(eBasicTypeChar).GetPointerType()); 120552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 120652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!charstar) 12071f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 12081f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata 12091f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata ExecutionContext exe_ctx(valobj.GetExecutionContextRef()); 1210db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 12111f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (is_sel_ptr) 12121f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata { 12131f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata lldb::addr_t data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); 12141f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (data_address == LLDB_INVALID_ADDRESS) 12151f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 12161f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address, exe_ctx, charstar); 12171f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata } 12181f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata else 12191f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata { 12201f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata DataExtractor data; 12211f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj.GetData(data); 12221f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata valobj_sp = ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar); 12231f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata } 12241f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata 12251f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata if (!valobj_sp) 12261f9df7804f59193fdfbba3d73bb81f99c689f486Enrico Granata return false; 1227db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1228db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata stream.Printf("%s",valobj_sp->GetSummaryAsCString()); 1229db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata return true; 1230db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata} 1231db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1232cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata// POSIX has an epoch on Jan-1-1970, but Cocoa prefers Jan-1-2001 1233cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata// this call gives the POSIX equivalent of the Cocoa epoch 1234cba09f60618744e2155bc97c9049fa9c797698adEnrico Granatatime_t 1235cc5d27417b9f958d596a438290a9adb17674b487Enrico Granatalldb_private::formatters::GetOSXEpoch () 1236cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata{ 1237cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata static time_t epoch = 0; 1238cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata if (!epoch) 1239cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata { 1240cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tzset(); 1241cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm tm_epoch; 1242cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_sec = 0; 1243cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_hour = 0; 1244cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_min = 0; 1245cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_mon = 0; 1246cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_mday = 1; 1247cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_year = 2001-1900; // for some reason, we need to subtract 1900 from this field. not sure why. 1248cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_isdst = -1; 1249cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_gmtoff = 0; 1250cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata tm_epoch.tm_zone = NULL; 1251cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata epoch = timegm(&tm_epoch); 1252cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata } 1253cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata return epoch; 1254cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata} 1255cba09f60618744e2155bc97c9049fa9c797698adEnrico Granata 1256ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatasize_t 1257ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granatalldb_private::formatters::ExtractIndexFromString (const char* item_name) 1258f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1259ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!item_name || !*item_name) 1260ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 1261ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (*item_name != '[') 1262ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 1263ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata item_name++; 1264ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata char* endptr = NULL; 1265ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata unsigned long int idx = ::strtoul(item_name, &endptr, 0); 1266ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (idx == 0 && endptr == item_name) 1267ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 1268ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (idx == ULONG_MAX) 1269ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return UINT32_MAX; 1270ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return idx; 1271ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata} 1272ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata 127332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp, 127432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ConstString item_name) : 127532d7ee3d2969211e104a27fcfcd636f249b26559Enrico GranataSyntheticChildrenFrontEnd(*valobj_sp.get()), 127632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_exe_ctx_ref(), 127732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_item_name(item_name), 127832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatam_item_sp() 1279f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 128032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (valobj_sp) 128132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata Update(); 1282f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata} 1283f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata 1284f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatabool 128532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::Update() 1286f91e78f58692785db4daecf8461481b95827dcf2Enrico Granata{ 1287d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata m_item_sp.reset(); 1288d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata 1289247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata ValueObjectSP valobj_sp = m_backend.GetSP(); 1290ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata if (!valobj_sp) 1291ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 129232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 1293247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata if (!valobj_sp) 1294247da3363800e9420dbe06e77dfc0e5819d72b08Enrico Granata return false; 129532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata 129632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata ValueObjectSP item_ptr(valobj_sp->GetChildMemberWithName(m_item_name,true)); 129732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (!item_ptr) 1298ea68753ef4b8cca81cf3f5aef7bbf1ebb152a832Enrico Granata return false; 129932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (item_ptr->GetValueAsUnsigned(0) == 0) 1300689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return false; 130132d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata Error err; 130232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); 130352f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_item_sp = ValueObject::CreateValueObjectFromAddress("item", item_ptr->GetValueAsUnsigned(0), m_exe_ctx_ref, item_ptr->GetClangType().GetPointeeType()); 130432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (err.Fail()) 130532d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata m_item_sp.reset(); 1306d32acdb74c50f6fc3a2aab0619a75f2bc4c05a30Enrico Granata return false; 1307689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1308689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1309689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t 131032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::CalculateNumChildren () 1311689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 131232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return 1; 1313689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1314689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1315689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatalldb::ValueObjectSP 131632d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) 1317689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 131832d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (idx == 0) 131932d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return m_item_sp; 132032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return lldb::ValueObjectSP(); 1321689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1322689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1323689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatabool 132432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::MightHaveChildren () 1325689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 1326689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata return true; 1327689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1328689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1329689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granatasize_t 133032d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) 1331689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 133232d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata if (name == ConstString("item")) 133332d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return 0; 133432d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granata return UINT32_MAX; 1335689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1336689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 133732d7ee3d2969211e104a27fcfcd636f249b26559Enrico Granatalldb_private::formatters::VectorIteratorSyntheticFrontEnd::~VectorIteratorSyntheticFrontEnd () 1338689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata{ 1339689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata} 1340689696c19cbf0fa8a09e2461f0aaa37409782e3bEnrico Granata 1341caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 1342f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&) ; 1343caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granata 1344caaf010fb83b4c28bf585db2288837e6611e419eEnrico Granatatemplate bool 1345f91e78f58692785db4daecf8461481b95827dcf2Enrico Granatalldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&) ; 1346db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1347db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool 1348db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<true> (ValueObject&, Stream&) ; 1349db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata 1350db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatatemplate bool 1351db05491da80820047dc218542c88ba0d9f08fc71Enrico Granatalldb_private::formatters::ObjCSELSummaryProvider<false> (ValueObject&, Stream&) ; 1352