Skip to content

Commit b42752a

Browse files
committed
Add interface for lookup of external MultiPayloadEnumDescriptor
This is a follow up patch that allows for external DescriptorFinders to provide MultiPayloadEnumDescriptors (this is done to support embedded Swift debugging, which encodes the equivalent of Swift metadata as DWARF).
1 parent af1d477 commit b42752a

File tree

4 files changed

+94
-7
lines changed

4 files changed

+94
-7
lines changed

include/swift/RemoteInspection/DescriptorFinder.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,26 @@ struct FieldDescriptorBase {
9393
getFieldRecords() = 0;
9494
};
9595

96+
struct MultiPayloadEnumDescriptorBase {
97+
virtual ~MultiPayloadEnumDescriptorBase(){};
98+
99+
virtual llvm::StringRef getMangledTypeName() = 0;
100+
101+
virtual uint32_t getContentsSizeInWords() const = 0;
102+
103+
virtual size_t getSizeInBytes() const = 0;
104+
105+
virtual uint32_t getFlags() const = 0;
106+
107+
virtual bool usesPayloadSpareBits() const = 0;
108+
109+
virtual uint32_t getPayloadSpareBitMaskByteOffset() const = 0;
110+
111+
virtual uint32_t getPayloadSpareBitMaskByteCount() const = 0;
112+
113+
virtual const uint8_t *getPayloadSpareBits() const = 0;
114+
115+
};
96116
/// Interface for finding type descriptors. Implementors may provide descriptors
97117
/// that live inside or outside reflection metadata.
98118
struct DescriptorFinder {
@@ -104,6 +124,9 @@ struct DescriptorFinder {
104124

105125
virtual std::unique_ptr<FieldDescriptorBase>
106126
getFieldDescriptor(const TypeRef *TR) = 0;
127+
128+
virtual std::unique_ptr<MultiPayloadEnumDescriptorBase>
129+
getMultiPayloadEnumDescriptor(const TypeRef *TR) = 0;
107130
};
108131

109132
} // namespace reflection

