Skip to content

Commit 3b6c070

Browse files
committed
[IRGen] Added mechanism to refer to known AFPs.
1 parent 54a0e19 commit 3b6c070

File tree

4 files changed

+38
-1
lines changed

4 files changed

+38
-1
lines changed

include/swift/IRGen/Linking.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,11 @@ class LinkEntity {
456456
/// An async function pointer to a partial apply forwarder.
457457
/// The pointer is the llvm::Function* for a partial apply forwarder.
458458
PartialApplyForwarderAsyncFunctionPointer,
459+
460+
/// An async function pointer to a function which is known to exist whose
461+
/// name is known.
462+
/// The pointer is a const char* of the name.
463+
KnownAsyncFunctionPointer,
459464
};
460465
friend struct llvm::DenseMapInfo<LinkEntity>;
461466

@@ -1197,6 +1202,15 @@ class LinkEntity {
11971202
return entity;
11981203
}
11991204

1205+
static LinkEntity forKnownAsyncFunctionPointer(const char *name) {
1206+
LinkEntity entity;
1207+
entity.Pointer = const_cast<char *>(name);
1208+
entity.SecondaryPointer = nullptr;
1209+
entity.Data =
1210+
LINKENTITY_SET_FIELD(Kind, unsigned(Kind::KnownAsyncFunctionPointer));
1211+
return entity;
1212+
}
1213+
12001214
LinkEntity getUnderlyingEntityForAsyncFunctionPointer() const {
12011215
LinkEntity entity;
12021216
entity.Pointer = Pointer;

lib/IRGen/IRGenModule.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,12 @@ llvm::Constant *swift::getRuntimeFn(llvm::Module &Module,
898898
return cache;
899899
}
900900

901+
llvm::Constant *IRGenModule::getDeletedAsyncMethodErrorAsyncFunctionPointer() {
902+
return getAddrOfLLVMVariable(
903+
LinkEntity::forKnownAsyncFunctionPointer("swift_deletedAsyncMethodError"),
904+
ConstantInit(), DebugTypeInfo());
905+
}
906+
901907
#define QUOTE(...) __VA_ARGS__
902908
#define STR(X) #X
903909

lib/IRGen/IRGenModule.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1295,7 +1295,7 @@ class IRGenModule {
12951295
ClassDecl *getSwiftNativeNSObjectDecl();
12961296
llvm::Module *getModule() const;
12971297
llvm::AttributeList getAllocAttrs();
1298-
1298+
llvm::Constant *getDeletedAsyncMethodErrorAsyncFunctionPointer();
12991299
bool isStandardLibrary() const;
13001300

13011301
private:

lib/IRGen/Linking.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,11 @@ std::string LinkEntity::mangleAsString() const {
454454
Result.append("Tu");
455455
return Result;
456456
}
457+
case Kind::KnownAsyncFunctionPointer: {
458+
std::string Result(static_cast<char *>(Pointer));
459+
Result.append("Tu");
460+
return Result;
461+
}
457462

458463
case Kind::AsyncFunctionPointerAST: {
459464
std::string Result;
@@ -748,6 +753,8 @@ SILLinkage LinkEntity::getLinkage(ForDefinition_t forDefinition) const {
748753
case Kind::PartialApplyForwarderAsyncFunctionPointer:
749754
return getUnderlyingEntityForAsyncFunctionPointer()
750755
.getLinkage(ForDefinition);
756+
case Kind::KnownAsyncFunctionPointer:
757+
return SILLinkage::PublicExternal;
751758
case Kind::PartialApplyForwarder:
752759
return SILLinkage::Private;
753760
}
@@ -833,6 +840,7 @@ bool LinkEntity::isContextDescriptor() const {
833840
case Kind::NoncanonicalSpecializedGenericTypeMetadataCacheVariable:
834841
case Kind::CanonicalPrespecializedGenericTypeCachingOnceToken:
835842
case Kind::PartialApplyForwarder:
843+
case Kind::KnownAsyncFunctionPointer:
836844
return false;
837845
}
838846
llvm_unreachable("invalid descriptor");
@@ -949,6 +957,7 @@ llvm::Type *LinkEntity::getDefaultDeclarationType(IRGenModule &IGM) const {
949957
case Kind::DispatchThunkAllocatorAsyncFunctionPointer:
950958
case Kind::PartialApplyForwarderAsyncFunctionPointer:
951959
case Kind::AsyncFunctionPointerAST:
960+
case Kind::KnownAsyncFunctionPointer:
952961
return IGM.AsyncFunctionPointerTy;
953962
case Kind::PartialApplyForwarder:
954963
return IGM.FunctionPtrTy;
@@ -984,6 +993,7 @@ Alignment LinkEntity::getAlignment(IRGenModule &IGM) const {
984993
case Kind::DispatchThunkInitializerAsyncFunctionPointer:
985994
case Kind::DispatchThunkAllocatorAsyncFunctionPointer:
986995
case Kind::PartialApplyForwarderAsyncFunctionPointer:
996+
case Kind::KnownAsyncFunctionPointer:
987997
case Kind::ObjCClassRef:
988998
case Kind::ObjCClass:
989999
case Kind::TypeMetadataLazyCacheVariable:
@@ -1134,6 +1144,12 @@ bool LinkEntity::isWeakImported(ModuleDecl *module) const {
11341144
case Kind::PartialApplyForwarderAsyncFunctionPointer:
11351145
return getUnderlyingEntityForAsyncFunctionPointer()
11361146
.isWeakImported(module);
1147+
case Kind::KnownAsyncFunctionPointer:
1148+
auto &context = module->getASTContext();
1149+
auto deploymentAvailability =
1150+
AvailabilityContext::forDeploymentTarget(context);
1151+
return !deploymentAvailability.isContainedIn(
1152+
context.getConcurrencyAvailability());
11371153
}
11381154

11391155
llvm_unreachable("Bad link entity kind");
@@ -1241,6 +1257,7 @@ DeclContext *LinkEntity::getDeclContextForEmission() const {
12411257
case Kind::ValueWitnessTable:
12421258
case Kind::DifferentiabilityWitness:
12431259
case Kind::PartialApplyForwarder:
1260+
case Kind::KnownAsyncFunctionPointer:
12441261
return nullptr;
12451262

12461263
case Kind::AsyncFunctionPointer:

0 commit comments

Comments
 (0)