Coverage Report

Created: 2023-11-11 10:31

/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/source/Plugins/Language/ObjC/NSArray.cpp
Line
Count
Source (jump to first uncovered line)
1
//===-- NSArray.cpp -------------------------------------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "clang/AST/ASTContext.h"
10
#include "clang/Basic/TargetInfo.h"
11
12
#include "Cocoa.h"
13
14
#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h"
15
#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
16
17
#include "lldb/Core/ValueObject.h"
18
#include "lldb/Core/ValueObjectConstResult.h"
19
#include "lldb/DataFormatters/FormattersHelpers.h"
20
#include "lldb/Expression/FunctionCaller.h"
21
#include "lldb/Target/Language.h"
22
#include "lldb/Target/Target.h"
23
#include "lldb/Utility/DataBufferHeap.h"
24
#include "lldb/Utility/Endian.h"
25
#include "lldb/Utility/Status.h"
26
#include "lldb/Utility/Stream.h"
27
28
using namespace lldb;
29
using namespace lldb_private;
30
using namespace lldb_private::formatters;
31
32
namespace lldb_private {
33
namespace formatters {
34
std::map<ConstString, CXXFunctionSummaryFormat::Callback> &
35
0
NSArray_Additionals::GetAdditionalSummaries() {
36
0
  static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map;
37
0
  return g_map;
38
0
}
39
40
std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> &
41
20
NSArray_Additionals::GetAdditionalSynthetics() {
42
20
  static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>
43
20
      g_map;
44
20
  return g_map;
45
20
}
46
47
class NSArrayMSyntheticFrontEndBase : public SyntheticChildrenFrontEnd {
48
public:
49
  NSArrayMSyntheticFrontEndBase(lldb::ValueObjectSP valobj_sp);
50
51
54
  ~NSArrayMSyntheticFrontEndBase() override = default;
52
53
  size_t CalculateNumChildren() override;
54
55
  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
56
57
  bool Update() override = 0;
58
59
  bool MightHaveChildren() override;
60
61
  size_t GetIndexOfChildWithName(ConstString name) override;
62
63
protected:
64
  virtual lldb::addr_t GetDataAddress() = 0;
65
66
  virtual uint64_t GetUsedCount() = 0;
67
68
  virtual uint64_t GetOffset() = 0;
69
70
  virtual uint64_t GetSize() = 0;
71
72
  ExecutionContextRef m_exe_ctx_ref;
73
  uint8_t m_ptr_size = 8;
74
  CompilerType m_id_type;
75
};
76
77
template <typename D32, typename D64>
78
class GenericNSArrayMSyntheticFrontEnd : public NSArrayMSyntheticFrontEndBase {
79
public:
80
  GenericNSArrayMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
81
82
  ~GenericNSArrayMSyntheticFrontEnd() override;
83
84
  bool Update() override;
85
86
protected:
87
  lldb::addr_t GetDataAddress() override;
88
89
  uint64_t GetUsedCount() override;
90
91
  uint64_t GetOffset() override;
92
93
  uint64_t GetSize() override;
94
95
private:
96
  D32 *m_data_32;
97
  D64 *m_data_64;
98
};
99
100
namespace Foundation1010 {
101
  namespace {
102
    struct DataDescriptor_32 {
103
      uint32_t _used;
104
      uint32_t _offset;
105
      uint32_t _size : 28;
106
      uint64_t _priv1 : 4;
107
      uint32_t _priv2;
108
      uint32_t _data;
109
    };
110
111
    struct DataDescriptor_64 {
112
      uint64_t _used;
113
      uint64_t _offset;
114
      uint64_t _size : 60;
115
      uint64_t _priv1 : 4;
116
      uint32_t _priv2;
117
      uint64_t _data;
118
    };
119
  }
120
121
  using NSArrayMSyntheticFrontEnd =
122
      GenericNSArrayMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>;
123
}
124
125
namespace Foundation1428 {
126
  namespace {
127
    struct DataDescriptor_32 {
128
      uint32_t _used;
129
      uint32_t _offset;
130
      uint32_t _size;
131
      uint32_t _data;
132
    };
133
134
    struct DataDescriptor_64 {
135
      uint64_t _used;
136
      uint64_t _offset;
137
      uint64_t _size;
138
      uint64_t _data;
139
    };
140
  }
141
142
  using NSArrayMSyntheticFrontEnd =
143
      GenericNSArrayMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>;
144
}
145
146
namespace Foundation1437 {
147
  template <typename PtrType>
148
  struct DataDescriptor {
149
    PtrType _cow;
150
    // __deque
151
    PtrType _data;
152
    uint32_t _offset;
153
    uint32_t _size;
154
    uint32_t _muts;
155
    uint32_t _used;
156
  };
157
158
  using NSArrayMSyntheticFrontEnd =
159
     GenericNSArrayMSyntheticFrontEnd<
160
        DataDescriptor<uint32_t>, DataDescriptor<uint64_t>>;
161
162
  template <typename DD>
163
  uint64_t
164
  __NSArrayMSize_Impl(lldb_private::Process &process,
165
42
                      lldb::addr_t valobj_addr, Status &error) {
166
42
    const lldb::addr_t start_of_descriptor =
167
42
    valobj_addr + process.GetAddressByteSize();
168
42
    DD descriptor = DD();
169
42
    process.ReadMemory(start_of_descriptor, &descriptor,
170
42
                       sizeof(descriptor), error);
171
42
    if (error.Fail()) {
172
0
      return 0;
173
0
    }
174
42
    return descriptor._used;
175
42
  }
Unexecuted instantiation: unsigned long long lldb_private::formatters::Foundation1437::__NSArrayMSize_Impl<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned int> >(lldb_private::Process&, unsigned long long, lldb_private::Status&)
unsigned long long lldb_private::formatters::Foundation1437::__NSArrayMSize_Impl<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned long long> >(lldb_private::Process&, unsigned long long, lldb_private::Status&)
Line
Count
Source
165
42
                      lldb::addr_t valobj_addr, Status &error) {
166
42
    const lldb::addr_t start_of_descriptor =
167
42
    valobj_addr + process.GetAddressByteSize();
168
42
    DD descriptor = DD();
169
42
    process.ReadMemory(start_of_descriptor, &descriptor,
170
42
                       sizeof(descriptor), error);
171
42
    if (error.Fail()) {
172
0
      return 0;
173
0
    }
174
42
    return descriptor._used;
175
42
  }
176
177
  uint64_t
178
  __NSArrayMSize(lldb_private::Process &process, lldb::addr_t valobj_addr,
179
42
                 Status &error) {
180
42
    if (process.GetAddressByteSize() == 4) {
181
0
      return __NSArrayMSize_Impl<DataDescriptor<uint32_t>>(process, valobj_addr,
182
0
                                                           error);
183
42
    } else {
184
42
      return __NSArrayMSize_Impl<DataDescriptor<uint64_t>>(process, valobj_addr,
185
42
                                                           error);
186
42
    }
187
42
  }
188
189
}
190
191
namespace CallStackArray {
192
struct DataDescriptor_32 {
193
  uint32_t _data;
194
  uint32_t _used;
195
  uint32_t _offset;
196
  const uint32_t _size = 0;
197
};
198
199
struct DataDescriptor_64 {
200
  uint64_t _data;
201
  uint64_t _used;
202
  uint64_t _offset;
203
  const uint64_t _size = 0;
204
};
205
206
using NSCallStackArraySyntheticFrontEnd =
207
    GenericNSArrayMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>;
208
} // namespace CallStackArray
209
210
template <typename D32, typename D64, bool Inline>
211
class GenericNSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd {
212
public:
213
  GenericNSArrayISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
214
215
  ~GenericNSArrayISyntheticFrontEnd() override;
216
217
  size_t CalculateNumChildren() override;
218
219
  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
220
221
  bool Update() override;
222
223
  bool MightHaveChildren() override;
224
225
  size_t GetIndexOfChildWithName(ConstString name) override;
226
227
private:
228
  ExecutionContextRef m_exe_ctx_ref;
229
  uint8_t m_ptr_size = 8;
230
231
  D32 *m_data_32;
232
  D64 *m_data_64;
233
  CompilerType m_id_type;
234
};
235
236
namespace Foundation1300 {
237
    struct IDD32 {
238
        uint32_t used;
239
        uint32_t list;
240
    };
241
242
    struct IDD64 {
243
        uint64_t used;
244
        uint64_t list;
245
    };
246
247
    using NSArrayISyntheticFrontEnd =
248
        GenericNSArrayISyntheticFrontEnd<IDD32, IDD64, true>;
249
}
250
251
namespace Foundation1430 {
252
    using NSArrayISyntheticFrontEnd =
253
        Foundation1428::NSArrayMSyntheticFrontEnd;
254
}
255
256
namespace Foundation1436 {
257
    struct IDD32 {
258
        uint32_t used;
259
        uint32_t list; // in Inline cases, this is the first element
260
    };
261
262
    struct IDD64 {
263
        uint64_t used;
264
        uint64_t list; // in Inline cases, this is the first element
265
    };
266
267
    using NSArrayI_TransferSyntheticFrontEnd =
268
        GenericNSArrayISyntheticFrontEnd<IDD32, IDD64, false>;
269
270
    using NSArrayISyntheticFrontEnd =
271
        GenericNSArrayISyntheticFrontEnd<IDD32, IDD64, true>;
272
273
    using NSFrozenArrayMSyntheticFrontEnd =
274
        Foundation1437::NSArrayMSyntheticFrontEnd;
275
276
    uint64_t
277
    __NSFrozenArrayMSize(lldb_private::Process &process, lldb::addr_t valobj_addr,
278
0
                         Status &error) {
279
0
      return Foundation1437::__NSArrayMSize(process, valobj_addr, error);
280
0
    }
281
}
282
283
namespace ConstantArray {
284
285
struct ConstantArray32 {
286
  uint64_t used;
287
  uint32_t list;
288
};
289
290
struct ConstantArray64 {
291
  uint64_t used;
292
  uint64_t list;
293
};
294
295
using NSConstantArraySyntheticFrontEnd =
296
    GenericNSArrayISyntheticFrontEnd<ConstantArray32, ConstantArray64, false>;
297
} // namespace ConstantArray
298
299
class NSArray0SyntheticFrontEnd : public SyntheticChildrenFrontEnd {
300
public:
301
  NSArray0SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
302
303
8
  ~NSArray0SyntheticFrontEnd() override = default;
304
305
  size_t CalculateNumChildren() override;
306
307
  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
308
309
  bool Update() override;
310
311
  bool MightHaveChildren() override;
312
313
  size_t GetIndexOfChildWithName(ConstString name) override;
314
};
315
316
class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd {
317
public:
318
  NSArray1SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp);
319
320
0
  ~NSArray1SyntheticFrontEnd() override = default;
321
322
  size_t CalculateNumChildren() override;
323
324
  lldb::ValueObjectSP GetChildAtIndex(size_t idx) override;
325
326
  bool Update() override;
327
328
  bool MightHaveChildren() override;
329
330
  size_t GetIndexOfChildWithName(ConstString name) override;
331
};
332
} // namespace formatters
333
} // namespace lldb_private
334
335
bool lldb_private::formatters::NSArraySummaryProvider(
336
160
    ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
337
160
  static constexpr llvm::StringLiteral g_TypeHint("NSArray");
338
339
160
  ProcessSP process_sp = valobj.GetProcessSP();
340
160
  if (!process_sp)
341
0
    return false;
342
343
160
  ObjCLanguageRuntime *runtime = ObjCLanguageRuntime::Get(*process_sp);
344
345
160
  if (!runtime)
346
0
    return false;
347
348
160
  ObjCLanguageRuntime::ClassDescriptorSP descriptor(
349
160
      runtime->GetClassDescriptor(valobj));
350
351
160
  if (!descriptor || !descriptor->IsValid())
352
0
    return false;
353
354
160
  uint32_t ptr_size = process_sp->GetAddressByteSize();
355
356
160
  lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
357
358
160
  if (!valobj_addr)
359
0
    return false;
360
361
160
  uint64_t value = 0;
362
363
160
  ConstString class_name(descriptor->GetClassName());
364
365
160
  static const ConstString g_NSArrayI("__NSArrayI");
366
160
  static const ConstString g_NSArrayM("__NSArrayM");
367
160
  static const ConstString g_NSArrayI_Transfer("__NSArrayI_Transfer");
368
160
  static const ConstString g_NSFrozenArrayM("__NSFrozenArrayM");
369
160
  static const ConstString g_NSArray0("__NSArray0");
370
160
  static const ConstString g_NSArray1("__NSSingleObjectArrayI");
371
160
  static const ConstString g_NSArrayCF("__NSCFArray");
372
160
  static const ConstString g_NSArrayMLegacy("__NSArrayM_Legacy");
373
160
  static const ConstString g_NSArrayMImmutable("__NSArrayM_Immutable");
374
160
  static const ConstString g_NSCallStackArray("_NSCallStackArray");
375
160
  static const ConstString g_NSConstantArray("NSConstantArray");
376
377
160
  if (class_name.IsEmpty())
378
0
    return false;
379
380
160
  if (class_name == g_NSArrayI) {
381
92
    Status error;
382
92
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
383
92
                                                      ptr_size, 0, error);
384
92
    if (error.Fail())
385
0
      return false;
386
92
  } else 
