Skip to content

Commit d7197fc

Browse files
committed
[concurrency] Add a new type Builtin.ImplicitIsolationActor.
This is currently not wired up to anything. I am going to wire it up in subsequent commits. The reason why we are introducing this new Builtin type is to represent that we are going to start stealing bits from the protocol witness table pointer of the Optional<any Actor> that this type is bitwise compatible with. The type will ensure that this value is only used in places where we know that it will be properly masked out giving us certainty that this value will not be used in any manner without it first being bit cleared and transformed back to Optional<any Actor>.
1 parent 39a02e8 commit d7197fc

24 files changed

+233
-6
lines changed

include/swift/AST/TypeNodes.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ ABSTRACT_TYPE(Builtin, Type)
144144
BUILTIN_CONCRETE_TYPE(BuiltinVector, BuiltinType)
145145
BUILTIN_GENERIC_TYPE(BuiltinFixedArray, BuiltinType)
146146
BUILTIN_CONCRETE_TYPE(BuiltinUnboundGeneric, BuiltinType)
147-
TYPE_RANGE(Builtin, BuiltinInteger, BuiltinUnboundGeneric)
147+
BUILTIN_CONCRETE_TYPE(BuiltinImplicitIsolationActor, BuiltinType)
148+
TYPE_RANGE(Builtin, BuiltinInteger, BuiltinImplicitIsolationActor)
148149
TYPE(Tuple, Type)
149150
ABSTRACT_TYPE(ReferenceStorage, Type)
150151
#define REF_STORAGE(Name, ...) \
@@ -234,6 +235,7 @@ SINGLETON_TYPE(RawPointer, BuiltinRawPointer)
234235
SINGLETON_TYPE(RawUnsafeContinuation, BuiltinRawUnsafeContinuation)
235236
SINGLETON_TYPE(NativeObject, BuiltinNativeObject)
236237
SINGLETON_TYPE(BridgeObject, BuiltinBridgeObject)
238+
SINGLETON_TYPE(ImplicitIsolationActor, BuiltinImplicitIsolationActor)
237239
SINGLETON_TYPE(UnsafeValueBuffer, BuiltinUnsafeValueBuffer)
238240
SINGLETON_TYPE(DefaultActorStorage, BuiltinDefaultActorStorage)
239241
SINGLETON_TYPE(NonDefaultDistributedActorStorage, BuiltinNonDefaultDistributedActorStorage)

include/swift/AST/Types.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,6 +2012,19 @@ BEGIN_CAN_TYPE_WRAPPER(BuiltinVectorType, BuiltinType)
20122012
PROXY_CAN_TYPE_SIMPLE_GETTER(getElementType)
20132013
END_CAN_TYPE_WRAPPER(BuiltinVectorType, BuiltinType)
20142014