include/swift/RemoteInspection/TypeRefBuilder.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -490,8 +490,8 @@ class TypeRefBuilder {
490490
ClosureContextInfo getClosureContextInfo(RemoteRef<CaptureDescriptor> CD);
491491

492492
/// Get the multipayload enum projection information for a given TR
493-
RemoteRef<MultiPayloadEnumDescriptor>
494-
getMultiPayloadEnumInfo(const TypeRef *TR);
493+
std::unique_ptr<MultiPayloadEnumDescriptorBase>
494+
getMultiPayloadEnumDescriptor(const TypeRef *TR) override;
495495

496496
const TypeRef *lookupTypeWitness(const std::string &MangledTypeName,
497497
const std::string &Member,
@@ -515,6 +515,8 @@ class TypeRefBuilder {
515515
/// Load unsubstituted field types for a nominal type.
516516
RemoteRef<FieldDescriptor> getFieldTypeInfo(const TypeRef *TR);
517517

518+
RemoteRef<MultiPayloadEnumDescriptor> getMultiPayloadEnumInfo(const TypeRef *TR);
519+
518520
void populateFieldTypeInfoCacheWithReflectionAtIndex(size_t Index);
519521

520522
llvm::Optional<RemoteRef<FieldDescriptor>>
@@ -1565,15 +1567,16 @@ class TypeRefBuilder {
15651567
}
15661568

15671569
/// Get the multipayload enum projection information for a given TR
1568-
RemoteRef<MultiPayloadEnumDescriptor>
1569-
getMultiPayloadEnumInfo(const TypeRef *TR) {
1570-
return RDF.getMultiPayloadEnumInfo(TR);
1571-
}
1570+
std::unique_ptr<MultiPayloadEnumDescriptorBase>
1571+
getMultiPayloadEnumDescriptor(const TypeRef *TR);
15721572

15731573
private:
15741574
/// Get the primitive type lowering for a builtin type.
15751575
RemoteRef<BuiltinTypeDescriptor> getBuiltinTypeInfo(const TypeRef *TR);
15761576

1577+
RemoteRef<MultiPayloadEnumDescriptor>
1578+
getMultiPayloadEnumInfo(const TypeRef *TR);
1579+
15771580
llvm::Optional<uint64_t> multiPayloadEnumPointerMask;
15781581

15791582
public:

stdlib/public/RemoteInspection/TypeLowering.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2294,7 +2294,7 @@ class EnumTypeInfoBuilder {
22942294
// Uncomment the following line to dump the MPE section every time we come through here...
22952295
//TC.getBuilder().dumpMultiPayloadEnumSection(std::cerr); // DEBUG helper
22962296

2297-
auto MPEDescriptor = TC.getBuilder().getMultiPayloadEnumInfo(TR);
2297+
auto MPEDescriptor = TC.getBuilder().getMultiPayloadEnumDescriptor(TR);
22982298
if (MPEDescriptor && MPEDescriptor->usesPayloadSpareBits()) {
22992299
auto PayloadSpareBitMaskByteCount = MPEDescriptor->getPayloadSpareBitMaskByteCount();
23002300
auto PayloadSpareBitMaskByteOffset = MPEDescriptor->getPayloadSpareBitMaskByteOffset();

stdlib/public/RemoteInspection/TypeRefBuilder.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,50 @@ TypeRefBuilder::getBuiltinTypeDescriptor(const TypeRef *TR) {
574574
return nullptr;
575575
}
576576

577+
namespace {
578+
/// A builtin type descriptor implementation that wraps a reflection builtin
579+
/// type descriptor.
580+
class MultiPayloadEnumDescriptorImpl : public MultiPayloadEnumDescriptorBase {
581+
RemoteRef<MultiPayloadEnumDescriptor> MPED;
582+
TypeRefBuilder &Builder;
583+
584+
public:
585+
MultiPayloadEnumDescriptorImpl(RemoteRef<MultiPayloadEnumDescriptor> MPED,
586+
TypeRefBuilder &Builder)
587+
: MultiPayloadEnumDescriptorBase(), MPED(MPED), Builder(Builder) {}
588+
589+
~MultiPayloadEnumDescriptorImpl() override {}
590+
591+
StringRef getMangledTypeName() override {
592+
return Builder.getTypeRefString(Builder.readTypeRef(MPED, MPED->TypeName));
593+
};
594+
595+
uint32_t getContentsSizeInWords() const override {
596+
return MPED->getContentsSizeInWords();
597+
}
598+
599+
size_t getSizeInBytes() const override { return MPED->getSizeInBytes(); }
600+
601+
uint32_t getFlags() const override { return MPED->getFlags(); }
602+
603+
bool usesPayloadSpareBits() const override {
604+
return MPED->usesPayloadSpareBits();
605+
}
606+
607+
uint32_t getPayloadSpareBitMaskByteOffset() const override {
608+
return MPED->getPayloadSpareBitMaskByteOffset();
609+
}
610+
611+
uint32_t getPayloadSpareBitMaskByteCount() const override {
612+
return MPED->getPayloadSpareBitMaskByteCount();
613+
}
614+
615+
const uint8_t *getPayloadSpareBits() const override {
616+
return MPED->getPayloadSpareBits();
617+
}
618+
};
619+
} // namespace
620+
577621
RemoteRef<MultiPayloadEnumDescriptor>
578622
TypeRefBuilder::ReflectionTypeDescriptorFinder::getMultiPayloadEnumInfo(
579623
const TypeRef *TR) {
@@ -620,6 +664,23 @@ TypeRefBuilder::ReflectionTypeDescriptorFinder::getMultiPayloadEnumInfo(
620664
return nullptr;
621665
}
622666

667+
std::unique_ptr<MultiPayloadEnumDescriptorBase>
668+
TypeRefBuilder::ReflectionTypeDescriptorFinder::getMultiPayloadEnumDescriptor(
669+
const TypeRef *TR) {
670+
if (auto BTI = getMultiPayloadEnumInfo(TR))
671+
return std::make_unique<MultiPayloadEnumDescriptorImpl>(BTI, Builder);
672+
return nullptr;
673+
}
674+
675+
std::unique_ptr<MultiPayloadEnumDescriptorBase>
676+
TypeRefBuilder::getMultiPayloadEnumDescriptor(const TypeRef *TR) {
677+
for (auto *DF : getDescriptorFinders())
678+
if (auto descriptor = DF->getMultiPayloadEnumDescriptor(TR))
679+
return descriptor;
680+
681+
return nullptr;
682+
}
683+
623684
RemoteRef<CaptureDescriptor>
624685
TypeRefBuilder::ReflectionTypeDescriptorFinder::getCaptureDescriptor(
625686
uint64_t RemoteAddress) {

0 commit comments

Comments
 (0)