if (68
class_name == g_NSConstantArray68
) {
387
0
    Status error;
388
0
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 8,
389
0
                                                      0, error);
390
0
    if (error.Fail())
391
0
      return false;
392
68
  } else if (class_name == g_NSArrayM) {
393
42
    AppleObjCRuntime *apple_runtime =
394
42
    llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime);
395
42
    Status error;
396
42
    if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) {
397
42
      value = Foundation1437::__NSArrayMSize(*process_sp, valobj_addr, error);
398
42
    } else {
399
0
      value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
400
0
                                                        ptr_size, 0, error);
401
0
    }
402
42
    if (error.Fail())
403
0
      return false;
404
42
  } else 
if (26
class_name == g_NSArrayI_Transfer26
) {
405
0
    Status error;
406
0
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
407
0
                                                      ptr_size, 0, error);
408
0
    if (error.Fail())
409
0
      return false;
410
26
  } else if (class_name == g_NSFrozenArrayM) {
411
0
    Status error;
412
0
    value = Foundation1436::__NSFrozenArrayMSize(*process_sp, valobj_addr, error);
413
0
    if (error.Fail())
414
0
      return false;
415
26
  } else if (class_name == g_NSArrayMLegacy) {
416
0
    Status error;
417
0
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
418
0
                                                      ptr_size, 0, error);
