@@ -58,6 +58,16 @@ enum class SILLinkage : uint8_t {
5858 // / PublicNonABI functions must be definitions.
5959 PublicNonABI,
6060
61+ // / Same as \c Public, except the definition is visible within a package
62+ // / of modules.
63+ Package,
64+
65+ // / Similar to \c PublicNonABI, this definition is used for symbols treated
66+ // / as package but do not have package entry points in the generated binary.
67+ // / It's used for default argument expressions and `@_alwaysEmitIntoClient`.
68+ // / When deserialized, this will become \c Shared linkage.
69+ PackageNonABI,
70+
6171 // / This object definition is visible only to the current Swift
6272 // / module (and thus should not be visible across linkage-unit
6373 // / boundaries). There are no other object definitions with this
@@ -91,6 +101,11 @@ enum class SILLinkage : uint8_t {
91101 // / definition.
92102 PublicExternal,
93103
104+ // / Similar to \c PublicExternal.
105+ // / Used to reference a \c Package definition in a different module
106+ // / within a package.
107+ PackageExternal,
108+
94109 // / A Public or Hidden definition with the same name as this object
95110 // / will be defined by the current Swift module at runtime.
96111 // /
@@ -166,20 +181,35 @@ enum class SubclassScope : uint8_t {
166181// / Strip external from public_external, hidden_external. Otherwise just return
167182// / the linkage.
168183inline SILLinkage stripExternalFromLinkage (SILLinkage linkage) {
169- if (linkage == SILLinkage::PublicExternal)
184+ switch (linkage) {
185+ case SILLinkage::PublicExternal:
170186 return SILLinkage::Public;
171- if (linkage == SILLinkage::HiddenExternal)
187+ case SILLinkage::PackageExternal:
188+ return SILLinkage::Package;
189+ case SILLinkage::HiddenExternal:
172190 return SILLinkage::Hidden;
173- return linkage;
191+ case SILLinkage::Public:
192+ case SILLinkage::PublicNonABI:
193+ case SILLinkage::Package:
194+ case SILLinkage::PackageNonABI:
195+ case SILLinkage::Hidden:
196+ case SILLinkage::Shared:
197+ case SILLinkage::Private:
198+ return linkage;
199+ }
200+ llvm_unreachable (" Unhandled SILLinkage in switch." );
174201}
175202
176203// / Add the 'external' attribute to \p linkage.
177204inline SILLinkage addExternalToLinkage (SILLinkage linkage) {
178205 switch (linkage) {
179206 case SILLinkage::Public:
180207 return SILLinkage::PublicExternal;
208+ case SILLinkage::Package:
209+ return SILLinkage::PackageExternal;
181210 case SILLinkage::PublicNonABI:
182- // An external reference to a public non-ABI function is only valid
211+ case SILLinkage::PackageNonABI:
212+ // An external reference to a public or package non-ABI function is only valid
183213 // if the function was emitted in another translation unit of the
184214 // same Swift module, so we treat it as hidden here.
185215 return SILLinkage::HiddenExternal;
@@ -188,6 +218,7 @@ inline SILLinkage addExternalToLinkage(SILLinkage linkage) {
188218 case SILLinkage::Shared:
189219 case SILLinkage::Private:
190220 case SILLinkage::PublicExternal:
221+ case SILLinkage::PackageExternal:
191222 case SILLinkage::HiddenExternal:
192223 return linkage;
193224 }
@@ -198,17 +229,43 @@ inline SILLinkage addExternalToLinkage(SILLinkage linkage) {
198229// / Return whether the linkage indicates that an object has a
199230// / definition outside the current SILModule.
200231inline bool isAvailableExternally (SILLinkage linkage) {
201- return linkage >= SILLinkage::PublicExternal;
232+ switch (linkage) {
233+ case SILLinkage::Public:
234+ case SILLinkage::PublicNonABI:
235+ case SILLinkage::Package:
236+ case SILLinkage::PackageNonABI:
237+ case SILLinkage::Hidden:
238+ case SILLinkage::Shared:
239+ case SILLinkage::Private:
240+ return false ;
241+ case SILLinkage::PublicExternal:
242+ case SILLinkage::PackageExternal:
243+ case SILLinkage::HiddenExternal:
244+ return true ;
245+ }
246+ llvm_unreachable (" Unhandled SILLinkage in switch." );
202247}
203248
204249// / Return whether the given linkage indicates that an object's
205250// / definition might be required outside the current SILModule.
206251// / If \p is true then we are in whole-module compilation.
207252inline bool isPossiblyUsedExternally (SILLinkage linkage, bool wholeModule) {
208- if (wholeModule) {
209- return linkage <= SILLinkage::PublicNonABI;
253+ switch (linkage) {
254+ case SILLinkage::Public:
255+ case SILLinkage::PublicNonABI:
256+ case SILLinkage::Package:
257+ case SILLinkage::PackageNonABI:
258+ return true ;
259+ case SILLinkage::Hidden:
260+ return !wholeModule;
261+ case SILLinkage::Shared:
262+ case SILLinkage::Private:
263+ case SILLinkage::PublicExternal:
264+ case SILLinkage::PackageExternal:
265+ case SILLinkage::HiddenExternal:
266+ return false ;
210267 }
211- return linkage <= SILLinkage::Hidden ;
268+ llvm_unreachable ( " Unhandled SILLinkage in switch. " ) ;
212269}
213270
214271SILLinkage getDeclSILLinkage (const ValueDecl *decl);
@@ -219,6 +276,9 @@ inline bool hasPublicVisibility(SILLinkage linkage) {
219276 case SILLinkage::PublicExternal:
220277 case SILLinkage::PublicNonABI:
221278 return true ;
279+ case SILLinkage::Package:
280+ case SILLinkage::PackageExternal:
281+ case SILLinkage::PackageNonABI:
222282 case SILLinkage::Hidden:
223283 case SILLinkage::Shared:
224284 case SILLinkage::Private:
@@ -236,6 +296,9 @@ inline bool hasSharedVisibility(SILLinkage linkage) {
236296 case SILLinkage::Public:
237297 case SILLinkage::PublicExternal:
238298 case SILLinkage::PublicNonABI:
299+ case SILLinkage::Package:
300+ case SILLinkage::PackageExternal:
301+ case SILLinkage::PackageNonABI:
239302 case SILLinkage::Hidden:
240303 case SILLinkage::HiddenExternal:
241304 case SILLinkage::Private:
@@ -252,6 +315,9 @@ inline bool hasPrivateVisibility(SILLinkage linkage) {
252315 case SILLinkage::Public:
253316 case SILLinkage::PublicExternal:
254317 case SILLinkage::PublicNonABI:
318+ case SILLinkage::Package:
319+ case SILLinkage::PackageExternal:
320+ case SILLinkage::PackageNonABI:
255321 case SILLinkage::Hidden:
256322 case SILLinkage::HiddenExternal:
257323 case SILLinkage::Shared:
@@ -265,12 +331,22 @@ inline SILLinkage effectiveLinkageForClassMember(SILLinkage linkage,
265331 SubclassScope scope) {
266332 switch (scope) {
267333 case SubclassScope::External:
268- if (linkage == SILLinkage::Private || linkage == SILLinkage::Hidden)
269- return SILLinkage::Public;
270- if (linkage == SILLinkage::HiddenExternal)
271- return SILLinkage::PublicExternal;
334+ switch (linkage) {
335+ case SILLinkage::Hidden:
336+ case SILLinkage::Private:
337+ return SILLinkage::Public;
338+ case SILLinkage::HiddenExternal:
339+ return SILLinkage::PublicExternal;
340+ case SILLinkage::Public:
341+ case SILLinkage::PublicNonABI:
342+ case SILLinkage::Package:
343+ case SILLinkage::PackageNonABI:
344+ case SILLinkage::PublicExternal:
345+ case SILLinkage::PackageExternal:
346+ case SILLinkage::Shared:
347+ break ;
348+ }
272349 break ;
273-
274350 case SubclassScope::Internal:
275351 if (linkage == SILLinkage::Private)
276352 return SILLinkage::Hidden;
0 commit comments