Skip to content

Commit 812557c

Browse files
committed
Reorganization within RemoteAST. Basic error propagation.
Initial stabs towards reading foreign class metadata, although these do not yet successfully resolve the declaration.
1 parent d574c19 commit 812557c

File tree

9 files changed

+261
-115
lines changed

9 files changed

+261
-115
lines changed

include/swift/Reflection/TypeRefBuilder.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ class TypeRefBuilder {
205205
return ObjCClassTypeRef::getUnnamed();
206206
}
207207

208+
const ForeignClassTypeRef *createForeignClassType(std::string &&mangledName) {
209+
return ForeignClassTypeRef::getUnnamed(); // FIXME
210+
}
211+
208212
const ForeignClassTypeRef *getUnnamedForeignClassType() {
209213
return ForeignClassTypeRef::getUnnamed();
210214
}

include/swift/Remote/Failure.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,8 @@ class Failure {
256256

257257
// Do something based on the character after '%'.
258258
char c = *next++;
259+
text = next;
260+
259261
if (c == '%') {
260262
result += c;
261263
continue;

include/swift/Remote/FailureKinds.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,7 @@ FAILURE(Unknown, "an unknown failure occurred", ())
1616
FAILURE(Memory, "an unknown failure occurred while reading %0 at address %1",
1717
(String, Address))
1818

19+
FAILURE(CouldNotResolveTypeDecl,
20+
"could not resolve a type with mangled name '%0'", (String))
21+
1922
#undef FAILURE

include/swift/Remote/MetadataReader.h

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -538,8 +538,18 @@ class MetadataReader {
538538
if (!Instance) return BuiltType();
539539
return Builder.createExistentialMetatypeType(Instance);
540540
}
541-
case MetadataKind::ForeignClass:
542-
return Builder.getUnnamedForeignClassType();
541+
case MetadataKind::ForeignClass: {
542+
auto namePtrAddress =
543+
Meta.getAddress() + TargetForeignClassMetadata<Runtime>::OffsetToName;
544+
StoredPointer namePtr;
545+
if (!Reader->readInteger(RemoteAddress(namePtrAddress), &namePtr) ||
546+
namePtr == 0)
547+
return BuiltType();
548+
std::string name;
549+
if (!Reader->readString(RemoteAddress(namePtr), name))
550+
return BuiltType();
551+
return Builder.createForeignClassType(std::move(name));
552+
}
543553
case MetadataKind::HeapLocalVariable:
544554
return Builder.getUnnamedForeignClassType(); // FIXME?
545555
case MetadataKind::HeapGenericLocalVariable:
@@ -574,9 +584,14 @@ class MetadataReader {
574584
}
575585

576586
private:
577-
template <typename M>
578-
MetadataRef _readMetadata(StoredPointer address, size_t size = sizeof(M)) {
579-
uint8_t *buffer = (uint8_t *)malloc(size);
587+
template <template <class R> class M>
588+
MetadataRef _readMetadata(StoredPointer address) {
589+
return _readMetadata(address, sizeof(M<Runtime>));
590+
}
591+
592+
MetadataRef _readMetadata(StoredPointer address, size_t sizeAfter) {
593+
auto size = sizeAfter;
594+
uint8_t *buffer = (uint8_t *) malloc(size);
580595
if (!Reader->readBytes(RemoteAddress(address), buffer, size)) {
581596
free(buffer);
582597
return nullptr;
@@ -598,58 +613,55 @@ class MetadataReader {
598613

599614
switch (getEnumeratedMetadataKind(KindValue)) {
600615
case MetadataKind::Class:
601-
return _readMetadata<TargetClassMetadata<Runtime>>(address);
616+
return _readMetadata<TargetClassMetadata>(address);
602617
case MetadataKind::Enum:
603-
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
618+
return _readMetadata<TargetEnumMetadata>(address);
604619
case MetadataKind::ErrorObject:
605-
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
620+
return _readMetadata<TargetEnumMetadata>(address);
606621
case MetadataKind::Existential: {
607-
StoredPointer NumProtocolsAddress = address +
622+
StoredPointer numProtocolsAddress = address +
608623
TargetExistentialTypeMetadata<Runtime>::OffsetToNumProtocols;
609-
StoredPointer NumProtocols;
610-
if (!Reader->readInteger(RemoteAddress(NumProtocolsAddress),
611-
&NumProtocols))
624+
StoredPointer numProtocols;
625+
if (!Reader->readInteger(RemoteAddress(numProtocolsAddress),
626+
&numProtocols))
612627
return nullptr;
613628

614-
auto TotalSize = sizeof(TargetExistentialTypeMetadata<Runtime>) +
615-
NumProtocols *
629+
auto totalSize = sizeof(TargetExistentialTypeMetadata<Runtime>)
630+
+ numProtocols *
616631
sizeof(ConstTargetMetadataPointer<Runtime, TargetProtocolDescriptor>);
617632

618-
return _readMetadata<TargetExistentialTypeMetadata<Runtime>>(address,
619-
TotalSize);
633+
return _readMetadata(address, totalSize);
620634
}
621635
case MetadataKind::ExistentialMetatype:
622-
return _readMetadata<
623-
TargetExistentialMetatypeMetadata<Runtime>>(address);
636+
return _readMetadata<TargetExistentialMetatypeMetadata>(address);
624637
case MetadataKind::ForeignClass:
625-
return _readMetadata<TargetForeignClassMetadata<Runtime>>(address);
638+
return _readMetadata<TargetForeignClassMetadata>(address);
626639
case MetadataKind::Function:
627-
return _readMetadata<TargetFunctionTypeMetadata<Runtime>>(address);
640+
return _readMetadata<TargetFunctionTypeMetadata>(address);
628641
case MetadataKind::HeapGenericLocalVariable:
629-
return _readMetadata<TargetHeapLocalVariableMetadata<Runtime>>(address);
642+
return _readMetadata<TargetHeapLocalVariableMetadata>(address);
630643
case MetadataKind::HeapLocalVariable:
631-
return _readMetadata<TargetHeapLocalVariableMetadata<Runtime>>(address);
644+
return _readMetadata<TargetHeapLocalVariableMetadata>(address);
632645
case MetadataKind::Metatype:
633-
return _readMetadata<TargetMetatypeMetadata<Runtime>>(address);
646+
return _readMetadata<TargetMetatypeMetadata>(address);
634647
case MetadataKind::ObjCClassWrapper:
635-
return _readMetadata<TargetObjCClassWrapperMetadata<Runtime>>(address);
648+
return _readMetadata<TargetObjCClassWrapperMetadata>(address);
636649
case MetadataKind::Opaque:
637-
return _readMetadata<TargetOpaqueMetadata<Runtime>>(address);
650+
return _readMetadata<TargetOpaqueMetadata>(address);
638651
case MetadataKind::Optional:
639-
return _readMetadata<TargetEnumMetadata<Runtime>>(address);
652+
return _readMetadata<TargetEnumMetadata>(address);
640653
case MetadataKind::Struct:
641-
return _readMetadata<TargetStructMetadata<Runtime>>(address);
654+
return _readMetadata<TargetStructMetadata>(address);
642655
case MetadataKind::Tuple: {
643-
auto NumElementsAddress = address +
656+
auto numElementsAddress = address +
644657
TargetTupleTypeMetadata<Runtime>::OffsetToNumElements;
645-
StoredSize NumElements;
646-
if (!Reader->readInteger(RemoteAddress(NumElementsAddress),
647-
&NumElements))
658+
StoredSize numElements;
659+
if (!Reader->readInteger(RemoteAddress(numElementsAddress),
660+
&numElements))
648661
return nullptr;
649-
auto TotalSize = sizeof(TargetTupleTypeMetadata<Runtime>) +
650-
NumElements * sizeof(StoredPointer);
651-
return _readMetadata<TargetTupleTypeMetadata<Runtime>>(address,
652-
TotalSize);
662+
auto totalSize = sizeof(TargetTupleTypeMetadata<Runtime>)
663+
+ numElements * sizeof(StoredPointer);
664+
return _readMetadata(address, totalSize);
653665
}
654666
}
655667

include/swift/Runtime/Metadata.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1894,6 +1894,9 @@ struct TargetForeignTypeMetadata : public TargetMetadata<Runtime> {
18941894

18951895
struct HeaderType : HeaderPrefix, TypeMetadataHeader {};
18961896

1897+
static constexpr int OffsetToName =
1898+
(int) offsetof(HeaderType, Name) - (int) sizeof(HeaderType);
1899+
18971900
TargetPointer<Runtime, const char> getName() const {
18981901
return reinterpret_cast<TargetPointer<Runtime, const char>>(
18991902
asFullMetadata(this)->Name);

lib/IRGen/GenMeta.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5391,13 +5391,13 @@ namespace {
53915391

53925392
llvm::Constant *
53935393
IRGenModule::getAddrOfForeignTypeMetadataCandidate(CanType type) {
5394-
// Create a temporary base for relative references.
5395-
auto tempBase = createTemporaryRelativeAddressBase(*this);
5396-
53975394
// What we save in GlobalVars is actually the offsetted value.
53985395
auto entity = LinkEntity::forForeignTypeMetadataCandidate(type);
53995396
if (auto entry = GlobalVars[entity])
54005397
return entry;
5398+
5399+
// Create a temporary base for relative references.
5400+
auto tempBase = createTemporaryRelativeAddressBase(*this);
54015401

54025402
// Compute the constant initializer and the offset of the type
54035403
// metadata candidate within it.

0 commit comments

Comments
 (0)