419
0
    if (error.Fail())
420
0
      return false;
421
26
  } else if (class_name == g_NSArrayMImmutable) {
422
0
    Status error;
423
0
    value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size,
424
0
                                                      ptr_size, 0, error);
425
0
    if (error.Fail())
426
0
      return false;
427
26
  } else if (class_name == g_NSArray0) {
428
6
    value = 0;
429
20
  } else if (class_name == g_NSArray1) {
430
0
    value = 1;
431
20
  } else if (class_name == g_NSArrayCF || 
class_name == g_NSCallStackArray0
) {
432
    // __NSCFArray and _NSCallStackArray store the number of elements as a
433
    // pointer-sized value at offset `2 * ptr_size`.
434
20
    Status error;
435
20
    value = process_sp->ReadUnsignedIntegerFromMemory(
436
20
        valobj_addr + 2 * ptr_size, ptr_size, 0, error);
437
20
    if (error.Fail())
438
0
      return false;
439
20
  } else {
440
0
    auto &map(NSArray_Additionals::GetAdditionalSummaries());
441
0
    auto iter = map.find(class_name), end = map.end();
442
0
    if (iter != end)
443
0
      return iter->second(valobj, stream, options);
444
0
    else
445
0
      return false;
446
0
  }
447
448
160
  llvm::StringRef prefix, suffix;
449
160
  if (Language *language = Language::FindPlugin(options.GetLanguage()))
450
160
    std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix(g_TypeHint);
451
452
160
  stream << prefix;
453
160
  stream.Printf("%" PRIu64 " %s%s", value, "element", value == 1 ? 
""14
:
"s"146
);
454
160
  stream << suffix;
455
160
  return true;
456
160
}
457
458
lldb_private::formatters::NSArrayMSyntheticFrontEndBase::
459
    NSArrayMSyntheticFrontEndBase(lldb::ValueObjectSP valobj_sp)
460
54
    : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_id_type() {
461
54
  if (valobj_sp) {
462
54
    TypeSystemClangSP scratch_ts_sp = ScratchTypeSystemClang::GetForTarget(
463
54
        *valobj_sp->GetExecutionContextRef().GetTargetSP());
464
54
    if (scratch_ts_sp)
465
54
      m_id_type = CompilerType(
466
54
          scratch_ts_sp->weak_from_this(),
467
54
          scratch_ts_sp->getASTContext().ObjCBuiltinIdTy.getAsOpaquePtr());
468
54
    if (valobj_sp->GetProcessSP())
469
54
      m_ptr_size = valobj_sp->GetProcessSP()->GetAddressByteSize();
470
54
  }
471
54
}
472
473
template <typename D32, typename D64>
474
lldb_private::formatters::
475
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::
476
    GenericNSArrayMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
477
54
    : NSArrayMSyntheticFrontEndBase(valobj_sp), m_data_32(nullptr),
478
54
      m_data_64(nullptr) {}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_64>::GenericNSArrayMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned int>, lldb_private::formatters::Foundation1437::DataDescriptor<unsigned long long> >::GenericNSArrayMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
Line
Count
Source
477
52
    : NSArrayMSyntheticFrontEndBase(valobj_sp), m_data_32(nullptr),
478
52
      m_data_64(nullptr) {}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_64>::GenericNSArrayMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::CallStackArray::DataDescriptor_32, lldb_private::formatters::CallStackArray::DataDescriptor_64>::GenericNSArrayMSyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
