Support package SIL linkage.

Decls with a package access level are currently set to public SIL
linkages. This limits the ability to have more fine-grained control
and optimize around resilience and serialization.
This PR introduces a separate SIL linkage and FormalLinkage for
package decls, pipes them down to IRGen, and updates linkage checks
at call sites to include package linkage.

Resolves rdar://121409846
This commit is contained in:
Ellie Shin
2024-01-22 19:53:12 -08:00
parent 1707e76ba8
commit 72a7760027
42 changed files with 1135 additions and 648 deletions

View File

@@ -75,12 +75,19 @@ class SILModule::SerializationCallback final
// translation units in the same Swift module.
decl->setLinkage(SILLinkage::Shared);
return;
case SILLinkage::Package:
decl->setLinkage(SILLinkage::PackageExternal);
return;
case SILLinkage::PackageNonABI: // Same as PublicNonABI
decl->setLinkage(SILLinkage::Shared);
return;
case SILLinkage::Hidden:
decl->setLinkage(SILLinkage::HiddenExternal);
return;
case SILLinkage::Private:
llvm_unreachable("cannot make a private external symbol");
case SILLinkage::PublicExternal:
case SILLinkage::PackageExternal:
case SILLinkage::HiddenExternal:
case SILLinkage::Shared:
return;
@@ -979,6 +986,8 @@ SILLinkage swift::getDeclSILLinkage(const ValueDecl *decl) {
linkage = SILLinkage::Hidden;
break;
case AccessLevel::Package:
linkage = SILLinkage::Package;
break;
case AccessLevel::Public:
case AccessLevel::Open:
linkage = SILLinkage::Public;