Skip to content

Commit 91f0284

Browse files
committed
Organize the MemoryReader interface headers to better support
multiple clients.
1 parent b5127aa commit 91f0284

File tree

8 files changed

+320
-189
lines changed

8 files changed

+320
-189
lines changed

include/swift/Reflection/Reader.h

Lines changed: 0 additions & 153 deletions
This file was deleted.

include/swift/Reflection/ReflectionContext.h

Lines changed: 65 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#define SWIFT_REFLECTION_REFLECTIONCONTEXT_H
2020

2121
#include "swift/Runtime/Metadata.h"
22-
#include "swift/Reflection/Reader.h"
22+
#include "swift/Remote/MemoryReader.h"
2323
#include "swift/Reflection/Records.h"
2424
#include "swift/Reflection/TypeRef.h"
2525
#include "swift/SwiftRemoteMirror/SwiftRemoteMirrorTypes.h"
@@ -33,6 +33,41 @@ class NodePointer;
3333
namespace swift {
3434
namespace reflection {
3535

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+
3671
template <typename Runtime>
3772
using SharedTargetMetadataRef = std::shared_ptr<TargetMetadata<Runtime>>;
3873

@@ -87,7 +122,7 @@ class ReflectionContext {
87122
SharedTargetMetadataRef<Runtime> _readMetadata(StoredPointer Address,
88123
size_t Size = sizeof(M)) {
89124
uint8_t *Buffer = (uint8_t *)malloc(Size);
90-
if (!Reader->readBytes(Address, Buffer, Size)) {
125+
if (!Reader->readBytes(RemoteAddress(Address), Buffer, Size)) {
91126
free(Buffer);
92127
return nullptr;
93128
}
@@ -202,7 +237,7 @@ class ReflectionContext {
202237
return Cached->second;
203238

204239
StoredPointer KindValue = 0;
205-
if (!Reader->readInteger(Address, &KindValue))
240+
if (!Reader->readInteger(RemoteAddress(Address), &KindValue))
206241
return nullptr;
207242

208243
auto Kind = static_cast<MetadataKind>(KindValue);
@@ -219,7 +254,8 @@ class ReflectionContext {
219254
StoredPointer NumProtocolsAddress = Address +
220255
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
221256
StoredPointer NumProtocols;
222-
if (!Reader->readInteger(NumProtocolsAddress, &NumProtocols))
257+
if (!Reader->readInteger(RemoteAddress(NumProtocolsAddress),
258+
&NumProtocols))
223259
return nullptr;
224260

225261
auto TotalSize = sizeof(TargetExistentialTypeMetadata<Runtime>) +
@@ -254,7 +290,8 @@ class ReflectionContext {
254290
auto NumElementsAddress = Address +
255291
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
256292
StoredSize NumElements;
257-
if (!Reader->readInteger(NumElementsAddress, &NumElements))
293+
if (!Reader->readInteger(RemoteAddress(NumElementsAddress),
294+
&NumElements))
258295
return nullptr;
259296
auto TotalSize = sizeof(TargetTupleTypeMetadata<Runtime>) +
260297
NumElements * sizeof(StoredPointer);
@@ -270,7 +307,7 @@ class ReflectionContext {
270307
template<typename Offset>
271308
StoredPointer resolveRelativeOffset(StoredPointer targetAddress) {
272309
Offset relative;
273-
if (!Reader->readInteger(targetAddress, &relative))
310+
if (!Reader->readInteger(RemoteAddress(targetAddress), &relative))
274311
return 0;
275312
using SignedOffset = typename std::make_signed<Offset>::type;
276313
using SignedPointer = typename std::make_signed<StoredPointer>::type;
@@ -316,7 +353,7 @@ class ReflectionContext {
316353

317354
auto Size = sizeof(TargetNominalTypeDescriptor<Runtime>);
318355
auto Buffer = (uint8_t *)malloc(Size);
319-
if (!Reader->readBytes(DescriptorAddress, Buffer, Size)) {
356+
if (!Reader->readBytes(RemoteAddress(DescriptorAddress), Buffer, Size)) {
320357
free(Buffer);
321358
return {nullptr, 0};
322359
}
@@ -340,7 +377,7 @@ class ReflectionContext {
340377
readProtocolDescriptor(StoredPointer Address) {
341378
auto Size = sizeof(TargetProtocolDescriptor<Runtime>);
342379
auto Buffer = (uint8_t *)malloc(Size);
343-
if (!Reader->readBytes(Address, Buffer, Size)) {
380+
if (!Reader->readBytes(RemoteAddress(Address), Buffer, Size)) {
344381
free(Buffer);
345382
return nullptr;
346383
}
@@ -356,7 +393,8 @@ class ReflectionContext {
356393
auto AddressOfParentAddress
357394
= resolveRelativeOffset<StoredPointer>(MetadataAddress +
358395
ValueMeta->offsetToParentOffset());
359-
if (!Reader->readInteger(AddressOfParentAddress, &ParentAddress))
396+
if (!Reader->readInteger(RemoteAddress(AddressOfParentAddress),
397+
&ParentAddress))
360398
return 0;
361399
} else if (auto Class = dyn_cast<TargetClassMetadata<Runtime>>(Meta.get())){
362400
StoredPointer DescriptorAddress;
@@ -366,7 +404,8 @@ class ReflectionContext {
366404
TypeRefVector Substitutions;
367405
auto OffsetToParent
368406
= sizeof(StoredPointer) * (Descriptor->GenericParams.Offset - 1);
369-
if (!Reader->readInteger(MetadataAddress + OffsetToParent, &ParentAddress))
407+
if (!Reader->readInteger(RemoteAddress(MetadataAddress + OffsetToParent),
408+
&ParentAddress))
370409
return 0;
371410
}
372411
return ParentAddress;
@@ -393,8 +432,8 @@ class ReflectionContext {
393432
for (ArgIndex i = 0; i < NumGenericParams; ++i,
394433
AddressOfGenericArgAddress += sizeof(StoredPointer)) {
395434
StoredPointer GenericArgAddress;
396-
if (!Reader->readInteger(AddressOfGenericArgAddress,
397-
&GenericArgAddress))
435+
if (!Reader->readInteger(RemoteAddress(AddressOfGenericArgAddress),
436+
&GenericArgAddress))
398437
return {};
399438
if (auto GenericArg = getTypeRef(GenericArgAddress))
400439
Substitutions.push_back(GenericArg);
@@ -418,8 +457,8 @@ class ReflectionContext {
418457
auto NameAddress
419458
= resolveRelativeOffset<int32_t>(DescriptorAddress +
420459
Descriptor->offsetToNameOffset());
421-
auto MangledName = Reader->readString(NameAddress);
422-
if (MangledName.empty())
460+
std::string MangledName;
461+
if (!Reader->readString(RemoteAddress(NameAddress), MangledName))
423462
return nullptr;
424463

425464
auto DemangleNode = Demangle::demangleTypeAsNode(MangledName);
@@ -471,7 +510,8 @@ class ReflectionContext {
471510
for (StoredPointer i = 0; i < TupleMeta->NumElements; ++i,
472511
ElementAddress += sizeof(Element)) {
473512
Element E;
474-
if (!Reader->readBytes(ElementAddress, (uint8_t*)&E, sizeof(Element)))
513+
if (!Reader->readBytes(RemoteAddress(ElementAddress),
514+
(uint8_t*)&E, sizeof(Element)))
475515
return nullptr;
476516

477517
if (auto ElementTypeRef = getTypeRef(E.Type))
@@ -486,15 +526,17 @@ class ReflectionContext {
486526
StoredPointer FlagsAddress = MetadataAddress +
487527
TargetFunctionTypeMetadata<Runtime>::OffsetToFlags;
488528
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)))
490531
return nullptr;
491532
TypeRefVector Arguments;
492533
StoredPointer ArgumentAddress = MetadataAddress +
493534
sizeof(TargetFunctionTypeMetadata<Runtime>);
494535
for (StoredPointer i = 0; i < Function->getNumArguments(); ++i,
495536
ArgumentAddress += sizeof(StoredPointer)) {
496537
StoredPointer FlaggedArgumentAddress;
497-
if (!Reader->readInteger(ArgumentAddress, &FlaggedArgumentAddress))
538+
if (!Reader->readInteger(RemoteAddress(ArgumentAddress),
539+
&FlaggedArgumentAddress))
498540
return nullptr;
499541
// TODO: Use target-agnostic FlaggedPointer to mask this!
500542
FlaggedArgumentAddress &= ~((StoredPointer)1);
@@ -517,8 +559,10 @@ class ReflectionContext {
517559
auto ProtocolDescriptor = readProtocolDescriptor(ProtocolAddress);
518560
if (!ProtocolDescriptor)
519561
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))
522566
return nullptr;
523567
auto Demangled = Demangle::demangleSymbolAsNode(MangledName);
524568
auto Protocol = TypeRef::fromDemangleNode(Demangled);
@@ -607,8 +651,8 @@ class ReflectionContext {
607651
auto NameAddress
608652
= resolveRelativeOffset<int32_t>(DescriptorAddress +
609653
Descriptor->offsetToNameOffset());
610-
auto MangledName = Reader->readString(NameAddress);
611-
if (MangledName.empty())
654+
std::string MangledName;
655+
if (!Reader->readString(RemoteAddress(NameAddress), MangledName))
612656
return {};
613657

614658
auto TR = getTypeRef(MetadataAddress);

0 commit comments

Comments
 (0)