Line
Count
Source
477
2
    : NSArrayMSyntheticFrontEndBase(valobj_sp), m_data_32(nullptr),
478
2
      m_data_64(nullptr) {}
479
480
size_t
481
42
lldb_private::formatters::NSArrayMSyntheticFrontEndBase::CalculateNumChildren() {
482
42
  return GetUsedCount();
483
42
}
484
485
lldb::ValueObjectSP
486
lldb_private::formatters::NSArrayMSyntheticFrontEndBase::GetChildAtIndex(
487
36
    size_t idx) {
488
36
  if (idx >= CalculateNumChildren())
489
0
    return lldb::ValueObjectSP();
490
36
  lldb::addr_t object_at_idx = GetDataAddress();
491
36
  size_t pyhs_idx = idx;
492
36
  pyhs_idx += GetOffset();
493
36
  if (GetSize() <= pyhs_idx)
494
12
    pyhs_idx -= GetSize();
495
36
  object_at_idx += (pyhs_idx * m_ptr_size);
496
36
  StreamString idx_name;
497
36
  idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
498
36
  return CreateValueObjectFromAddress(idx_name.GetString(), object_at_idx,
499
36
                                      m_exe_ctx_ref, m_id_type);
500
36
}
501
502
template <typename D32, typename D64>
503
bool
504
lldb_private::formatters::
505
38
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::Update() {
506
38
  ValueObjectSP valobj_sp = m_backend.GetSP();
507
38
  m_ptr_size = 0;
508
38
  delete m_data_32;
509
38
  m_data_32 = nullptr;
510
38
  delete m_data_64;
511
38
  m_data_64 = nullptr;
512
38
  if (!valobj_sp)
513
0
    return false;
514
38
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
515
38
  Status error;
516
38
  error.Clear();
517
38
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
518
38
  if (!process_sp)
519
0
    return false;
520
38
  m_ptr_size = process_sp->GetAddressByteSize();
521
38
  uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
522
38
  if (m_ptr_size == 4) {
523
0
    m_data_32 = new D32();
524
0
    process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
525
0
                           error);
526
38
  } else {
527
38
    m_data_64 = new D64();
528
38
    process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
529
38
                           error);
530
38
  }
531
532
38
  return error.Success();
533
38
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_64>::Update()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned int>, lldb_private::formatters::Foundation1437::DataDescriptor<unsigned long long> >::Update()
Line
Count
Source
505
36
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::Update() {
506
36
  ValueObjectSP valobj_sp = m_backend.GetSP();
507
36
  m_ptr_size = 0;
508
36
  delete m_data_32;
509
36
  m_data_32 = nullptr;
510
36
  delete m_data_64;
511
36
  m_data_64 = nullptr;
512
36
  if (!valobj_sp)
513
0
    return false;
514
36
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
515
36
  Status error;
516
36
  error.Clear();
517
36
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
518
36
  if (!process_sp)
519
0
    return false;
520
36
  m_ptr_size = process_sp->GetAddressByteSize();
521
36
  uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
522
36
  if (m_ptr_size == 4) {
523
0
    m_data_32 = new D32();
524
0
    process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
525
0
                           error);
526
36
  } else {
527
36
    m_data_64 = new D64();
528
36
    process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
529
36
                           error);
530
36
  }
531
532
36
  return error.Success();
533
36
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_64>::Update()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::CallStackArray::DataDescriptor_32, lldb_private::formatters::CallStackArray::DataDescriptor_64>::Update()
Line
Count
Source
505
2
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::Update() {
506
2
  ValueObjectSP valobj_sp = m_backend.GetSP();
507
2
  m_ptr_size = 0;
508
2
  delete m_data_32;
509
2
  m_data_32 = nullptr;
510
2
  delete m_data_64;
511
2
  m_data_64 = nullptr;
512
2
  if (!valobj_sp)
513
0
    return false;
514
2
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
515
2
  Status error;
516
2
  error.Clear();
517
2
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
518
2
  if (!process_sp)
519
0
    return false;
520
2
  m_ptr_size = process_sp->GetAddressByteSize();
521
2
  uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
522
2
  if (m_ptr_size == 4) {
523
0
    m_data_32 = new D32();
524
0
    process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
525
0
                           error);
526
2
  } else {
527
2
    m_data_64 = new D64();
528
2
    process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
529
2
                           error);
530
2
  }
531
532
2
  return error.Success();
