Skip to content

Commit d811642

Browse files
authored
Merge pull request #58985 from artemcm/57-04182022ExtensionConformanceExtraction
[5.7-04182022][Static Mirror] Gather local type extension conformance infos correctly
2 parents 8271718 + 1518795 commit d811642

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

include/swift/Reflection/TypeRefBuilder.h

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,7 @@ class TypeRefBuilder {
843843
using ByteReader = std::function<remote::MemoryReader::ReadBytesResult (remote::RemoteAddress, unsigned)>;
844844
using StringReader = std::function<bool (remote::RemoteAddress, std::string &)>;
845845
using PointerReader = std::function<llvm::Optional<remote::RemoteAbsolutePointer> (remote::RemoteAddress, unsigned)>;
846+
using DynamicSymbolResolver = std::function<llvm::Optional<remote::RemoteAbsolutePointer> (remote::RemoteAddress)>;
846847
using IntVariableReader = std::function<llvm::Optional<uint64_t> (std::string, unsigned)>;
847848

848849
// These fields are captured from the MetadataReader template passed into the
@@ -856,6 +857,7 @@ class TypeRefBuilder {
856857
ByteReader OpaqueByteReader;
857858
StringReader OpaqueStringReader;
858859
PointerReader OpaquePointerReader;
860+
DynamicSymbolResolver OpaqueDynamicSymbolResolver;
859861
IntVariableReader OpaqueIntVariableReader;
860862

861863
public:
@@ -883,6 +885,9 @@ class TypeRefBuilder {
883885
OpaquePointerReader([&reader](remote::RemoteAddress address, unsigned size) -> llvm::Optional<remote::RemoteAbsolutePointer> {
884886
return reader.Reader->readPointer(address, size);
885887
}),
888+
OpaqueDynamicSymbolResolver([&reader](remote::RemoteAddress address) -> llvm::Optional<remote::RemoteAbsolutePointer> {
889+
return reader.Reader->getDynamicSymbol(address);
890+
}),
886891
OpaqueIntVariableReader(
887892
[&reader](std::string symbol, unsigned size) -> llvm::Optional<uint64_t> {
888893
llvm::Optional<uint64_t> result;
@@ -1007,13 +1012,16 @@ class TypeRefBuilder {
10071012
ByteReader OpaqueByteReader;
10081013
StringReader OpaqueStringReader;
10091014
PointerReader OpaquePointerReader;
1015+
DynamicSymbolResolver OpaqueDynamicSymbolResolver;
10101016

10111017
ProtocolConformanceDescriptorReader(ByteReader byteReader,
10121018
StringReader stringReader,
1013-
PointerReader pointerReader)
1019+
PointerReader pointerReader,
1020+
DynamicSymbolResolver dynamicSymbolResolver)
10141021
: Error(""), OpaqueByteReader(byteReader),
1015-
OpaqueStringReader(stringReader), OpaquePointerReader(pointerReader) {
1016-
}
1022+
OpaqueStringReader(stringReader),
1023+
OpaquePointerReader(pointerReader),
1024+
OpaqueDynamicSymbolResolver(dynamicSymbolResolver) {}
10171025

10181026
llvm::Optional<std::string>
10191027
getParentContextName(uintptr_t contextDescriptorAddress) {
@@ -1236,17 +1244,16 @@ class TypeRefBuilder {
12361244
return llvm::None;
12371245
}
12381246
auto contextDescriptorOffset =
1239-
(const uint32_t *)contextDescriptorOffsetBytes.get();
1247+
(const int32_t *)contextDescriptorOffsetBytes.get();
12401248

12411249
// Read the type descriptor itself using the address computed above
12421250
auto contextTypeDescriptorAddress = detail::applyRelativeOffset(
12431251
(const char *)contextDescriptorFieldAddress,
1244-
(int32_t)*contextDescriptorOffset);
1252+
*contextDescriptorOffset);
12451253

12461254
// Instead of a type descriptor this may just be a symbol reference, check that first
1247-
if (auto symbol = OpaquePointerReader(remote::RemoteAddress(contextTypeDescriptorAddress),
1248-
PointerSize)) {
1249-
if (!symbol->getSymbol().empty()) {
1255+
if (auto symbol = OpaqueDynamicSymbolResolver(remote::RemoteAddress(contextTypeDescriptorAddress))) {
1256+
if (!symbol->isResolved()) {
12501257
mangledTypeName = symbol->getSymbol().str();
12511258
Demangle::Context Ctx;
12521259
auto demangledRoot =
@@ -1255,6 +1262,9 @@ class TypeRefBuilder {
12551262
typeName =
12561263
nodeToString(demangledRoot->getChild(0)->getChild(0));
12571264
return std::make_pair(mangledTypeName, typeName);
1265+
} else if (symbol->getOffset()) {
1266+
// If symbol is empty and has an offset, this is the resolved remote address
1267+
contextTypeDescriptorAddress = symbol->getOffset();
12581268
}
12591269
}
12601270

@@ -1450,7 +1460,7 @@ class TypeRefBuilder {
14501460
std::unordered_map<std::string, std::vector<std::string>> typeConformances;
14511461
ProtocolConformanceDescriptorReader<ObjCInteropKind, PointerSize>
14521462
conformanceReader(OpaqueByteReader, OpaqueStringReader,
1453-
OpaquePointerReader);
1463+
OpaquePointerReader, OpaqueDynamicSymbolResolver);
14541464
for (const auto &section : ReflectionInfos) {
14551465
auto ConformanceBegin = section.Conformance.startAddress();
14561466
auto ConformanceEnd = section.Conformance.endAddress();

test/Reflection/Inputs/Conformances.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,5 @@ struct foo {
3131
}
3232
}
3333
}
34+
35+
extension foo : MyProto {}

test/Reflection/conformance_descriptors.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@
1919
// CHECK-DAG: 16ConformanceCheck2C4V (ConformanceCheck.C4) : ConformanceCheck.P1, ConformanceCheck.P2
2020
// CHECK-DAG: 16ConformanceCheck2S4V (ConformanceCheck.S4) : ConformanceCheck.P1, ConformanceCheck.P2
2121
// CHECK-DAG: 16ConformanceCheck2C1C (ConformanceCheck.C1) : ConformanceCheck.ClassBoundP
22+
// CHECK-DAG: 16ConformanceCheck3fooV (ConformanceCheck.foo) : ConformanceCheck.MyProto

0 commit comments

Comments
 (0)