Skip to content

Commit 7e03051

Browse files
Merge pull request #25573 from aschwaighofer/runtime_avail_rework
Rework getRuntimeFn runtime availability
2 parents 29bff80 + 27bfcd5 commit 7e03051

File tree

4 files changed

+47
-35
lines changed

4 files changed

+47
-35
lines changed

include/swift/Runtime/RuntimeFnWrappersGen.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ llvm::Constant *getRuntimeFn(llvm::Module &Module,
3838
char const *name,
3939
llvm::CallingConv::ID cc,
4040
RuntimeAvailability availability,
41-
ASTContext *context,
4241
llvm::ArrayRef<llvm::Type*> retTypes,
4342
llvm::ArrayRef<llvm::Type*> argTypes,
4443
llvm::ArrayRef<llvm::Attribute::AttrKind> attrs);

include/swift/Runtime/RuntimeFunctions.def

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,7 @@ FUNCTION(GetGenericMetadata, swift_getGenericMetadata,
638638
// const OpaqueTypeDescriptor *descriptor,
639639
// uintptr_t index);
640640
FUNCTION(GetOpaqueTypeMetadata, swift_getOpaqueTypeMetadata,
641-
SwiftCC, ConditionallyAvailable,
641+
SwiftCC, OpaqueTypeAvailability,
642642
RETURNS(TypeMetadataResponseTy),
643643
ARGS(SizeTy, Int8PtrTy, OpaqueTypeDescriptorPtrTy, SizeTy),
644644
ATTRS(NoUnwind, ReadOnly))
@@ -647,7 +647,7 @@ FUNCTION(GetOpaqueTypeMetadata, swift_getOpaqueTypeMetadata,
647647
// const OpaqueTypeDescriptor *descriptor,
648648
// uintptr_t index);
649649
FUNCTION(GetOpaqueTypeConformance, swift_getOpaqueTypeConformance,
650-
SwiftCC, ConditionallyAvailable,
650+
SwiftCC, OpaqueTypeAvailability,
651651
RETURNS(WitnessTablePtrTy),
652652
ARGS(Int8PtrTy, OpaqueTypeDescriptorPtrTy, SizeTy),
653653
ATTRS(NoUnwind, ReadOnly))
@@ -1226,13 +1226,13 @@ FUNCTION(EndAccess, swift_endAccess, C_CC, AlwaysAvailable,
12261226
ATTRS(NoUnwind))
12271227

12281228
FUNCTION(GetOrigOfReplaceable, swift_getOrigOfReplaceable, C_CC,
1229-
AvailableByCompatibilityLibrary,
1229+
DynamicReplacementAvailability,
12301230
RETURNS(FunctionPtrTy),
12311231
ARGS(FunctionPtrTy->getPointerTo()),
12321232
ATTRS(NoUnwind))
12331233

12341234
FUNCTION(GetReplacement, swift_getFunctionReplacement, C_CC,
1235-
AvailableByCompatibilityLibrary,
1235+
DynamicReplacementAvailability,
12361236
RETURNS(FunctionPtrTy),
12371237
ARGS(FunctionPtrTy->getPointerTo(), FunctionPtrTy),
12381238
ATTRS(NoUnwind))

lib/IRGen/IRGenModule.cpp

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -540,11 +540,33 @@ namespace RuntimeConstants {
540540
const auto ZExt = llvm::Attribute::ZExt;
541541
const auto FirstParamReturned = llvm::Attribute::Returned;
542542

543-
const auto AlwaysAvailable = RuntimeAvailability::AlwaysAvailable;
544-
const auto AvailableByCompatibilityLibrary =
545-
RuntimeAvailability::AvailableByCompatibilityLibrary;
546-
const auto ConditionallyAvailable =
547-
RuntimeAvailability::ConditionallyAvailable;
543+
RuntimeAvailability AlwaysAvailable(ASTContext &Context) {
544+
return RuntimeAvailability::AlwaysAvailable;
545+
}
546+
547+
bool
548+
isDeploymentAvailabilityContainedIn(ASTContext &Context,
549+
AvailabilityContext featureAvailability) {
550+
auto deploymentAvailability =
551+
AvailabilityContext::forDeploymentTarget(Context);
552+
return deploymentAvailability.isContainedIn(featureAvailability);
553+
}
554+
555+
RuntimeAvailability OpaqueTypeAvailability(ASTContext &Context) {
556+
auto featureAvailability = Context.getOpaqueTypeAvailability();
557+
if (!isDeploymentAvailabilityContainedIn(Context, featureAvailability)) {
558+
return RuntimeAvailability::ConditionallyAvailable;
559+
}
560+
return RuntimeAvailability::AlwaysAvailable;
561+
}
562+
563+
RuntimeAvailability DynamicReplacementAvailability(ASTContext &Context) {
564+
auto featureAvailability = Context.getSwift51Availability();
565+
if (!isDeploymentAvailabilityContainedIn(Context, featureAvailability)) {
566+
return RuntimeAvailability::AvailableByCompatibilityLibrary;
567+
}
568+
return RuntimeAvailability::AlwaysAvailable;
569+
}
548570
} // namespace RuntimeConstants
549571

550572
// We don't use enough attributes to justify generalizing the
@@ -589,7 +611,6 @@ llvm::Constant *swift::getRuntimeFn(llvm::Module &Module,
589611
const char *name,
590612
llvm::CallingConv::ID cc,
591613
RuntimeAvailability availability,
592-
ASTContext *context,
593614
llvm::ArrayRef<llvm::Type*> retTypes,
594615
llvm::ArrayRef<llvm::Type*> argTypes,
595616
ArrayRef<Attribute::AttrKind> attrs) {
@@ -600,24 +621,16 @@ llvm::Constant *swift::getRuntimeFn(llvm::Module &Module,
600621
bool isWeakLinked = false;
601622
std::string functionName(name);
602623

603-
auto isFeatureAvailable = [&]() -> bool {
604-
auto deploymentAvailability =
605-
AvailabilityContext::forDeploymentTarget(*context);
606-
auto featureAvailability = context->getSwift51Availability();
607-
return deploymentAvailability.isContainedIn(featureAvailability);
608-
};
609-
610624
switch (availability) {
611625
case RuntimeAvailability::AlwaysAvailable:
612626
// Nothing to do.
613627
break;
614628
case RuntimeAvailability::ConditionallyAvailable: {
615-
isWeakLinked = !isFeatureAvailable();
629+
isWeakLinked = true;
616630
break;
617631
}
618632
case RuntimeAvailability::AvailableByCompatibilityLibrary: {
619-
if (!isFeatureAvailable())
620-
functionName.append("50");
633+
functionName.append("50");
621634
break;
622635
}
623636
}
@@ -688,7 +701,7 @@ llvm::Constant *swift::getRuntimeFn(llvm::Module &Module,
688701
llvm::Constant *IRGenModule::get##ID##Fn() { \
689702
using namespace RuntimeConstants; \
690703
return getRuntimeFn(Module, ID##Fn, #NAME, CC, \
691-
AVAILABILITY, &this->Context, \
704+
AVAILABILITY(this->Context), \
692705
RETURNS, ARGS, ATTRS); \
693706
}
694707

lib/LLVMPasses/ARCEntryPointBuilder.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ class ARCEntryPointBuilder {
220220
Retain = getRuntimeFn(
221221
getModule(), cache,
222222
isNonAtomic(OrigI) ? "swift_nonatomic_retain" : "swift_retain",
223-
DefaultCC, RuntimeAvailability::AlwaysAvailable, nullptr, {ObjectPtrTy},
223+
DefaultCC, RuntimeAvailability::AlwaysAvailable, {ObjectPtrTy},
224224
{ObjectPtrTy}, {NoUnwind, FirstParamReturned});
225225

226226
return Retain.get();
@@ -238,7 +238,7 @@ class ARCEntryPointBuilder {
238238
isNonAtomic(OrigI) ? "swift_nonatomic_release"
239239
: "swift_release",
240240
DefaultCC, RuntimeAvailability::AlwaysAvailable,
241-
nullptr, {VoidTy}, {ObjectPtrTy}, {NoUnwind});
241+
{VoidTy}, {ObjectPtrTy}, {NoUnwind});
242242

243243
return Release.get();
244244
}
@@ -273,7 +273,7 @@ class ARCEntryPointBuilder {
273273
RetainN = getRuntimeFn(
274274
getModule(), cache,
275275
isNonAtomic(OrigI) ? "swift_nonatomic_retain_n" : "swift_retain_n",
276-
DefaultCC, RuntimeAvailability::AlwaysAvailable, nullptr, {ObjectPtrTy},
276+
DefaultCC, RuntimeAvailability::AlwaysAvailable, {ObjectPtrTy},
277277
{ObjectPtrTy, Int32Ty}, {NoUnwind, FirstParamReturned});
278278

279279
return RetainN.get();
@@ -288,11 +288,11 @@ class ARCEntryPointBuilder {
288288
auto *VoidTy = Type::getVoidTy(getModule().getContext());
289289

290290
llvm::Constant *cache = nullptr;
291-
ReleaseN = getRuntimeFn(
292-
getModule(), cache,
293-
isNonAtomic(OrigI) ? "swift_nonatomic_release_n" : "swift_release_n",
294-
DefaultCC, RuntimeAvailability::AlwaysAvailable, nullptr, {VoidTy},
295-
{ObjectPtrTy, Int32Ty}, {NoUnwind});
291+
ReleaseN = getRuntimeFn(getModule(), cache,
292+
isNonAtomic(OrigI) ? "swift_nonatomic_release_n"
293+
: "swift_release_n",
294+
DefaultCC, RuntimeAvailability::AlwaysAvailable,
295+
{VoidTy}, {ObjectPtrTy, Int32Ty}, {NoUnwind});
296296

297297
return ReleaseN.get();
298298
}
@@ -310,7 +310,7 @@ class ARCEntryPointBuilder {
310310
getModule(), cache,
311311
isNonAtomic(OrigI) ? "swift_nonatomic_unknownObjectRetain_n"
312312
: "swift_unknownObjectRetain_n",
313-
DefaultCC, RuntimeAvailability::AlwaysAvailable, nullptr, {ObjectPtrTy},
313+
DefaultCC, RuntimeAvailability::AlwaysAvailable, {ObjectPtrTy},
314314
{ObjectPtrTy, Int32Ty}, {NoUnwind, FirstParamReturned});
315315

316316
return UnknownObjectRetainN.get();
@@ -329,7 +329,7 @@ class ARCEntryPointBuilder {
329329
getModule(), cache,
330330
isNonAtomic(OrigI) ? "swift_nonatomic_unknownObjectRelease_n"
331331
: "swift_unknownObjectRelease_n",
332-
DefaultCC, RuntimeAvailability::AlwaysAvailable, nullptr, {VoidTy},
332+
DefaultCC, RuntimeAvailability::AlwaysAvailable, {VoidTy},
333333
{ObjectPtrTy, Int32Ty}, {NoUnwind});
334334

335335
return UnknownObjectReleaseN.get();
@@ -347,8 +347,8 @@ class ARCEntryPointBuilder {
347347
getModule(), cache,
348348
isNonAtomic(OrigI) ? "swift_nonatomic_bridgeObjectRetain_n"
349349
: "swift_bridgeObjectRetain_n",
350-
DefaultCC, RuntimeAvailability::AlwaysAvailable, nullptr,
351-
{BridgeObjectPtrTy}, {BridgeObjectPtrTy, Int32Ty}, {NoUnwind});
350+
DefaultCC, RuntimeAvailability::AlwaysAvailable, {BridgeObjectPtrTy},
351+
{BridgeObjectPtrTy, Int32Ty}, {NoUnwind});
352352
return BridgeRetainN.get();
353353
}
354354

@@ -366,7 +366,7 @@ class ARCEntryPointBuilder {
366366
getModule(), cache,
367367
isNonAtomic(OrigI) ? "swift_nonatomic_bridgeObjectRelease_n"
368368
: "swift_bridgeObjectRelease_n",
369-
DefaultCC, RuntimeAvailability::AlwaysAvailable, nullptr, {VoidTy},
369+
DefaultCC, RuntimeAvailability::AlwaysAvailable, {VoidTy},
370370
{BridgeObjectPtrTy, Int32Ty}, {NoUnwind});
371371
return BridgeReleaseN.get();
372372
}

0 commit comments

Comments
 (0)