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