2015+
class BuiltinImplicitIsolationActorType : public BuiltinType {
2016+
friend class ASTContext;
2017+
2018+
BuiltinImplicitIsolationActorType(const ASTContext &context)
2019+
: BuiltinType(TypeKind::BuiltinImplicitIsolationActor, context) {}
2020+
2021+
public:
2022+
static bool classof(const TypeBase *T) {
2023+
return T->getKind() == TypeKind::BuiltinImplicitIsolationActor;
2024+
}
2025+
};
2026+
DEFINE_EMPTY_CAN_TYPE_WRAPPER(BuiltinImplicitIsolationActorType, BuiltinType)
2027+
20152028
/// Size descriptor for a builtin integer type. This is either a fixed bit
20162029
/// width or an abstract target-dependent value such as "size of a pointer".
20172030
class BuiltinIntegerWidth {

include/swift/SIL/SILType.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,10 @@ class SILType {
266266

267267
bool isBuiltinBridgeObject() const { return is<BuiltinBridgeObjectType>(); }
268268

269+
bool isBuiltinImplicitIsolationActor() const {
270+
return is<BuiltinImplicitIsolationActorType>();
271+
}
272+
269273
SILType getBuiltinVectorElementType() const {
270274
auto vector = castTo<BuiltinVectorType>();
271275
return getPrimitiveObjectType(vector.getElementType());
@@ -1032,6 +1036,9 @@ class SILType {
10321036
/// Get the type for opaque actor isolation values.
10331037
static SILType getOpaqueIsolationType(const ASTContext &C);
10341038

1039+
/// Return Builtin.ImplicitIsolationActor.
1040+
static SILType getBuiltinImplicitIsolationActorType(const ASTContext &ctx);
1041+
10351042
//
10361043
// Utilities for treating SILType as a pointer-like type.
10371044
//

include/swift/Strings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ constexpr static BuiltinNameStringLiteral BUILTIN_TYPE_NAME_NATIVEOBJECT = {
144144
/// The name of the Builtin type for BridgeObject
145145
constexpr static BuiltinNameStringLiteral BUILTIN_TYPE_NAME_BRIDGEOBJECT = {
146146
"Builtin.BridgeObject"};
147+
constexpr static BuiltinNameStringLiteral
148+
BUILTIN_TYPE_NAME_IMPLICITISOLATIONACTOR = {
149+
"Builtin.ImplicitIsolationActor"};
147150
/// The name of the Builtin type for RawPointer
148151
constexpr static BuiltinNameStringLiteral BUILTIN_TYPE_NAME_RAWPOINTER = {
149152
"Builtin.RawPointer"};

lib/AST/ASTDumper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6110,6 +6110,8 @@ namespace {
61106110
TRIVIAL_TYPE_PRINTER(BuiltinRawUnsafeContinuation, builtin_raw_unsafe_continuation)
61116111
TRIVIAL_TYPE_PRINTER(BuiltinNativeObject, builtin_native_object)
61126112
TRIVIAL_TYPE_PRINTER(BuiltinBridgeObject, builtin_bridge_object)
6113+
TRIVIAL_TYPE_PRINTER(BuiltinImplicitIsolationActor,
6114+
builtin_implicit_isolated_actor)
61136115
TRIVIAL_TYPE_PRINTER(BuiltinUnsafeValueBuffer, builtin_unsafe_value_buffer)
61146116
TRIVIAL_TYPE_PRINTER(SILToken, sil_token)
61156117

lib/AST/ASTMangler.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,6 +1458,8 @@ void ASTMangler::appendType(Type type, GenericSignature sig,
14581458
auto loc = cast<LocatableType>(tybase);
14591459
return appendType(loc->getSinglyDesugaredType(), sig, forDecl);
14601460
}
1461+
case TypeKind::BuiltinImplicitIsolationActor:
1462+
return appendOperator("BA");
14611463
case TypeKind::BuiltinFixedArray: {
14621464
auto bfa = cast<BuiltinFixedArrayType>(tybase);
14631465
appendType(bfa->getSize(), sig, forDecl);

lib/AST/ASTPrinter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6171,6 +6171,7 @@ class TypePrinter : public TypeVisitor<TypePrinter, void, NonRecursivePrintOptio
61716171
ASTPRINTER_PRINT_BUILTINTYPE(BuiltinIntegerType)
61726172
ASTPRINTER_PRINT_BUILTINTYPE(BuiltinFloatType)
61736173
ASTPRINTER_PRINT_BUILTINTYPE(BuiltinUnboundGenericType)
6174+
ASTPRINTER_PRINT_BUILTINTYPE(BuiltinImplicitIsolationActorType)
61746175
#undef ASTPRINTER_PRINT_BUILTINTYPE
61756176

61766177
void visitBuiltinFixedArrayType(BuiltinFixedArrayType *T,

lib/AST/Builtins.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ Type swift::getBuiltinType(ASTContext &Context, StringRef Name) {
8282
.Case("Word", BuiltinTypeKind::BuiltinInteger)
8383
.Case("IntLiteral", BuiltinTypeKind::BuiltinIntegerLiteral)
8484
.StartsWith("Int", BuiltinTypeKind::BuiltinInteger)
85+
.Case("ImplicitIsolationActor",
86+
BuiltinTypeKind::BuiltinImplicitIsolationActor)
8587
.Default({});
8688

8789
// Handle types that are not BuiltinTypeKinds.
@@ -174,6 +176,8 @@ Type swift::getBuiltinType(ASTContext &Context, StringRef Name) {
174176
return Context.TheIntegerLiteralType;
175177
case BuiltinTypeKind::BuiltinUnboundGeneric:
176178
return Type();
179+
case BuiltinTypeKind::BuiltinImplicitIsolationActor:
180+
return Context.TheImplicitIsolationActorType;
177181
}
178182

179183
return Type();
@@ -3504,6 +3508,7 @@ bool BuiltinType::isBitwiseCopyable() const {
35043508
return true;
35053509
case BuiltinTypeKind::BuiltinNativeObject:
35063510
case BuiltinTypeKind::BuiltinBridgeObject:
3511+
case BuiltinTypeKind::BuiltinImplicitIsolationActor:
35073512
case BuiltinTypeKind::BuiltinUnsafeValueBuffer:
35083513
case BuiltinTypeKind::BuiltinDefaultActorStorage:
35093514
case BuiltinTypeKind::BuiltinNonDefaultDistributedActorStorage:
@@ -3559,6 +3564,10 @@ StringRef BuiltinType::getTypeName(SmallVectorImpl<char> &result,
35593564
case BuiltinTypeKind::BuiltinBridgeObject:
35603565
printer << MAYBE_GET_NAMESPACED_BUILTIN(BUILTIN_TYPE_NAME_BRIDGEOBJECT);
35613566
break;
3567+
case BuiltinTypeKind::BuiltinImplicitIsolationActor:
3568+
printer << MAYBE_GET_NAMESPACED_BUILTIN(
3569+
BUILTIN_TYPE_NAME_IMPLICITISOLATIONACTOR);
3570+
break;
35623571
case BuiltinTypeKind::BuiltinUnsafeValueBuffer:
35633572
printer << MAYBE_GET_NAMESPACED_BUILTIN(
35643573
BUILTIN_TYPE_NAME_UNSAFEVALUEBUFFER);

lib/AST/ConformanceLookup.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,14 @@ getBuiltinBuiltinTypeConformance(Type type, const BuiltinType *builtinType,
480480
ProtocolDecl *protocol) {
481481
if (auto kp = protocol->getKnownProtocolKind()) {
482482
switch (*kp) {
483+
case KnownProtocolKind::Actor: {
484+
if (builtinType->getBuiltinTypeKind() !=
485+
BuiltinTypeKind::BuiltinImplicitIsolationActor)
486+
break;
487+
return ProtocolConformanceRef(type->getASTContext().getBuiltinConformance(
488+
type, protocol, BuiltinConformanceKind::Synthesized));
489+
}
490+
483491
case KnownProtocolKind::Sendable:
484492
case KnownProtocolKind::SendableMetatype:
485493
case KnownProtocolKind::Copyable:

lib/AST/Type.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ bool CanType::isReferenceTypeImpl(CanType type, const GenericSignatureImpl *sig,
194194
// These types are always class references.
195195
case TypeKind::BuiltinNativeObject:
196196
case TypeKind::BuiltinBridgeObject:
197+
case TypeKind::BuiltinImplicitIsolationActor:
197198
case TypeKind::Class:
198199
case TypeKind::BoundGenericClass:
199200
case TypeKind::SILBox:
@@ -514,6 +515,8 @@ bool TypeBase::isActorType() {
514515
}
515516

516517
bool TypeBase::isAnyActorType() {
518+
if (getCanonicalType() == getASTContext().TheImplicitIsolationActorType)
519+
return true;
517520
if (auto actor = getAnyActor())
518521
return actor->isAnyActor();
519522
return false;
@@ -4472,6 +4475,7 @@ ReferenceCounting TypeBase::getReferenceCounting() {
44724475
llvm_unreachable("sugared canonical type?");
44734476

44744477
case TypeKind::BuiltinNativeObject:
4478+
case TypeKind::BuiltinImplicitIsolationActor:
44754479
case TypeKind::SILBox:
44764480
return ReferenceCounting::Native;
44774481

0 commit comments

Comments
 (0)