19
19
#define SWIFT_REFLECTION_REFLECTIONCONTEXT_H
20
20
21
21
#include " swift/Runtime/Metadata.h"
22
- #include " swift/Reflection/Reader .h"
22
+ #include " swift/Remote/MemoryReader .h"
23
23
#include " swift/Reflection/Records.h"
24
24
#include " swift/Reflection/TypeRef.h"
25
25
#include " swift/SwiftRemoteMirror/SwiftRemoteMirrorTypes.h"
@@ -33,6 +33,41 @@ class NodePointer;
33
33
namespace swift {
34
34
namespace reflection {
35
35
36
+ using swift::remote::MemoryReader;
37
+ using swift::remote::RemoteAddress;
38
+
39
+ template <typename Iterator>
40
+ class ReflectionSection {
41
+ using const_iterator = Iterator;
42
+ const void * const Begin;
43
+ const void * const End;
44
+
45
+ public:
46
+ ReflectionSection (const void * const Begin,
47
+ const void * const End)
48
+ : Begin(Begin), End(End) {}
49
+
50
+ ReflectionSection (uint64_t Begin, uint64_t End)
51
+ : Begin(reinterpret_cast <const void * const >(Begin)),
52
+ End (reinterpret_cast <const void * const >(End)) {}
53
+
54
+ void *startAddress () {
55
+ return const_cast <void *>(Begin);
56
+ }
57
+
58
+ const_iterator begin () const {
59
+ return const_iterator (Begin, End);
60
+ }
61
+
62
+ const_iterator end () const {
63
+ return const_iterator (End, End);
64
+ }
65
+
66
+ size_t size () const {
67
+ return (char *)End - (char *)Begin;
68
+ }
69
+ };
70
+
36
71
template <typename Runtime>
37
72
using SharedTargetMetadataRef = std::shared_ptr<TargetMetadata<Runtime>>;
38
73
@@ -87,7 +122,7 @@ class ReflectionContext {
87
122
SharedTargetMetadataRef<Runtime> _readMetadata (StoredPointer Address,
88
123
size_t Size = sizeof (M)) {
89
124
uint8_t *Buffer = (uint8_t *)malloc (Size);
90
- if (!Reader->readBytes (Address, Buffer, Size)) {
125
+ if (!Reader->readBytes (RemoteAddress ( Address) , Buffer, Size)) {
91
126
free (Buffer);
92
127
return nullptr ;
93
128
}
@@ -202,7 +237,7 @@ class ReflectionContext {
202
237
return Cached->second ;
203
238
204
239
StoredPointer KindValue = 0 ;
205
- if (!Reader->readInteger (Address, &KindValue))
240
+ if (!Reader->readInteger (RemoteAddress ( Address) , &KindValue))
206
241
return nullptr ;
207
242
208
243
auto Kind = static_cast <MetadataKind>(KindValue);
@@ -219,7 +254,8 @@ class ReflectionContext {
219
254
StoredPointer NumProtocolsAddress = Address +
220
255
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
221
256
StoredPointer NumProtocols;
222
- if (!Reader->readInteger (NumProtocolsAddress, &NumProtocols))
257
+ if (!Reader->readInteger (RemoteAddress (NumProtocolsAddress),
258
+ &NumProtocols))
223
259
return nullptr ;
224
260
225
261
auto TotalSize = sizeof (TargetExistentialTypeMetadata<Runtime>) +
@@ -254,7 +290,8 @@ class ReflectionContext {
254
290
auto NumElementsAddress = Address +
255
291
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
256
292
StoredSize NumElements;
257
- if (!Reader->readInteger (NumElementsAddress, &NumElements))
293
+ if (!Reader->readInteger (RemoteAddress (NumElementsAddress),
294
+ &NumElements))
258
295
return nullptr ;
259
296
auto TotalSize = sizeof (TargetTupleTypeMetadata<Runtime>) +
260
297
NumElements * sizeof (StoredPointer);
@@ -270,7 +307,7 @@ class ReflectionContext {
270
307
template <typename Offset>
271
308
StoredPointer resolveRelativeOffset (StoredPointer targetAddress) {
272
309
Offset relative;
273
- if (!Reader->readInteger (targetAddress, &relative))
310
+ if (!Reader->readInteger (RemoteAddress ( targetAddress) , &relative))
274
311
return 0 ;
275
312
using SignedOffset = typename std::make_signed<Offset>::type;
276
313
using SignedPointer = typename std::make_signed<StoredPointer>::type;
@@ -316,7 +353,7 @@ class ReflectionContext {
316
353
317
354
auto Size = sizeof (TargetNominalTypeDescriptor<Runtime>);
318
355
auto Buffer = (uint8_t *)malloc (Size);
319
- if (!Reader->readBytes (DescriptorAddress, Buffer, Size)) {
356
+ if (!Reader->readBytes (RemoteAddress ( DescriptorAddress) , Buffer, Size)) {
320
357
free (Buffer);
321
358
return {nullptr , 0 };
322
359
}
@@ -340,7 +377,7 @@ class ReflectionContext {
340
377
readProtocolDescriptor (StoredPointer Address) {
341
378
auto Size = sizeof (TargetProtocolDescriptor<Runtime>);
342
379
auto Buffer = (uint8_t *)malloc (Size);
343
- if (!Reader->readBytes (Address, Buffer, Size)) {
380
+ if (!Reader->readBytes (RemoteAddress ( Address) , Buffer, Size)) {
344
381
free (Buffer);
345
382
return nullptr ;
346
383
}
@@ -356,7 +393,8 @@ class ReflectionContext {
356
393
auto AddressOfParentAddress
357
394
= resolveRelativeOffset<StoredPointer>(MetadataAddress +
358
395
ValueMeta->offsetToParentOffset ());
359
- if (!Reader->readInteger (AddressOfParentAddress, &ParentAddress))
396
+ if (!Reader->readInteger (RemoteAddress (AddressOfParentAddress),
397
+ &ParentAddress))
360
398
return 0 ;
361
399
} else if (auto Class = dyn_cast<TargetClassMetadata<Runtime>>(Meta.get ())){
362
400
StoredPointer DescriptorAddress;
@@ -366,7 +404,8 @@ class ReflectionContext {
366
404
TypeRefVector Substitutions;
367
405
auto OffsetToParent
368
406
= sizeof (StoredPointer) * (Descriptor->GenericParams .Offset - 1 );
369
- if (!Reader->readInteger (MetadataAddress + OffsetToParent, &ParentAddress))
407
+ if (!Reader->readInteger (RemoteAddress (MetadataAddress + OffsetToParent),
408
+ &ParentAddress))
370
409
return 0 ;
371
410
}
372
411
return ParentAddress;
@@ -393,8 +432,8 @@ class ReflectionContext {
393
432
for (ArgIndex i = 0 ; i < NumGenericParams; ++i,
394
433
AddressOfGenericArgAddress += sizeof (StoredPointer)) {
395
434
StoredPointer GenericArgAddress;
396
- if (!Reader->readInteger (AddressOfGenericArgAddress,
397
- &GenericArgAddress))
435
+ if (!Reader->readInteger (RemoteAddress ( AddressOfGenericArgAddress) ,
436
+ &GenericArgAddress))
398
437
return {};
399
438
if (auto GenericArg = getTypeRef (GenericArgAddress))
400
439
Substitutions.push_back (GenericArg);
@@ -418,8 +457,8 @@ class ReflectionContext {
418
457
auto NameAddress
419
458
= resolveRelativeOffset<int32_t >(DescriptorAddress +
420
459
Descriptor->offsetToNameOffset ());
421
- auto MangledName = Reader-> readString (NameAddress) ;
422
- if (MangledName. empty ( ))
460
+ std::string MangledName;
461
+ if (!Reader-> readString ( RemoteAddress (NameAddress), MangledName ))
423
462
return nullptr ;
424
463
425
464
auto DemangleNode = Demangle::demangleTypeAsNode (MangledName);
@@ -471,7 +510,8 @@ class ReflectionContext {
471
510
for (StoredPointer i = 0 ; i < TupleMeta->NumElements ; ++i,
472
511
ElementAddress += sizeof (Element)) {
473
512
Element E;
474
- if (!Reader->readBytes (ElementAddress, (uint8_t *)&E, sizeof (Element)))
513
+ if (!Reader->readBytes (RemoteAddress (ElementAddress),
514
+ (uint8_t *)&E, sizeof (Element)))
475
515
return nullptr ;
476
516
477
517
if (auto ElementTypeRef = getTypeRef (E.Type ))
@@ -486,15 +526,17 @@ class ReflectionContext {
486
526
StoredPointer FlagsAddress = MetadataAddress +
487
527
TargetFunctionTypeMetadata<Runtime>::OffsetToFlags;
488
528
TargetFunctionTypeFlags<Runtime> Flags;
489
- if (!Reader->readBytes (FlagsAddress, (uint8_t *)&Flags, sizeof (Flags)))
529
+ if (!Reader->readBytes (RemoteAddress (FlagsAddress),
530
+ (uint8_t *)&Flags, sizeof (Flags)))
490
531
return nullptr ;
491
532
TypeRefVector Arguments;
492
533
StoredPointer ArgumentAddress = MetadataAddress +
493
534
sizeof (TargetFunctionTypeMetadata<Runtime>);
494
535
for (StoredPointer i = 0 ; i < Function->getNumArguments (); ++i,
495
536
ArgumentAddress += sizeof (StoredPointer)) {
496
537
StoredPointer FlaggedArgumentAddress;
497
- if (!Reader->readInteger (ArgumentAddress, &FlaggedArgumentAddress))
538
+ if (!Reader->readInteger (RemoteAddress (ArgumentAddress),
539
+ &FlaggedArgumentAddress))
498
540
return nullptr ;
499
541
// TODO: Use target-agnostic FlaggedPointer to mask this!
500
542
FlaggedArgumentAddress &= ~((StoredPointer)1 );
@@ -517,8 +559,10 @@ class ReflectionContext {
517
559
auto ProtocolDescriptor = readProtocolDescriptor (ProtocolAddress);
518
560
if (!ProtocolDescriptor)
519
561
return nullptr ;
520
- auto MangledName = Reader->readString (ProtocolDescriptor->Name );
521
- if (MangledName.empty ())
562
+
563
+ std::string MangledName;
564
+ if (!Reader->readString (RemoteAddress (ProtocolDescriptor->Name ),
565
+ MangledName))
522
566
return nullptr ;
523
567
auto Demangled = Demangle::demangleSymbolAsNode (MangledName);
524
568
auto Protocol = TypeRef::fromDemangleNode (Demangled);
@@ -607,8 +651,8 @@ class ReflectionContext {
607
651
auto NameAddress
608
652
= resolveRelativeOffset<int32_t >(DescriptorAddress +
609
653
Descriptor->offsetToNameOffset ());
610
- auto MangledName = Reader-> readString (NameAddress) ;
611
- if (MangledName. empty ( ))
654
+ std::string MangledName;
655
+ if (!Reader-> readString ( RemoteAddress (NameAddress), MangledName ))
612
656
return {};
613
657
614
658
auto TR = getTypeRef (MetadataAddress);
0 commit comments