533
2
}
534
535
bool
536
2
lldb_private::formatters::NSArrayMSyntheticFrontEndBase::MightHaveChildren() {
537
2
  return true;
538
2
}
539
540
size_t
541
lldb_private::formatters::NSArrayMSyntheticFrontEndBase::GetIndexOfChildWithName(
542
0
    ConstString name) {
543
0
  const char *item_name = name.GetCString();
544
0
  uint32_t idx = ExtractIndexFromString(item_name);
545
0
  if (idx < UINT32_MAX && idx >= CalculateNumChildren())
546
0
    return UINT32_MAX;
547
0
  return idx;
548
0
}
549
550
template <typename D32, typename D64>
551
lldb_private::formatters::
552
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::
553
54
    ~GenericNSArrayMSyntheticFrontEnd<D32, D64>() {
554
54
  delete m_data_32;
555
54
  m_data_32 = nullptr;
556
54
  delete m_data_64;
557
54
  m_data_64 = nullptr;
558
54
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_64>::~GenericNSArrayMSyntheticFrontEnd()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned int>, lldb_private::formatters::Foundation1437::DataDescriptor<unsigned long long> >::~GenericNSArrayMSyntheticFrontEnd()
Line
Count
Source
553
52
    ~GenericNSArrayMSyntheticFrontEnd<D32, D64>() {
554
52
  delete m_data_32;
555
52
  m_data_32 = nullptr;
556
52
  delete m_data_64;
557
52
  m_data_64 = nullptr;
558
52
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_64>::~GenericNSArrayMSyntheticFrontEnd()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::CallStackArray::DataDescriptor_32, lldb_private::formatters::CallStackArray::DataDescriptor_64>::~GenericNSArrayMSyntheticFrontEnd()
Line
Count
Source
553
2
    ~GenericNSArrayMSyntheticFrontEnd<D32, D64>() {
554
2
  delete m_data_32;
555
2
  m_data_32 = nullptr;
556
2
  delete m_data_64;
557
2
  m_data_64 = nullptr;
558
2
}
559
560
template <typename D32, typename D64>
561
lldb::addr_t
562
lldb_private::formatters::
563
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::
564
36
    GenericNSArrayMSyntheticFrontEnd::GetDataAddress() {
565
36
  if (!m_data_32 && !m_data_64)
566
0
    return LLDB_INVALID_ADDRESS;
567
36
  return m_data_32 ? 
m_data_32->_data0
: m_data_64->_data;
568
36
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_64>::GetDataAddress()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned int>, lldb_private::formatters::Foundation1437::DataDescriptor<unsigned long long> >::GetDataAddress()
Line
Count
Source
564
24
    GenericNSArrayMSyntheticFrontEnd::GetDataAddress() {
565
24
  if (!m_data_32 && !m_data_64)
566
0
    return LLDB_INVALID_ADDRESS;
567
24
  return m_data_32 ? 
m_data_32->_data0
: m_data_64->_data;
568
24
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_64>::GetDataAddress()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::CallStackArray::DataDescriptor_32, lldb_private::formatters::CallStackArray::DataDescriptor_64>::GetDataAddress()
Line
Count
Source
564
12
    GenericNSArrayMSyntheticFrontEnd::GetDataAddress() {
565
12
  if (!m_data_32 && !m_data_64)
566
0
    return LLDB_INVALID_ADDRESS;
567
12
  return m_data_32 ? 
m_data_32->_data0
: m_data_64->_data;
568
12
}
569
570
template <typename D32, typename D64>
571
uint64_t
572
lldb_private::formatters::
573
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::
574
42
    GenericNSArrayMSyntheticFrontEnd::GetUsedCount() {
575
42
  if (!m_data_32 && !m_data_64)
576
0
    return 0;
577
42
  return m_data_32 ? 
m_data_32->_used0
: m_data_64->_used;
578
42
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_64>::GetUsedCount()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned int>, lldb_private::formatters::Foundation1437::DataDescriptor<unsigned long long> >::GetUsedCount()
Line
Count
Source
574
28
    GenericNSArrayMSyntheticFrontEnd::GetUsedCount() {
575
28
  if (!m_data_32 && !m_data_64)
576
0
    return 0;
577
28
  return m_data_32 ? 
m_data_32->_used0
: m_data_64->_used;
578
28
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_64>::GetUsedCount()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::CallStackArray::DataDescriptor_32, lldb_private::formatters::CallStackArray::DataDescriptor_64>::GetUsedCount()
Line
Count
Source
574
14
    GenericNSArrayMSyntheticFrontEnd::GetUsedCount() {
575
14
  if (!m_data_32 && !m_data_64)
576
0
    return 0;
577
14
  return m_data_32 ? 
m_data_32->_used0
: m_data_64->_used;
578
14
}
579
580
template <typename D32, typename D64>
581
uint64_t
582
lldb_private::formatters::
583
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::
584
36
    GenericNSArrayMSyntheticFrontEnd::GetOffset() {
585
36
  if (!m_data_32 && !m_data_64)
586
0
    return 0;
587
36
  return m_data_32 ? 
m_data_32->_offset0
: m_data_64->_offset;
588
36
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_64>::GetOffset()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned int>, lldb_private::formatters::Foundation1437::DataDescriptor<unsigned long long> >::GetOffset()
Line
Count
Source
584
24
    GenericNSArrayMSyntheticFrontEnd::GetOffset() {
585
24
  if (!m_data_32 && !m_data_64)
586
0
    return 0;
587
24
  return m_data_32 ? 
m_data_32->_offset0
: m_data_64->_offset;
588
24
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_64>::GetOffset()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::CallStackArray::DataDescriptor_32, lldb_private::formatters::CallStackArray::DataDescriptor_64>::GetOffset()
Line
Count
Source
584
12
    GenericNSArrayMSyntheticFrontEnd::GetOffset() {
585
12
  if (!m_data_32 && !m_data_64)
586
0
    return 0;
587
12
  return m_data_32 ? 
m_data_32->_offset0
: m_data_64->_offset;
588
12
}
589
590
template <typename D32, typename D64>
591
uint64_t
592
lldb_private::formatters::
593
  GenericNSArrayMSyntheticFrontEnd<D32, D64>::
594
48
    GenericNSArrayMSyntheticFrontEnd::GetSize() {
595
48
  if (!m_data_32 && !m_data_64)
596
0
    return 0;
597
48
  return m_data_32 ? 
m_data_32->_size0
: m_data_64->_size;
598
48
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1428::(anonymous namespace)::DataDescriptor_64>::GetSize()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1437::DataDescriptor<unsigned int>, lldb_private::formatters::Foundation1437::DataDescriptor<unsigned long long> >::GetSize()
Line
Count
Source
594
24
    GenericNSArrayMSyntheticFrontEnd::GetSize() {
595
24
  if (!m_data_32 && !m_data_64)
596
0
    return 0;
597
24
  return m_data_32 ? 
m_data_32->_size0
: m_data_64->_size;
598
24
}
Unexecuted instantiation: NSArray.cpp:lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_32, lldb_private::formatters::Foundation1010::(anonymous namespace)::DataDescriptor_64>::GetSize()
lldb_private::formatters::GenericNSArrayMSyntheticFrontEnd<lldb_private::formatters::CallStackArray::DataDescriptor_32, lldb_private::formatters::CallStackArray::DataDescriptor_64>::GetSize()
Line
Count
Source
594
24
    GenericNSArrayMSyntheticFrontEnd::GetSize() {
595
24
  if (!m_data_32 && !m_data_64)
596
0
    return 0;
597
24
  return m_data_32 ? 
m_data_32->_size0
: m_data_64->_size;
598
24
}
599
600
template <typename D32, typename D64, bool Inline>
601
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>::
602
    GenericNSArrayISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp)
603
104
    : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(),
604
104
      m_data_32(nullptr), m_data_64(nullptr) {
605
104
  if (valobj_sp) {
606
104
    CompilerType type = valobj_sp->GetCompilerType();
607
104
    if (type) {
608
104
      TypeSystemClangSP scratch_ts_sp = ScratchTypeSystemClang::GetForTarget(
609
104
          *valobj_sp->GetExecutionContextRef().GetTargetSP());
610
104
      if (scratch_ts_sp)
611
104
        m_id_type = scratch_ts_sp->GetType(
612
104
            scratch_ts_sp->getASTContext().ObjCBuiltinIdTy);
613
104
    }
614
104
  }
615
104
}
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, true>::GenericNSArrayISyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
Line
Count
Source
603
104
    : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(),
604
104
      m_data_32(nullptr), m_data_64(nullptr) {
605
104
  if (valobj_sp) {
606
104
    CompilerType type = valobj_sp->GetCompilerType();
607
104
    if (type) {
608
104
      TypeSystemClangSP scratch_ts_sp = ScratchTypeSystemClang::GetForTarget(
609
104
          *valobj_sp->GetExecutionContextRef().GetTargetSP());
610
104
      if (scratch_ts_sp)
611
104
        m_id_type = scratch_ts_sp->GetType(
612
104
            scratch_ts_sp->getASTContext().ObjCBuiltinIdTy);
613
104
    }
614
104
  }
615
104
}
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1300::IDD32, lldb_private::formatters::Foundation1300::IDD64, true>::GenericNSArrayISyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, false>::GenericNSArrayISyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::ConstantArray::ConstantArray32, lldb_private::formatters::ConstantArray::ConstantArray64, false>::GenericNSArrayISyntheticFrontEnd(std::__1::shared_ptr<lldb_private::ValueObject>)
616
617
template <typename D32, typename D64, bool Inline>
618
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>::
619
104
  ~GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>() {
620
104
  delete m_data_32;
621
104
  m_data_32 = nullptr;
622
104
  delete m_data_64;
623
104
  m_data_64 = nullptr;
624
104
}
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, true>::~GenericNSArrayISyntheticFrontEnd()
Line
Count
Source
619
104
  ~GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>() {
620
104
  delete m_data_32;
621
104
  m_data_32 = nullptr;
622
104
  delete m_data_64;
623
104
  m_data_64 = nullptr;
624
104
}
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1300::IDD32, lldb_private::formatters::Foundation1300::IDD64, true>::~GenericNSArrayISyntheticFrontEnd()
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, false>::~GenericNSArrayISyntheticFrontEnd()
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::ConstantArray::ConstantArray32, lldb_private::formatters::ConstantArray::ConstantArray64, false>::~GenericNSArrayISyntheticFrontEnd()
625
626
template <typename D32, typename D64, bool Inline>
627
size_t
628
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>::
629
0
  GetIndexOfChildWithName(ConstString name) {
630
0
  const char *item_name = name.GetCString();
631
0
  uint32_t idx = ExtractIndexFromString(item_name);
632
0
  if (idx < UINT32_MAX && idx >= CalculateNumChildren())
633
0
    return UINT32_MAX;
634
0
  return idx;
635
0
}
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, true>::GetIndexOfChildWithName(lldb_private::ConstString)
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1300::IDD32, lldb_private::formatters::Foundation1300::IDD64, true>::GetIndexOfChildWithName(lldb_private::ConstString)
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, false>::GetIndexOfChildWithName(lldb_private::ConstString)
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::ConstantArray::ConstantArray32, lldb_private::formatters::ConstantArray::ConstantArray64, false>::GetIndexOfChildWithName(lldb_private::ConstString)
636
637
template <typename D32, typename D64, bool Inline>
638
size_t
639
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>::
640
76
  CalculateNumChildren() {
641
76
  return m_data_32 ? 
m_data_32->used0
: m_data_64->used;
642
76
}
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, true>::CalculateNumChildren()
Line
Count
Source
640
76
  CalculateNumChildren() {
641
76
  return m_data_32 ? 
m_data_32->used0
: m_data_64->used;
642
76
}
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1300::IDD32, lldb_private::formatters::Foundation1300::IDD64, true>::CalculateNumChildren()
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, false>::CalculateNumChildren()
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::ConstantArray::ConstantArray32, lldb_private::formatters::ConstantArray::ConstantArray64, false>::CalculateNumChildren()
643
644
template <typename D32, typename D64, bool Inline>
645
bool
646
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>::
647
92
  Update() {
648
92
  ValueObjectSP valobj_sp = m_backend.GetSP();
649
92
  m_ptr_size = 0;
650
92
  delete m_data_32;
651
92
  m_data_32 = nullptr;
652
92
  delete m_data_64;
653
92
  m_data_64 = nullptr;
654
92
  if (!valobj_sp)
655
0
    return false;
656
92
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
657
92
  Status error;
658
92
  error.Clear();
659
92
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
660
92
  if (!process_sp)
661
0
    return false;
662
92
  m_ptr_size = process_sp->GetAddressByteSize();
663
92
  uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
664
92
  if (m_ptr_size == 4) {
665
0
    m_data_32 = new D32();
666
0
    process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
667
0
                           error);
668
92
  } else {
669
92
    m_data_64 = new D64();
670
92
    process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
671
92
                           error);
672
92
  }
673
674
92
  return error.Success();
675
92
}
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, true>::Update()
Line
Count
Source
647
92
  Update() {
648
92
  ValueObjectSP valobj_sp = m_backend.GetSP();
649
92
  m_ptr_size = 0;
650
92
  delete m_data_32;
651
92
  m_data_32 = nullptr;
652
92
  delete m_data_64;
653
92
  m_data_64 = nullptr;
654
92
  if (!valobj_sp)
655
0
    return false;
656
92
  m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
657
92
  Status error;
658
92
  error.Clear();
659
92
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
660
92
  if (!process_sp)
661
0
    return false;
662
92
  m_ptr_size = process_sp->GetAddressByteSize();
663
92
  uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size;
664
92
  if (m_ptr_size == 4) {
665
0
    m_data_32 = new D32();
666
0
    process_sp->ReadMemory(data_location, m_data_32, sizeof(D32),
667
0
                           error);
668
92
  } else {
669
92
    m_data_64 = new D64();
670
92
    process_sp->ReadMemory(data_location, m_data_64, sizeof(D64),
671
92
                           error);
672
92
  }
673
674
92
  return error.Success();
675
92
}
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1300::IDD32, lldb_private::formatters::Foundation1300::IDD64, true>::Update()
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, false>::Update()
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::ConstantArray::ConstantArray32, lldb_private::formatters::ConstantArray::ConstantArray64, false>::Update()
676
677
template <typename D32, typename D64, bool Inline>
678
bool
679
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>::
680
2
  MightHaveChildren() {
681
2
  return true;
682
2
}
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, true>::MightHaveChildren()
Line
Count
Source
680
2
  MightHaveChildren() {
681
2
  return true;
682
2
}
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1300::IDD32, lldb_private::formatters::Foundation1300::IDD64, true>::MightHaveChildren()
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, false>::MightHaveChildren()
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::ConstantArray::ConstantArray32, lldb_private::formatters::ConstantArray::ConstantArray64, false>::MightHaveChildren()
683
684
template <typename D32, typename D64, bool Inline>
685
lldb::ValueObjectSP
686
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>::
687
56
  GetChildAtIndex(size_t idx) {
688
56
  if (idx >= CalculateNumChildren())
689
0
    return lldb::ValueObjectSP();
690
56
  lldb::addr_t object_at_idx;
691
56
  if (Inline) {
692
56
    object_at_idx = m_backend.GetSP()->GetValueAsUnsigned(0) + m_ptr_size;
693
56
    object_at_idx += m_ptr_size == 4 ? 
sizeof(D32)0
: sizeof(D64); // skip the data header
694
56
    object_at_idx -= m_ptr_size; // we treat the last entry in the data header as the first pointer
695
56
  } else {
696
0
    object_at_idx = m_data_32 ? m_data_32->list : m_data_64->list;
697
0
  }
698
56
  object_at_idx += (idx * m_ptr_size);
699
700
56
  ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
701
56
  if (!process_sp)
702
0
    return lldb::ValueObjectSP();
703
56
  Status error;
704
56
  if (error.Fail())
705
0
    return lldb::ValueObjectSP();
706
56
  StreamString idx_name;
707
56
  idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
708
56
  return CreateValueObjectFromAddress(idx_name.GetString(), object_at_idx,
709
56
                                      m_exe_ctx_ref, m_id_type);
710
56
}
lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, true>::GetChildAtIndex(unsigned long)
Line
Count
Source
687
56
  GetChildAtIndex(size_t idx) {
688
56
  if (idx >= CalculateNumChildren())
689
0
    return lldb::ValueObjectSP();
690
56
  lldb::addr_t object_at_idx;
691
56
  if (Inline) {
692
56
    object_at_idx = m_backend.GetSP()->GetValueAsUnsigned(0) + m_ptr_size;
693
56
    object_at_idx += m_ptr_size == 4 ? 
sizeof(D32)0
: sizeof(D64); // skip the data header
694
56
    object_at_idx -= m_ptr_size; // we treat the last entry in the data header as the first pointer
695
56
  } else {
696
0
    object_at_idx = m_data_32 ? m_data_32->list : m_data_64->list;
697
0
  }
698
56
  object_at_idx += (idx * m_ptr_size);
699
700
56
  ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
701
56
  if (!process_sp)
702
0
    return lldb::ValueObjectSP();
703
56
  Status error;
704
56
  if (error.Fail())
705
0
    return lldb::ValueObjectSP();
706
56
  StreamString idx_name;
707
56
  idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
708
56
  return CreateValueObjectFromAddress(idx_name.GetString(), object_at_idx,
709
56
                                      m_exe_ctx_ref, m_id_type);
710
56
}
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1300::IDD32, lldb_private::formatters::Foundation1300::IDD64, true>::GetChildAtIndex(unsigned long)
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::Foundation1436::IDD32, lldb_private::formatters::Foundation1436::IDD64, false>::GetChildAtIndex(unsigned long)
Unexecuted instantiation: lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<lldb_private::formatters::ConstantArray::ConstantArray32, lldb_private::formatters::ConstantArray::ConstantArray64, false>::GetChildAtIndex(unsigned long)
711
712
lldb_private::formatters::NSArray0SyntheticFrontEnd::NSArray0SyntheticFrontEnd(
713
    lldb::ValueObjectSP valobj_sp)
714
8
    : SyntheticChildrenFrontEnd(*valobj_sp) {}
715
716
size_t
717
lldb_private::formatters::NSArray0SyntheticFrontEnd::GetIndexOfChildWithName(
718
0
    ConstString name) {
719
0
  return UINT32_MAX;
720
0
}
721
722
size_t
723
2
lldb_private::formatters::NSArray0SyntheticFrontEnd::CalculateNumChildren() {
724
2
  return 0;
725
2
}
726
727
4
bool lldb_private::formatters::NSArray0SyntheticFrontEnd::Update() {
728
4
  return false;
729
4
}
730
731
2
bool lldb_private::formatters::NSArray0SyntheticFrontEnd::MightHaveChildren() {
732
2
  return false;
733
2
}
734
735
lldb::ValueObjectSP
736
lldb_private::formatters::NSArray0SyntheticFrontEnd::GetChildAtIndex(
737
0
    size_t idx) {
738
0
  return lldb::ValueObjectSP();
739
0
}
740
741
lldb_private::formatters::NSArray1SyntheticFrontEnd::NSArray1SyntheticFrontEnd(
742
    lldb::ValueObjectSP valobj_sp)
743
0
    : SyntheticChildrenFrontEnd(*valobj_sp.get()) {}
744
745
size_t
746
lldb_private::formatters::NSArray1SyntheticFrontEnd::GetIndexOfChildWithName(
747
0
    ConstString name) {
748
0
  static const ConstString g_zero("[0]");
749
750
0
  if (name == g_zero)
751
0
    return 0;
752
753
0
  return UINT32_MAX;
754
0
}
755
756
size_t
757
0
lldb_private::formatters::NSArray1SyntheticFrontEnd::CalculateNumChildren() {
758
0
  return 1;
759
0
}
760
761
0
bool lldb_private::formatters::NSArray1SyntheticFrontEnd::Update() {
762
0
  return false;
763
0
}
764
765
0
bool lldb_private::formatters::NSArray1SyntheticFrontEnd::MightHaveChildren() {
766
0
  return true;
767
0
}
768
769
lldb::ValueObjectSP
770
lldb_private::formatters::NSArray1SyntheticFrontEnd::GetChildAtIndex(
771
0
    size_t idx) {
772
0
  static const ConstString g_zero("[0]");
773
774
0
  if (idx == 0) {
775
0
    TypeSystemClangSP scratch_ts_sp =
776
0
        ScratchTypeSystemClang::GetForTarget(*m_backend.GetTargetSP());
777
0
    if (scratch_ts_sp) {
778
0
      CompilerType id_type(scratch_ts_sp->GetBasicType(lldb::eBasicTypeObjCID));
779
0
      return m_backend.GetSyntheticChildAtOffset(
780
0
          m_backend.GetProcessSP()->GetAddressByteSize(), id_type, true,
781
0
          g_zero);
782
0
    }
783
0
  }
784
0
  return lldb::ValueObjectSP();
785
0
}
786
787
SyntheticChildrenFrontEnd *
788
lldb_private::formatters::NSArraySyntheticFrontEndCreator(
789
186
    CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) {
790
186
  if (!valobj_sp)
791
0
    return nullptr;
792
793
186
  lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
794
186
  if (!process_sp)
795
0
    return nullptr;
796
186
  AppleObjCRuntime *runtime = llvm::dyn_cast_or_null<AppleObjCRuntime>(
797
186
      ObjCLanguageRuntime::Get(*process_sp));
798
186
  if (!runtime)
799
0
    return nullptr;
800
801
186
  CompilerType valobj_type(valobj_sp->GetCompilerType());
802
186
  Flags flags(valobj_type.GetTypeInfo());
803
804
186
  if (flags.IsClear(eTypeIsPointer)) {
805
0
    Status error;
806
0
    valobj_sp = valobj_sp->AddressOf(error);
807
0
    if (error.Fail() || !valobj_sp)
808
0
      return nullptr;
809
0
  }
810
811
186
  ObjCLanguageRuntime::ClassDescriptorSP descriptor(
812
186
      runtime->GetClassDescriptor(*valobj_sp));
813
814
186
  if (!descriptor || !descriptor->IsValid())
815
0
    return nullptr;
816
817
186
  ConstString class_name(descriptor->GetClassName());
818
819
186
  static const ConstString g_NSArrayI("__NSArrayI");
820
186
  static const ConstString g_NSConstantArray("NSConstantArray");
821
186
  static const ConstString g_NSArrayI_Transfer("__NSArrayI_Transfer");
822
186
  static const ConstString g_NSFrozenArrayM("__NSFrozenArrayM");
823
186
  static const ConstString g_NSArrayM("__NSArrayM");
824
186
  static const ConstString g_NSArray0("__NSArray0");
825
186
  static const ConstString g_NSArray1("__NSSingleObjectArrayI");
826
186
  static const ConstString g_NSArrayMLegacy("__NSArrayM_Legacy");
827
186
  static const ConstString g_NSArrayMImmutable("__NSArrayM_Immutable");
828
186
  static const ConstString g_NSCallStackArray("_NSCallStackArray");
829
830
186
  if (class_name.IsEmpty())
831
0
    return nullptr;
832
833
186
  if (class_name == g_NSArrayI) {
834
104
    if (runtime->GetFoundationVersion() >= 1436)
835
104
      return (new Foundation1436::NSArrayISyntheticFrontEnd(valobj_sp));
836
0
    if (runtime->GetFoundationVersion() >= 1430)
837
0
      return (new Foundation1430::NSArrayISyntheticFrontEnd(valobj_sp));
838
0
    return (new Foundation1300::NSArrayISyntheticFrontEnd(valobj_sp));
839
82
  } else if (class_name == g_NSArrayI_Transfer) {
840
0
      return (new Foundation1436::NSArrayI_TransferSyntheticFrontEnd(valobj_sp));
841
82
  } else if (class_name == g_NSConstantArray) {
842
0
    return new ConstantArray::NSConstantArraySyntheticFrontEnd(valobj_sp);
843
82
  } else if (class_name == g_NSFrozenArrayM) {
844
0
    return (new Foundation1436::NSFrozenArrayMSyntheticFrontEnd(valobj_sp));
845
82
  } else if (class_name == g_NSArray0) {
846
8
    return (new NSArray0SyntheticFrontEnd(valobj_sp));
847
74
  } else if (class_name == g_NSArray1) {
848
0
    return (new NSArray1SyntheticFrontEnd(valobj_sp));
849
74
  } else if (class_name == g_NSArrayM) {
850
52
    if (runtime->GetFoundationVersion() >= 1437)
851
52
      return (new Foundation1437::NSArrayMSyntheticFrontEnd(valobj_sp));
852
0
    if (runtime->GetFoundationVersion() >= 1428)
853
0
      return (new Foundation1428::NSArrayMSyntheticFrontEnd(valobj_sp));
854
0
    if (runtime->GetFoundationVersion() >= 1100)
855
0
      return (new Foundation1010::NSArrayMSyntheticFrontEnd(valobj_sp));
856
22
  } else if (class_name == g_NSCallStackArray) {
857
2
    return (new CallStackArray::NSCallStackArraySyntheticFrontEnd(valobj_sp));
858
20
  } else {
859
20
    auto &map(NSArray_Additionals::GetAdditionalSynthetics());
860
20
    auto iter = map.find(class_name), end = map.end();
861
20
    if (iter != end)
862
0
      return iter->second(synth, valobj_sp);
863
20
  }
864
865
20
  return nullptr;
866
186
}