diff --git a/include/swift/IRGen/TBDGen.h b/include/swift/IRGen/TBDGen.h index 29257354959b4..aee6626dd8fff 100644 --- a/include/swift/IRGen/TBDGen.h +++ b/include/swift/IRGen/TBDGen.h @@ -38,8 +38,8 @@ struct TBDGenOptions { /// Only collect linker directive symbols. bool LinkerDirectivesOnly = false; - /// Whether to include only symbols with public linkage. - bool PublicSymbolsOnly = true; + /// Whether to include only symbols with public or package linkage. + bool PublicOrPackageSymbolsOnly = true; /// Whether LLVM IR Virtual Function Elimination is enabled. bool VirtualFunctionElimination = false; @@ -75,7 +75,7 @@ struct TBDGenOptions { return lhs.HasMultipleIGMs == rhs.HasMultipleIGMs && lhs.IsInstallAPI == rhs.IsInstallAPI && lhs.LinkerDirectivesOnly == rhs.LinkerDirectivesOnly && - lhs.PublicSymbolsOnly == rhs.PublicSymbolsOnly && + lhs.PublicOrPackageSymbolsOnly == rhs.PublicOrPackageSymbolsOnly && lhs.VirtualFunctionElimination == rhs.VirtualFunctionElimination && lhs.WitnessMethodElimination == rhs.WitnessMethodElimination && lhs.InstallName == rhs.InstallName && @@ -94,7 +94,7 @@ struct TBDGenOptions { using namespace llvm; return hash_combine( opts.HasMultipleIGMs, opts.IsInstallAPI, opts.LinkerDirectivesOnly, - opts.PublicSymbolsOnly, opts.VirtualFunctionElimination, + opts.PublicOrPackageSymbolsOnly, opts.VirtualFunctionElimination, opts.WitnessMethodElimination, opts.InstallName, opts.ModuleLinkName, opts.CurrentVersion, opts.CompatibilityVersion, diff --git a/include/swift/SIL/FormalLinkage.h b/include/swift/SIL/FormalLinkage.h index 9bb2594e72ccd..622d36a6cec71 100644 --- a/include/swift/SIL/FormalLinkage.h +++ b/include/swift/SIL/FormalLinkage.h @@ -34,6 +34,10 @@ enum class FormalLinkage { /// have a unique file that is known to define it. PublicNonUnique, + /// This entity is visible in multiple Swift modules within a package + /// and has a unique file that is known to define it. + PackageUnique, + /// This entity is visible in only a single Swift module and has a /// unique file that is known to define it. HiddenUnique, diff --git a/include/swift/SIL/SILLinkage.h b/include/swift/SIL/SILLinkage.h index f4e926925f59d..c0c5e4ca110b2 100644 --- a/include/swift/SIL/SILLinkage.h +++ b/include/swift/SIL/SILLinkage.h @@ -58,6 +58,16 @@ enum class SILLinkage : uint8_t { /// PublicNonABI functions must be definitions. PublicNonABI, + /// Same as \c Public, except the definition is visible within a package + /// of modules. + Package, + + /// Similar to \c PublicNonABI, this definition is used for symbols treated + /// as package but do not have package entry points in the generated binary. + /// It's used for default argument expressions and `@_alwaysEmitIntoClient`. + /// When deserialized, this will become \c Shared linkage. + PackageNonABI, + /// This object definition is visible only to the current Swift /// module (and thus should not be visible across linkage-unit /// boundaries). There are no other object definitions with this @@ -91,6 +101,11 @@ enum class SILLinkage : uint8_t { /// definition. PublicExternal, + /// Similar to \c PublicExternal. + /// Used to reference a \c Package definition in a different module + /// within a package. + PackageExternal, + /// A Public or Hidden definition with the same name as this object /// will be defined by the current Swift module at runtime. /// @@ -166,11 +181,23 @@ enum class SubclassScope : uint8_t { /// Strip external from public_external, hidden_external. Otherwise just return /// the linkage. inline SILLinkage stripExternalFromLinkage(SILLinkage linkage) { - if (linkage == SILLinkage::PublicExternal) + switch (linkage) { + case SILLinkage::PublicExternal: return SILLinkage::Public; - if (linkage == SILLinkage::HiddenExternal) + case SILLinkage::PackageExternal: + return SILLinkage::Package; + case SILLinkage::HiddenExternal: return SILLinkage::Hidden; - return linkage; + case SILLinkage::Public: + case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageNonABI: + case SILLinkage::Hidden: + case SILLinkage::Shared: + case SILLinkage::Private: + return linkage; + } + llvm_unreachable("Unhandled SILLinkage in switch."); } /// Add the 'external' attribute to \p linkage. @@ -178,8 +205,11 @@ inline SILLinkage addExternalToLinkage(SILLinkage linkage) { switch (linkage) { case SILLinkage::Public: return SILLinkage::PublicExternal; + case SILLinkage::Package: + return SILLinkage::PackageExternal; case SILLinkage::PublicNonABI: - // An external reference to a public non-ABI function is only valid + case SILLinkage::PackageNonABI: + // An external reference to a public or package non-ABI function is only valid // if the function was emitted in another translation unit of the // same Swift module, so we treat it as hidden here. return SILLinkage::HiddenExternal; @@ -188,6 +218,7 @@ inline SILLinkage addExternalToLinkage(SILLinkage linkage) { case SILLinkage::Shared: case SILLinkage::Private: case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: case SILLinkage::HiddenExternal: return linkage; } @@ -198,17 +229,43 @@ inline SILLinkage addExternalToLinkage(SILLinkage linkage) { /// Return whether the linkage indicates that an object has a /// definition outside the current SILModule. inline bool isAvailableExternally(SILLinkage linkage) { - return linkage >= SILLinkage::PublicExternal; + switch (linkage) { + case SILLinkage::Public: + case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageNonABI: + case SILLinkage::Hidden: + case SILLinkage::Shared: + case SILLinkage::Private: + return false; + case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: + case SILLinkage::HiddenExternal: + return true; + } + llvm_unreachable("Unhandled SILLinkage in switch."); } /// Return whether the given linkage indicates that an object's /// definition might be required outside the current SILModule. /// If \p is true then we are in whole-module compilation. inline bool isPossiblyUsedExternally(SILLinkage linkage, bool wholeModule) { - if (wholeModule) { - return linkage <= SILLinkage::PublicNonABI; + switch (linkage) { + case SILLinkage::Public: + case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageNonABI: + return true; + case SILLinkage::Hidden: + return !wholeModule; + case SILLinkage::Shared: + case SILLinkage::Private: + case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: + case SILLinkage::HiddenExternal: + return false; } - return linkage <= SILLinkage::Hidden; + llvm_unreachable("Unhandled SILLinkage in switch."); } SILLinkage getDeclSILLinkage(const ValueDecl *decl); @@ -219,6 +276,9 @@ inline bool hasPublicVisibility(SILLinkage linkage) { case SILLinkage::PublicExternal: case SILLinkage::PublicNonABI: return true; + case SILLinkage::Package: + case SILLinkage::PackageExternal: + case SILLinkage::PackageNonABI: case SILLinkage::Hidden: case SILLinkage::Shared: case SILLinkage::Private: @@ -236,6 +296,9 @@ inline bool hasSharedVisibility(SILLinkage linkage) { case SILLinkage::Public: case SILLinkage::PublicExternal: case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageExternal: + case SILLinkage::PackageNonABI: case SILLinkage::Hidden: case SILLinkage::HiddenExternal: case SILLinkage::Private: @@ -252,6 +315,9 @@ inline bool hasPrivateVisibility(SILLinkage linkage) { case SILLinkage::Public: case SILLinkage::PublicExternal: case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageExternal: + case SILLinkage::PackageNonABI: case SILLinkage::Hidden: case SILLinkage::HiddenExternal: case SILLinkage::Shared: @@ -265,12 +331,22 @@ inline SILLinkage effectiveLinkageForClassMember(SILLinkage linkage, SubclassScope scope) { switch (scope) { case SubclassScope::External: - if (linkage == SILLinkage::Private || linkage == SILLinkage::Hidden) - return SILLinkage::Public; - if (linkage == SILLinkage::HiddenExternal) - return SILLinkage::PublicExternal; + switch (linkage) { + case SILLinkage::Hidden: + case SILLinkage::Private: + return SILLinkage::Public; + case SILLinkage::HiddenExternal: + return SILLinkage::PublicExternal; + case SILLinkage::Public: + case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageNonABI: + case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: + case SILLinkage::Shared: + break; + } break; - case SubclassScope::Internal: if (linkage == SILLinkage::Private) return SILLinkage::Hidden; diff --git a/include/swift/SIL/SILSymbolVisitor.h b/include/swift/SIL/SILSymbolVisitor.h index 0d0cd0de8251d..6491839d86227 100644 --- a/include/swift/SIL/SILSymbolVisitor.h +++ b/include/swift/SIL/SILSymbolVisitor.h @@ -31,8 +31,8 @@ struct SILSymbolVisitorOptions { /// are needed (e.g. decls with `@_originallyDefinedIn`. bool LinkerDirectivesOnly = false; - /// Whether to only visit symbols with public linkage. - bool PublicSymbolsOnly = true; + /// Whether to only visit symbols with public or package linkage. + bool PublicOrPackageSymbolsOnly = true; /// Whether LLVM IR Virtual Function Elimination is enabled. bool VirtualFunctionElimination = false; diff --git a/lib/IRGen/GenDecl.cpp b/lib/IRGen/GenDecl.cpp index bd21b779c10f0..80c0f31d85827 100644 --- a/lib/IRGen/GenDecl.cpp +++ b/lib/IRGen/GenDecl.cpp @@ -2330,11 +2330,13 @@ getIRLinkage(StringRef name, const UniversalLinkageInfo &info, switch (linkage) { case SILLinkage::Public: + case SILLinkage::Package: return {llvm::GlobalValue::ExternalLinkage, PublicDefinitionVisibility, info.Internalize ? llvm::GlobalValue::DefaultStorageClass : ExportedStorage}; case SILLinkage::PublicNonABI: + case SILLinkage::PackageNonABI: return isDefinition ? RESULT(WeakODR, Hidden, Default) : RESULT(External, Hidden, Default); @@ -2359,6 +2361,7 @@ getIRLinkage(StringRef name, const UniversalLinkageInfo &info, return {linkage, visibility, llvm::GlobalValue::DefaultStorageClass}; } + case SILLinkage::PackageExternal: case SILLinkage::PublicExternal: { if (isDefinition) return RESULT(AvailableExternally, Default, Default); diff --git a/lib/IRGen/GenInit.cpp b/lib/IRGen/GenInit.cpp index 7ab1a1fef7fe4..a1a4ecdffdede 100644 --- a/lib/IRGen/GenInit.cpp +++ b/lib/IRGen/GenInit.cpp @@ -44,9 +44,11 @@ void IRGenModule::emitSILGlobalVariable(SILGlobalVariable *var) { if (ti.isKnownEmpty(expansion)) { if (DebugInfo && var->getDecl()) { auto DbgTy = DebugTypeInfo::getGlobal(var, Int8Ty, *this); - DebugInfo->emitGlobalVariableDeclaration( - nullptr, var->getDecl()->getName().str(), "", DbgTy, - var->getLinkage() != SILLinkage::Public, SILLocation(var->getDecl())); + DebugInfo->emitGlobalVariableDeclaration(nullptr, var->getDecl()->getName().str(), + "", DbgTy, + var->getLinkage() != SILLinkage::Public && + var->getLinkage() != SILLinkage::Package, + SILLocation(var->getDecl())); } return; } diff --git a/lib/IRGen/GenMeta.cpp b/lib/IRGen/GenMeta.cpp index 598abf93ca57e..d35e43e58257f 100644 --- a/lib/IRGen/GenMeta.cpp +++ b/lib/IRGen/GenMeta.cpp @@ -2131,6 +2131,8 @@ namespace { .getLinkage(NotForDefinition)) { case SILLinkage::Public: case SILLinkage::PublicExternal: + case SILLinkage::Package: + case SILLinkage::PackageExternal: case SILLinkage::Hidden: case SILLinkage::HiddenExternal: case SILLinkage::Private: @@ -2138,6 +2140,7 @@ namespace { case SILLinkage::Shared: case SILLinkage::PublicNonABI: + case SILLinkage::PackageNonABI: return false; } llvm_unreachable("covered switch"); @@ -7017,7 +7020,7 @@ ExtendedExistentialTypeShapeInfo::get( .getCanonicalSignature(); auto linkage = getExistentialShapeLinkage(genSig, shapeType); - assert(linkage != FormalLinkage::PublicUnique); + assert(linkage != FormalLinkage::PublicUnique && linkage != FormalLinkage::PackageUnique); return { genSig, shapeType, SubstitutionMap(), linkage }; } diff --git a/lib/IRGen/GenProto.cpp b/lib/IRGen/GenProto.cpp index c2f444e67081c..cbf1246785a5a 100644 --- a/lib/IRGen/GenProto.cpp +++ b/lib/IRGen/GenProto.cpp @@ -2412,7 +2412,12 @@ static void addWTableTypeMetadata(IRGenModule &IGM, vis = VCallVisibility::VCallVisibilityLinkageUnit; break; case SILLinkage::Public: - default: + case SILLinkage::PublicExternal: + case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageExternal: + case SILLinkage::PackageNonABI: + case SILLinkage::HiddenExternal: if (IGM.getOptions().InternalizeAtLink) { vis = VCallVisibility::VCallVisibilityLinkageUnit; } diff --git a/lib/IRGen/IRGen.cpp b/lib/IRGen/IRGen.cpp index 75ac1445794a6..2bb51619c4a7a 100644 --- a/lib/IRGen/IRGen.cpp +++ b/lib/IRGen/IRGen.cpp @@ -1085,7 +1085,7 @@ getSymbolSourcesToEmit(const IRGenDescriptor &desc) { // making sure to include non-public symbols. auto &ctx = desc.getParentModule()->getASTContext(); auto tbdDesc = desc.getTBDGenDescriptor(); - tbdDesc.getOptions().PublicSymbolsOnly = false; + tbdDesc.getOptions().PublicOrPackageSymbolsOnly = false; const auto *symbolMap = llvm::cantFail(ctx.evaluator(SymbolSourceMapRequest{std::move(tbdDesc)})); diff --git a/lib/IRGen/IRGenSIL.cpp b/lib/IRGen/IRGenSIL.cpp index 67cf5986284a2..a6ed893c92fe8 100644 --- a/lib/IRGen/IRGenSIL.cpp +++ b/lib/IRGen/IRGenSIL.cpp @@ -2942,12 +2942,21 @@ FunctionPointer::Kind irgen::classifyFunctionPointerKind(SILFunction *fn) { // function's implementation and the function's context size in the async // function pointer data structure. static bool mayDirectlyCallAsync(SILFunction *fn) { - if (fn->getLinkage() == SILLinkage::Shared || - fn->getLinkage() == SILLinkage::PublicNonABI) { + switch (fn->getLinkage()) { + case SILLinkage::PublicNonABI: + case SILLinkage::PackageNonABI: + case SILLinkage::Shared: return false; + case SILLinkage::Public: + case SILLinkage::Package: + case SILLinkage::Hidden: + case SILLinkage::Private: + case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: + case SILLinkage::HiddenExternal: + return true; } - - return true; + llvm_unreachable("Invalid SIL linkage"); } void IRGenSILFunction::visitFunctionRefBaseInst(FunctionRefBaseInst *i) { diff --git a/lib/IRGen/IRSymbolVisitor.cpp b/lib/IRGen/IRSymbolVisitor.cpp index cb3ed3aa3e3fa..98b9b56856421 100644 --- a/lib/IRGen/IRSymbolVisitor.cpp +++ b/lib/IRGen/IRSymbolVisitor.cpp @@ -42,7 +42,7 @@ static bool shouldUseAllocatorMangling(const AbstractFunctionDecl *AFD) { class IRSymbolVisitorImpl : public SILSymbolVisitor { IRSymbolVisitor &Visitor; const IRSymbolVisitorContext &Ctx; - bool PublicSymbolsOnly; + bool PublicOrPackageSymbolsOnly; /// Emits the given `LinkEntity` to the downstream visitor as long as the /// entity has the required linkage. @@ -59,7 +59,7 @@ class IRSymbolVisitorImpl : public SILSymbolVisitor { llvm::GlobalValue::isExternalLinkage(linkage.getLinkage()) && linkage.getVisibility() != llvm::GlobalValue::HiddenVisibility; - if (PublicSymbolsOnly && !externallyVisible) + if (PublicOrPackageSymbolsOnly && !externallyVisible) return; } @@ -70,7 +70,7 @@ class IRSymbolVisitorImpl : public SILSymbolVisitor { IRSymbolVisitorImpl(IRSymbolVisitor &Visitor, const IRSymbolVisitorContext &Ctx) : Visitor{Visitor}, Ctx{Ctx}, - PublicSymbolsOnly{Ctx.getSILCtx().getOpts().PublicSymbolsOnly} {} + PublicOrPackageSymbolsOnly{Ctx.getSILCtx().getOpts().PublicOrPackageSymbolsOnly} {} bool willVisitDecl(Decl *D) override { return Visitor.willVisitDecl(D); diff --git a/lib/IRGen/Linking.cpp b/lib/IRGen/Linking.cpp index 2c83debbb760e..181b0130484b5 100644 --- a/lib/IRGen/Linking.cpp +++ b/lib/IRGen/Linking.cpp @@ -673,6 +673,8 @@ SILLinkage LinkEntity::getLinkage(ForDefinition_t forDefinition) const { switch (getTypeMetadataAccessStrategy(getType())) { case MetadataAccessStrategy::PublicUniqueAccessor: return getSILLinkage(FormalLinkage::PublicUnique, forDefinition); + case MetadataAccessStrategy::PackageUniqueAccessor: + return getSILLinkage(FormalLinkage::PackageUnique, forDefinition); case MetadataAccessStrategy::HiddenUniqueAccessor: return getSILLinkage(FormalLinkage::HiddenUnique, forDefinition); case MetadataAccessStrategy::PrivateAccessor: @@ -724,7 +726,8 @@ SILLinkage LinkEntity::getLinkage(ForDefinition_t forDefinition) const { assert(linkage != FormalLinkage::PublicNonUnique && "Cannot have a resilient class with non-unique linkage"); - if (linkage == FormalLinkage::PublicUnique) + if (linkage == FormalLinkage::PublicUnique || + linkage == FormalLinkage::PackageUnique) linkage = FormalLinkage::HiddenUnique; } diff --git a/lib/IRGen/MetadataRequest.cpp b/lib/IRGen/MetadataRequest.cpp index ae088c49d9508..68d2b1d6537d5 100644 --- a/lib/IRGen/MetadataRequest.cpp +++ b/lib/IRGen/MetadataRequest.cpp @@ -1138,6 +1138,8 @@ MetadataAccessStrategy irgen::getTypeMetadataAccessStrategy(CanType type) { switch (getDeclLinkage(nominal)) { case FormalLinkage::PublicUnique: return MetadataAccessStrategy::PublicUniqueAccessor; + case FormalLinkage::PackageUnique: + return MetadataAccessStrategy::PackageUniqueAccessor; case FormalLinkage::HiddenUnique: return MetadataAccessStrategy::HiddenUniqueAccessor; case FormalLinkage::Private: @@ -3387,6 +3389,7 @@ llvm::Function *irgen::getOrCreateTypeMetadataAccessFunction(IRGenModule &IGM, switch (getTypeMetadataAccessStrategy(type)) { case MetadataAccessStrategy::ForeignAccessor: case MetadataAccessStrategy::PublicUniqueAccessor: + case MetadataAccessStrategy::PackageUniqueAccessor: case MetadataAccessStrategy::HiddenUniqueAccessor: case MetadataAccessStrategy::PrivateAccessor: return getOtherwiseDefinedTypeMetadataAccessFunction(IGM, type); diff --git a/lib/IRGen/MetadataRequest.h b/lib/IRGen/MetadataRequest.h index f752e399c74ed..8efff46e7caac 100644 --- a/lib/IRGen/MetadataRequest.h +++ b/lib/IRGen/MetadataRequest.h @@ -471,6 +471,9 @@ enum class MetadataAccessStrategy { /// There is a unique public accessor function for the given type metadata. PublicUniqueAccessor, + /// There is a unique package accessor function for the given type metadata. + PackageUniqueAccessor, + /// There is a unique hidden accessor function for the given type metadata. HiddenUniqueAccessor, @@ -491,6 +494,7 @@ enum class MetadataAccessStrategy { static inline bool isAccessorLazilyGenerated(MetadataAccessStrategy strategy) { switch (strategy) { case MetadataAccessStrategy::PublicUniqueAccessor: + case MetadataAccessStrategy::PackageUniqueAccessor: case MetadataAccessStrategy::HiddenUniqueAccessor: case MetadataAccessStrategy::PrivateAccessor: return false; diff --git a/lib/IRGen/TBDGen.cpp b/lib/IRGen/TBDGen.cpp index 84522f3505afd..bedac4d2d79f1 100644 --- a/lib/IRGen/TBDGen.cpp +++ b/lib/IRGen/TBDGen.cpp @@ -502,7 +502,7 @@ void TBDGenVisitor::visit(const TBDGenDescriptor &desc) { SILSymbolVisitorOptions opts; opts.VisitMembers = true; opts.LinkerDirectivesOnly = Opts.LinkerDirectivesOnly; - opts.PublicSymbolsOnly = Opts.PublicSymbolsOnly; + opts.PublicOrPackageSymbolsOnly = Opts.PublicOrPackageSymbolsOnly; opts.WitnessMethodElimination = Opts.WitnessMethodElimination; opts.VirtualFunctionElimination = Opts.VirtualFunctionElimination; diff --git a/lib/Immediate/SwiftMaterializationUnit.cpp b/lib/Immediate/SwiftMaterializationUnit.cpp index 4cddfde090755..3cea93f5515bb 100644 --- a/lib/Immediate/SwiftMaterializationUnit.cpp +++ b/lib/Immediate/SwiftMaterializationUnit.cpp @@ -292,7 +292,7 @@ std::unique_ptr LazySwiftMaterializationUnit::Create(SwiftJIT &JIT, CompilerInstance &CI) { auto *M = CI.getMainModule(); TBDGenOptions Opts; - Opts.PublicSymbolsOnly = false; + Opts.PublicOrPackageSymbolsOnly = false; auto TBDDesc = TBDGenDescriptor::forModule(M, std::move(Opts)); SymbolSourceMapRequest SourceReq{TBDDesc}; const auto *Sources = diff --git a/lib/SIL/IR/SIL.cpp b/lib/SIL/IR/SIL.cpp index 6186d24c075e0..4aeda8aa4bf7b 100644 --- a/lib/SIL/IR/SIL.cpp +++ b/lib/SIL/IR/SIL.cpp @@ -41,6 +41,7 @@ FormalLinkage swift::getDeclLinkage(const ValueDecl *D) { switch (D->getEffectiveAccess()) { case AccessLevel::Package: + return FormalLinkage::PackageUnique; case AccessLevel::Public: case AccessLevel::Open: return FormalLinkage::PublicUnique; @@ -65,6 +66,9 @@ SILLinkage swift::getSILLinkage(FormalLinkage linkage, // uniqueness is buggy. return (forDefinition ? SILLinkage::Shared : SILLinkage::PublicExternal); + case FormalLinkage::PackageUnique: + return (forDefinition ? SILLinkage::Package : SILLinkage::PackageExternal); + case FormalLinkage::HiddenUnique: return (forDefinition ? SILLinkage::Hidden : SILLinkage::HiddenExternal); @@ -88,11 +92,12 @@ swift::getLinkageForProtocolConformance(const RootProtocolConformance *C, case AccessLevel::Private: case AccessLevel::FilePrivate: return SILLinkage::Private; - case AccessLevel::Internal: return (definition ? SILLinkage::Hidden : SILLinkage::HiddenExternal); - - default: + case AccessLevel::Package: + return (definition ? SILLinkage::Package : SILLinkage::PackageExternal); + case AccessLevel::Public: + case AccessLevel::Open: return (definition ? SILLinkage::Public : SILLinkage::PublicExternal); } } @@ -125,6 +130,7 @@ bool SILModule::isTypeMetadataAccessible(CanType type) { // Public declarations are accessible from everywhere. case FormalLinkage::PublicUnique: case FormalLinkage::PublicNonUnique: + case FormalLinkage::PackageUnique: return false; // Hidden declarations are inaccessible from different modules. @@ -174,6 +180,7 @@ FormalLinkage swift::getGenericSignatureLinkage(CanGenericSignature sig) { switch (getTypeLinkage(CanType(req.getSecondType()))) { case FormalLinkage::PublicUnique: case FormalLinkage::PublicNonUnique: + case FormalLinkage::PackageUnique: continue; case FormalLinkage::HiddenUnique: linkage = FormalLinkage::HiddenUnique; @@ -369,6 +376,8 @@ bool AbstractStorageDecl::exportsPropertyDescriptor() const { switch (getterLinkage) { case SILLinkage::Public: case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageNonABI: // We may need a descriptor. break; @@ -380,6 +389,7 @@ bool AbstractStorageDecl::exportsPropertyDescriptor() const { case SILLinkage::HiddenExternal: case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: llvm_unreachable("should be definition linkage?"); } diff --git a/lib/SIL/IR/SILDeclRef.cpp b/lib/SIL/IR/SILDeclRef.cpp index bc2f139a2b79d..5e3e5fd7fbccf 100644 --- a/lib/SIL/IR/SILDeclRef.cpp +++ b/lib/SIL/IR/SILDeclRef.cpp @@ -610,6 +610,18 @@ SILLinkage SILDeclRef::getDefinitionLinkage() const { return SILLinkage::Hidden; case AccessLevel::Package: + switch (limit) { + case Limit::None: + return SILLinkage::Package; + case Limit::AlwaysEmitIntoClient: + return SILLinkage::PackageNonABI; + case Limit::OnDemand: + return SILLinkage::Shared; + case Limit::NeverPublic: + return SILLinkage::Hidden; + case Limit::Private: + llvm_unreachable("Already handled"); + } case AccessLevel::Public: case AccessLevel::Open: switch (limit) { diff --git a/lib/SIL/IR/SILFunctionBuilder.cpp b/lib/SIL/IR/SILFunctionBuilder.cpp index 4c8f580cffa42..26d8918e1c618 100644 --- a/lib/SIL/IR/SILFunctionBuilder.cpp +++ b/lib/SIL/IR/SILFunctionBuilder.cpp @@ -309,8 +309,9 @@ SILFunction *SILFunctionBuilder::getOrCreateFunction( assert(mod.getStage() == SILStage::Raw || fn->getLinkage() == linkage || (forDefinition == ForDefinition_t::NotForDefinition && (fnLinkage == linkageForDef || - (linkageForDef == SILLinkage::PublicNonABI && - fnLinkage == SILLinkage::Shared)))); + (linkageForDef == SILLinkage::PublicNonABI || + linkageForDef == SILLinkage::PackageNonABI) && + fnLinkage == SILLinkage::Shared))); if (forDefinition) { // In all the cases where getConstantLinkage returns something // different for ForDefinition, it returns an available-externally diff --git a/lib/SIL/IR/SILModule.cpp b/lib/SIL/IR/SILModule.cpp index 2a1f060d9bb26..c82dbf62ea76f 100644 --- a/lib/SIL/IR/SILModule.cpp +++ b/lib/SIL/IR/SILModule.cpp @@ -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; diff --git a/lib/SIL/IR/SILPrinter.cpp b/lib/SIL/IR/SILPrinter.cpp index 72ab834968402..cf93d82ac0002 100644 --- a/lib/SIL/IR/SILPrinter.cpp +++ b/lib/SIL/IR/SILPrinter.cpp @@ -3220,10 +3220,13 @@ static StringRef getLinkageString(SILLinkage linkage) { switch (linkage) { case SILLinkage::Public: return "public "; case SILLinkage::PublicNonABI: return "non_abi "; + case SILLinkage::Package: return "package "; + case SILLinkage::PackageNonABI: return "package_non_abi "; case SILLinkage::Hidden: return "hidden "; case SILLinkage::Shared: return "shared "; case SILLinkage::Private: return "private "; case SILLinkage::PublicExternal: return "public_external "; + case SILLinkage::PackageExternal: return "package_external "; case SILLinkage::HiddenExternal: return "hidden_external "; } llvm_unreachable("bad linkage"); diff --git a/lib/SIL/IR/SILProfiler.cpp b/lib/SIL/IR/SILProfiler.cpp index 7aafcec19c495..f929c82028353 100644 --- a/lib/SIL/IR/SILProfiler.cpp +++ b/lib/SIL/IR/SILProfiler.cpp @@ -1590,6 +1590,7 @@ getEquivalentPGOLinkage(FormalLinkage Linkage) { switch (Linkage) { case FormalLinkage::PublicUnique: case FormalLinkage::PublicNonUnique: + case FormalLinkage::PackageUnique: return llvm::GlobalValue::ExternalLinkage; case FormalLinkage::HiddenUnique: diff --git a/lib/SIL/IR/SILSymbolVisitor.cpp b/lib/SIL/IR/SILSymbolVisitor.cpp index d59457bb2ddc8..9df8a58c50296 100644 --- a/lib/SIL/IR/SILSymbolVisitor.cpp +++ b/lib/SIL/IR/SILSymbolVisitor.cpp @@ -103,17 +103,29 @@ class SILSymbolVisitorImpl : public ASTVisitor { if (!ignoreLinkage) { auto linkage = effectiveLinkageForClassMember( declRef.getLinkage(ForDefinition), declRef.getSubclassScope()); - if (Ctx.getOpts().PublicSymbolsOnly && linkage != SILLinkage::Public) + if (shouldSkipVisit(linkage)) return; } Visitor.addFunction(declRef); } + bool shouldSkipVisit(SILLinkage linkage) { + return Ctx.getOpts().PublicOrPackageSymbolsOnly && + !(linkage == SILLinkage::Public || linkage == SILLinkage::Package); + } + bool shouldSkipVisit(SILDeclRef declRef) { + return Ctx.getOpts().PublicOrPackageSymbolsOnly && !declRef.isSerialized(); + } + bool shouldSkipVisit(FormalLinkage formalLinkage) { + return Ctx.getOpts().PublicOrPackageSymbolsOnly && + !(formalLinkage == FormalLinkage::PublicUnique || formalLinkage == FormalLinkage::PackageUnique); + } + void addAsyncFunctionPointer(SILDeclRef declRef) { auto silLinkage = effectiveLinkageForClassMember( declRef.getLinkage(ForDefinition), declRef.getSubclassScope()); - if (Ctx.getOpts().PublicSymbolsOnly && silLinkage != SILLinkage::Public) + if (shouldSkipVisit(silLinkage)) return; Visitor.addAsyncFunctionPointer(declRef); @@ -128,7 +140,7 @@ class SILSymbolVisitorImpl : public ASTVisitor { // Linear maps are public only when the original function is serialized. So // if we're only including public symbols and it's not serialized, bail. - if (Ctx.getOpts().PublicSymbolsOnly && !declRef.isSerialized()) + if (shouldSkipVisit(declRef)) return; // Differential functions are emitted only when forward-mode is enabled. @@ -181,8 +193,7 @@ class SILSymbolVisitorImpl : public ASTVisitor { auto originalLinkage = declRef.getLinkage(ForDefinition); if (foreign) originalLinkage = stripExternalFromLinkage(originalLinkage); - if (Ctx.getOpts().PublicSymbolsOnly && - originalLinkage != SILLinkage::Public) + if (shouldSkipVisit(originalLinkage)) return; auto *silParamIndices = autodiff::getLoweredParameterIndices( @@ -272,7 +283,7 @@ class SILSymbolVisitorImpl : public ASTVisitor { auto addSymbolIfNecessary = [&](ValueDecl *requirementDecl, ValueDecl *witnessDecl) { auto witnessRef = SILDeclRef(witnessDecl); - if (Ctx.getOpts().PublicSymbolsOnly) { + if (Ctx.getOpts().PublicOrPackageSymbolsOnly) { if (!conformanceIsFixed) return; @@ -370,7 +381,7 @@ class SILSymbolVisitorImpl : public ASTVisitor { /// Returns `true` if the neither the nominal nor its members have any symbols /// that need to be visited because it has non-public linkage. bool canSkipNominal(const NominalTypeDecl *NTD) { - if (!Ctx.getOpts().PublicSymbolsOnly) + if (!Ctx.getOpts().PublicOrPackageSymbolsOnly) return false; // Don't skip nominals from clang modules; they have PublicNonUnique @@ -378,7 +389,8 @@ class SILSymbolVisitorImpl : public ASTVisitor { if (isa(NTD->getDeclContext()->getModuleScopeContext())) return false; - return getDeclLinkage(NTD) != FormalLinkage::PublicUnique; + return !(getDeclLinkage(NTD) == FormalLinkage::PublicUnique || + getDeclLinkage(NTD) == FormalLinkage::PackageUnique); } public: @@ -426,8 +438,8 @@ class SILSymbolVisitorImpl : public ASTVisitor { // generated and its linkage emitted. auto shouldGenerateDefaultArgs = moduleDecl->isTestingEnabled() || moduleDecl->arePrivateImportsEnabled() || - VD->getFormalAccess() == AccessLevel::Package; - if (Ctx.getOpts().PublicSymbolsOnly && !shouldGenerateDefaultArgs) + VD->getFormalAccess() >= AccessLevel::Package; + if (Ctx.getOpts().PublicOrPackageSymbolsOnly && !shouldGenerateDefaultArgs) return; // In Swift 3 (or under -enable-testing), default arguments (of public @@ -572,8 +584,7 @@ class SILSymbolVisitorImpl : public ASTVisitor { // Statically/globally stored variables have some special handling. if (VD->hasStorage() && isGlobalOrStaticVar(VD)) { - if (!Ctx.getOpts().PublicSymbolsOnly || - getDeclLinkage(VD) == FormalLinkage::PublicUnique) { + if (!shouldSkipVisit(getDeclLinkage(VD))) { Visitor.addGlobalVar(VD); } diff --git a/lib/SIL/Parser/ParseSIL.cpp b/lib/SIL/Parser/ParseSIL.cpp index a2f6562fe17d7..084149651b597 100644 --- a/lib/SIL/Parser/ParseSIL.cpp +++ b/lib/SIL/Parser/ParseSIL.cpp @@ -469,9 +469,12 @@ static bool parseSILLinkage(llvm::Optional &Result, Parser &P) { // Then use a string switch to try and parse the identifier. Result = llvm::StringSwitch>(P.Tok.getText()) .Case("non_abi", SILLinkage::PublicNonABI) + .Case("package_non_abi", SILLinkage::PackageNonABI) + .Case("package", SILLinkage::Package) .Case("hidden", SILLinkage::Hidden) .Case("shared", SILLinkage::Shared) .Case("public_external", SILLinkage::PublicExternal) + .Case("package_external", SILLinkage::PackageExternal) .Case("hidden_external", SILLinkage::HiddenExternal) .Default(llvm::None); diff --git a/lib/SIL/Verifier/SILVerifier.cpp b/lib/SIL/Verifier/SILVerifier.cpp index 93ea0c1e8a482..1c5fee49a23d5 100644 --- a/lib/SIL/Verifier/SILVerifier.cpp +++ b/lib/SIL/Verifier/SILVerifier.cpp @@ -6802,11 +6802,13 @@ class SILVerifier : public SILVerifierBase { switch (F->getLinkage()) { case SILLinkage::Public: + case SILLinkage::Package: case SILLinkage::Shared: require(F->isDefinition() || F->hasForeignBody(), - "public/shared function must have a body"); + "public/package/shared function must have a body"); break; case SILLinkage::PublicNonABI: + case SILLinkage::PackageNonABI: require(F->isDefinition(), "alwaysEmitIntoClient function must have a body"); require(F->isSerialized() || mod.isSerialized(), @@ -6824,6 +6826,11 @@ class SILVerifier : public SILVerifierBase { mod.isSerialized(), "public-external function definition must be serialized"); break; + case SILLinkage::PackageExternal: + require(F->isExternalDeclaration() || F->isSerialized() || + mod.isSerialized(), + "package-external function definition must be serialized"); + break; case SILLinkage::HiddenExternal: require(F->isExternalDeclaration(), "hidden-external function cannot have a body"); diff --git a/lib/SILGen/SILGen.cpp b/lib/SILGen/SILGen.cpp index 5626288ac40e7..7306170c33237 100644 --- a/lib/SILGen/SILGen.cpp +++ b/lib/SILGen/SILGen.cpp @@ -596,7 +596,8 @@ SILGenModule::getKeyPathProjectionCoroutine(bool isReadAccess, SILGenFunctionBuilder builder(*this); fn = builder.createFunction( - SILLinkage::PublicExternal, functionName, functionTy, env, + SILLinkage::PublicExternal, + functionName, functionTy, env, /*location*/ llvm::None, IsNotBare, IsNotTransparent, IsNotSerialized, IsNotDynamic, IsNotDistributed, IsNotRuntimeAccessible); @@ -1898,7 +1899,7 @@ static bool canStorageUseTrivialDescriptor(SILGenModule &SGM, if (!setter) return true; - if (setter->getFormalAccessScope(nullptr, true).isPublic()) + if (setter->getFormalAccessScope(nullptr, true).isPublicOrPackage()) return true; return false; diff --git a/lib/SILGen/SILGenExpr.cpp b/lib/SILGen/SILGenExpr.cpp index 5b3e80fa852d4..76fd84e63f40d 100644 --- a/lib/SILGen/SILGenExpr.cpp +++ b/lib/SILGen/SILGenExpr.cpp @@ -4010,8 +4010,21 @@ SILGenModule::emitKeyPathComponentForDecl(SILLocation loc, getRepresentativeAccessorForKeyPath(baseDecl), expansion); if (representative.isForeign) return false; - if (representative.getLinkage(ForDefinition) > SILLinkage::PublicNonABI) + + switch (representative.getLinkage(ForDefinition)) { + case SILLinkage::Public: + case SILLinkage::PublicNonABI: + case SILLinkage::Package: + case SILLinkage::PackageNonABI: + break; + case SILLinkage::Hidden: + case SILLinkage::Shared: + case SILLinkage::Private: + case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: + case SILLinkage::HiddenExternal: return false; + } } return true; diff --git a/lib/SILOptimizer/IPO/CrossModuleOptimization.cpp b/lib/SILOptimizer/IPO/CrossModuleOptimization.cpp index 7382a8c2b6f52..40fc61f6fe934 100644 --- a/lib/SILOptimizer/IPO/CrossModuleOptimization.cpp +++ b/lib/SILOptimizer/IPO/CrossModuleOptimization.cpp @@ -433,6 +433,7 @@ bool CrossModuleOptimization::canUseFromInline(SILFunction *function) { switch (function->getLinkage()) { case SILLinkage::PublicNonABI: + case SILLinkage::PackageNonABI: case SILLinkage::HiddenExternal: return false; case SILLinkage::Shared: @@ -441,9 +442,11 @@ bool CrossModuleOptimization::canUseFromInline(SILFunction *function) { return true; return false; case SILLinkage::Public: + case SILLinkage::Package: case SILLinkage::Hidden: case SILLinkage::Private: case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: break; } return true; diff --git a/lib/SILOptimizer/IPO/DeadFunctionElimination.cpp b/lib/SILOptimizer/IPO/DeadFunctionElimination.cpp index 06d8a7f72932c..7d86a07106b6c 100644 --- a/lib/SILOptimizer/IPO/DeadFunctionElimination.cpp +++ b/lib/SILOptimizer/IPO/DeadFunctionElimination.cpp @@ -409,6 +409,8 @@ class DeadFunctionAndGlobalElimination { linkage = SILLinkage::Hidden; break; case AccessLevel::Package: + linkage = SILLinkage::Package; + break; case AccessLevel::Public: case AccessLevel::Open: linkage = SILLinkage::Public; diff --git a/lib/SILOptimizer/UtilityPasses/InstCount.cpp b/lib/SILOptimizer/UtilityPasses/InstCount.cpp index d13b770879030..2bc13a1046e89 100644 --- a/lib/SILOptimizer/UtilityPasses/InstCount.cpp +++ b/lib/SILOptimizer/UtilityPasses/InstCount.cpp @@ -45,10 +45,13 @@ STATISTIC(TotalExternalFuncDecls, "Number of external funcs declarations"); // Linkage statistics STATISTIC(TotalPublicFuncs, "Number of public funcs"); STATISTIC(TotalPublicNonABIFuncs, "Number of public non-ABI funcs"); +STATISTIC(TotalPackageFuncs, "Number of package funcs"); +STATISTIC(TotalPackageNonABIFuncs, "Number of package non-ABI funcs"); STATISTIC(TotalHiddenFuncs, "Number of hidden funcs"); STATISTIC(TotalPrivateFuncs, "Number of private funcs"); STATISTIC(TotalSharedFuncs, "Number of shared funcs"); STATISTIC(TotalPublicExternalFuncs, "Number of public external funcs"); +STATISTIC(TotalPackageExternalFuncs, "Number of package external funcs"); STATISTIC(TotalHiddenExternalFuncs, "Number of hidden external funcs"); // Individual instruction statistics @@ -119,6 +122,12 @@ class InstCount : public SILFunctionTransform { case SILLinkage::PublicNonABI: ++TotalPublicNonABIFuncs; break; + case SILLinkage::Package: + ++TotalPackageFuncs; + break; + case SILLinkage::PackageNonABI: + ++TotalPackageNonABIFuncs; + break; case SILLinkage::Hidden: ++TotalHiddenFuncs; break; @@ -131,6 +140,9 @@ class InstCount : public SILFunctionTransform { case SILLinkage::PublicExternal: ++TotalPublicExternalFuncs; break; + case SILLinkage::PackageExternal: + ++TotalPackageExternalFuncs; + break; case SILLinkage::HiddenExternal: ++TotalHiddenExternalFuncs; break; diff --git a/lib/SILOptimizer/UtilityPasses/SerializeSILPass.cpp b/lib/SILOptimizer/UtilityPasses/SerializeSILPass.cpp index 4b2f1b631c94c..b294cf8706c98 100644 --- a/lib/SILOptimizer/UtilityPasses/SerializeSILPass.cpp +++ b/lib/SILOptimizer/UtilityPasses/SerializeSILPass.cpp @@ -471,8 +471,23 @@ class SerializeSILPass : public SILModuleTransform { // After serialization we don't need to keep @alwaysEmitIntoClient // functions alive, i.e. we don't need to treat them as public functions. - if (F.getLinkage() == SILLinkage::PublicNonABI && M.isWholeModule()) - F.setLinkage(SILLinkage::Shared); + if (M.isWholeModule()) { + switch (F.getLinkage()) { + case SILLinkage::PublicNonABI: + case SILLinkage::PackageNonABI: + F.setLinkage(SILLinkage::Shared); + break; + case SILLinkage::Public: + case SILLinkage::Package: + case SILLinkage::Hidden: + case SILLinkage::Shared: + case SILLinkage::Private: + case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: + case SILLinkage::HiddenExternal: + break; + } + } } for (auto &WT : M.getWitnessTables()) { diff --git a/lib/Serialization/DeserializeSIL.cpp b/lib/Serialization/DeserializeSIL.cpp index b1fadd4f1b82d..47fd1103ac083 100644 --- a/lib/Serialization/DeserializeSIL.cpp +++ b/lib/Serialization/DeserializeSIL.cpp @@ -70,14 +70,16 @@ static llvm::Optional fromStableSILLinkage(unsigned value) { switch (value) { case SIL_LINKAGE_PUBLIC: return SILLinkage::Public; case SIL_LINKAGE_PUBLIC_NON_ABI: return SILLinkage::PublicNonABI; + case SIL_LINKAGE_PACKAGE: return SILLinkage::Package; + case SIL_LINKAGE_PACKAGE_NON_ABI: return SILLinkage::PackageNonABI; case SIL_LINKAGE_HIDDEN: return SILLinkage::Hidden; case SIL_LINKAGE_SHARED: return SILLinkage::Shared; case SIL_LINKAGE_PRIVATE: return SILLinkage::Private; case SIL_LINKAGE_PUBLIC_EXTERNAL: return SILLinkage::PublicExternal; case SIL_LINKAGE_HIDDEN_EXTERNAL: return SILLinkage::HiddenExternal; - default: - return llvm::None; } + + llvm_unreachable("Invalid SIL linkage"); } static llvm::Optional @@ -646,13 +648,26 @@ SILDeserializer::readSILFunctionChecked(DeclID FID, SILFunction *existingFn, // referenced as a declaration, and Shared when it has // a deserialized body. if (isAvailableExternally(fn->getLinkage())) { - if (linkage == SILLinkage::PublicNonABI || linkage == SILLinkage::Shared) { + switch (linkage) { + case SILLinkage::PublicNonABI: + case SILLinkage::PackageNonABI: + case SILLinkage::Shared: fn->setLinkage(SILLinkage::Shared); - } else if (hasPublicVisibility(linkage)) { - // Cross-module-optimization can change the linkage to public. In this - // case we need to update the linkage of the function (which is - // originally just derived from the AST). - fn->setLinkage(SILLinkage::PublicExternal); + break; + case SILLinkage::Public: + case SILLinkage::Package: + case SILLinkage::Hidden: + case SILLinkage::Private: + case SILLinkage::PublicExternal: + case SILLinkage::PackageExternal: + case SILLinkage::HiddenExternal: + if (hasPublicVisibility(linkage)) { + // Cross-module-optimization can change the linkage to public. In this + // case we need to update the linkage of the function (which is + // originally just derived from the AST). + fn->setLinkage(SILLinkage::PublicExternal); + } + break; } } diff --git a/lib/Serialization/ModuleFormat.h b/lib/Serialization/ModuleFormat.h index 4c3a78f91fcec..6e79c86526d0c 100644 --- a/lib/Serialization/ModuleFormat.h +++ b/lib/Serialization/ModuleFormat.h @@ -58,7 +58,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0; /// describe what change you made. The content of this comment isn't important; /// it just ensures a conflict if two people change the module format. /// Don't worry about adhering to the 80-column limit for this line. -const uint16_t SWIFTMODULE_VERSION_MINOR = 847; // add LifetimeDependence +const uint16_t SWIFTMODULE_VERSION_MINOR = 848; // inroduced a package SIL linkage /// A standard hash seed used for all string hashes in a serialized module. /// diff --git a/lib/Serialization/SILFormat.h b/lib/Serialization/SILFormat.h index bab8535aa26e7..c2fea45db31cd 100644 --- a/lib/Serialization/SILFormat.h +++ b/lib/Serialization/SILFormat.h @@ -40,10 +40,13 @@ enum SILStringEncoding : uint8_t { enum SILLinkageEncoding : uint8_t { SIL_LINKAGE_PUBLIC, SIL_LINKAGE_PUBLIC_NON_ABI, + SIL_LINKAGE_PACKAGE, + SIL_LINKAGE_PACKAGE_NON_ABI, SIL_LINKAGE_HIDDEN, SIL_LINKAGE_SHARED, SIL_LINKAGE_PRIVATE, SIL_LINKAGE_PUBLIC_EXTERNAL, + SIL_LINKAGE_PACKAGE_EXTERNAL, SIL_LINKAGE_HIDDEN_EXTERNAL, }; using SILLinkageField = BCFixed<4>; diff --git a/lib/Serialization/SerializeSIL.cpp b/lib/Serialization/SerializeSIL.cpp index fbd652eb68045..d4a1e3402be05 100644 --- a/lib/Serialization/SerializeSIL.cpp +++ b/lib/Serialization/SerializeSIL.cpp @@ -62,10 +62,13 @@ static unsigned toStableSILLinkage(SILLinkage linkage) { switch (linkage) { case SILLinkage::Public: return SIL_LINKAGE_PUBLIC; case SILLinkage::PublicNonABI: return SIL_LINKAGE_PUBLIC_NON_ABI; + case SILLinkage::Package: return SIL_LINKAGE_PACKAGE; + case SILLinkage::PackageNonABI: return SIL_LINKAGE_PACKAGE_NON_ABI; case SILLinkage::Hidden: return SIL_LINKAGE_HIDDEN; case SILLinkage::Shared: return SIL_LINKAGE_SHARED; case SILLinkage::Private: return SIL_LINKAGE_PRIVATE; case SILLinkage::PublicExternal: return SIL_LINKAGE_PUBLIC_EXTERNAL; + case SILLinkage::PackageExternal: return SIL_LINKAGE_PACKAGE_EXTERNAL; case SILLinkage::HiddenExternal: return SIL_LINKAGE_HIDDEN_EXTERNAL; } llvm_unreachable("bad linkage"); diff --git a/test/IRGen/objc_class_allocator.swift b/test/IRGen/objc_class_allocator.swift new file mode 100644 index 0000000000000..ae23f70fca769 --- /dev/null +++ b/test/IRGen/objc_class_allocator.swift @@ -0,0 +1,15 @@ +// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -emit-ir %s -validate-tbd-against-ir=all | %FileCheck %s + +// REQUIRES: objc_interop + +import Foundation + +public class Foo { + // CHECK-LABEL: define linkonce_odr hidden swiftcc ptr @"$sSo8NSNumberC5valueABSi_tcfC" + // CHECK-LABEL: define linkonce_odr hidden swiftcc ptr @"$sSo8NSNumberC5valueABSi_tcfcTO" + public var bar: NSNumber = NSNumber(value: 1) +} + + + + diff --git a/test/IRGen/package_resilient_as_public_by_default.swift b/test/IRGen/package_resilient_as_public_by_default.swift index 4da9d21a99f19..dedf6470da569 100644 --- a/test/IRGen/package_resilient_as_public_by_default.swift +++ b/test/IRGen/package_resilient_as_public_by_default.swift @@ -1,9 +1,7 @@ -// -// Unlike its counterparts in the other *_resilience.swift files, the goal is -// for the package's component modules to all be considered within the same -// resilience domain. This file ensures that we use direct access as much as -// possible. -// +// This verifies package decls are treated as resilient as (non-frozen) public +// decls by default. When non-resilience optimization is enabled, references +// to package decls at a use site can be treated as non-resilient, which is +// verified in test/IRGen/package_resilience.swift. // RUN: %empty-directory(%t) // RUN: %{python} %utils/chex.py < %s > %t/package_resilience.swift @@ -11,10 +9,10 @@ // RUN: %target-swift-frontend -package-name MyPkg -emit-module -enable-library-evolution -emit-module-path=%t/resilient_enum.swiftmodule -module-name=resilient_enum -I %t %S/Inputs/package_types/resilient_enum.swift // RUN: %target-swift-frontend -package-name MyPkg -emit-module -enable-library-evolution -emit-module-path=%t/resilient_class.swiftmodule -module-name=resilient_class -I %t %S/Inputs/package_types/resilient_class.swift -// RUN: %target-swift-frontend -package-name MyPkg -I %t -emit-ir -enable-library-evolution %t/package_resilience.swift > %t/ir-result -// RUN: %FileCheck %t/package_resilience.swift --check-prefixes=CHECK -DINT=i%target-ptrsize -D#MDWORDS=7 -D#MDSIZE32=52 -D#MDSIZE64=80 -D#WORDSIZE=%target-alignment < %t/ir-result +// RUN: %target-swift-frontend -module-name package_resilience -package-name MyPkg -I %t -emit-ir -o %t/ir-result.ll -enable-library-evolution %t/package_resilience.swift +// RUN: %FileCheck %t/package_resilience.swift --check-prefixes=CHECK -DINT=i%target-ptrsize -D#MDWORDS=7 -D#MDSIZE32=52 -D#MDSIZE64=80 -D#WORDSIZE=%target-alignment < %t/ir-result.ll -// RUN: %target-swift-frontend -package-name MyPkg -I %t -emit-ir -enable-library-evolution -O %t/package_resilience.swift -package-name MyPkg +// RUN: %target-swift-frontend -module-name package_resilience -package-name MyPkg -I %t -emit-ir -enable-library-evolution -O %t/package_resilience.swift -package-name MyPkg // REQUIRES: objc_codegen // REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos // REQUIRES: CPU=x86_64 || CPU=arm64 diff --git a/test/Sema/package_resilience_super_class.swift b/test/Interpreter/package_resilience_super_class.swift similarity index 100% rename from test/Sema/package_resilience_super_class.swift rename to test/Interpreter/package_resilience_super_class.swift diff --git a/test/SILGen/accessibility_warnings.swift b/test/SILGen/accessibility_warnings.swift index adfc637c92be0..5becf61b79c02 100644 --- a/test/SILGen/accessibility_warnings.swift +++ b/test/SILGen/accessibility_warnings.swift @@ -1,15 +1,32 @@ // RUN: %target-typecheck-verify-swift -package-name accessibility_warnings -// RUN: %target-swift-emit-silgen %s -package-name accessibility_warnings | %FileCheck %s +// RUN: %target-swift-emit-silgen %s -package-name accessibility_warnings -module-name accessibility_warnings | %FileCheck %s -check-prefixes=CHECK,CHECK-NONRES +// RUN: %target-swift-emit-silgen %s -package-name accessibility_warnings -module-name accessibility_warnings -enable-library-evolution | %FileCheck %s -check-prefixes=CHECK,CHECK-RES // This file tests that the AST produced after fixing accessibility warnings // is valid according to SILGen and the verifiers. public struct PublicStruct { - // CHECK-DAG: sil{{( \[.+\])*}} @$s22accessibility_warnings12PublicStructV9publicVarSivg + // CHECK-RES-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings12PublicStructV9publicVarSivpfi + // CHECK-NONRES-DAG: sil [transparent] [ossa] @$s22accessibility_warnings12PublicStructV9publicVarSivpfi + // CHECK-RES-DAG: sil [ossa] @$s22accessibility_warnings12PublicStructV9publicVarSivg + // CHECK-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s22accessibility_warnings12PublicStructV9publicVarSivg + // CHECK-RES-DAG: sil [ossa] @$s22accessibility_warnings12PublicStructV9publicVarSivs + // CHECK-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s22accessibility_warnings12PublicStructV9publicVarSivs public var publicVar = 0 // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings12PublicStructVACycfC } +package struct PackageStruct { + // CHECK-RES-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings13PackageStructV9publicVarSivpfi + // CHECK-NONRES-DAG: sil package [transparent] [ossa] @$s22accessibility_warnings13PackageStructV9publicVarSivpfi + // CHECK-RES-DAG: sil package [ossa] @$s22accessibility_warnings13PackageStructV9publicVarSivg + // CHECK-NONRES-DAG: sil package [transparent] [ossa] @$s22accessibility_warnings13PackageStructV9publicVarSivg + // CHECK-RES-DAG: sil package [ossa] @$s22accessibility_warnings13PackageStructV9publicVarSivs + // CHECK-NONRES-DAG: sil package [transparent] [ossa] @$s22accessibility_warnings13PackageStructV9publicVarSivs : + package var publicVar = 0 + // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings13PackageStructVACycfC +} + internal struct InternalStruct { public var publicVar = 0 @@ -41,6 +58,13 @@ extension PublicStruct { public var publicVarExtension: Int { get { return 0 } set {} } } +extension PackageStruct { + // CHECK-DAG: sil package [ossa] @$s22accessibility_warnings13PackageStructV1xACSi_tcfC : $@convention(method) ( + public init(x: Int) { self.init() } + // CHECK-DAG: sil package [ossa] @$s22accessibility_warnings13PackageStructV18publicVarExtensionSivg + public var publicVarExtension: Int { get { return 0 } set {} } +} + extension InternalStruct { // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings14InternalStructV1xACSi_tcfC public init(x: Int) { self.init() } @@ -64,6 +88,15 @@ public extension PublicStruct { private func extImplPublic() {} } +package extension PublicStruct { + // CHECK-DAG: sil package [ossa] @$s22accessibility_warnings12PublicStructV16extMemberPackageyyF + func extMemberPackage() {} + // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings12PublicStructV16extMethodPackageyyF + internal func extMethodPackage() {} + // CHECK-DAG: sil private [ossa] @$s22accessibility_warnings12PublicStructV14extImplPackage33_5D2F2E026754A901C0FF90C404896D02LLyyF + private func extImplPackage() {} +} + internal extension PublicStruct { // CHECK-DAG: sil [ossa] @$s22accessibility_warnings12PublicStructV17extMemberInternalyyF public func extMemberInternal() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}} @@ -77,6 +110,15 @@ private extension PublicStruct { private func extImplPrivate() {} } +package extension PackageStruct { + // CHECK-DAG: sil package [ossa] @$s22accessibility_warnings13PackageStructV09extMemberC0yyF + func extMemberPackage() {} + // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings13PackageStructV09extMethodC0yyF + internal func extMethodPackage() {} + // CHECK-DAG: sil private [ossa] @$s22accessibility_warnings13PackageStructV07extImplC033_5D2F2E026754A901C0FF90C404896D02LLyyF + private func extImplPackage() {} +} + internal extension InternalStruct { // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings14InternalStructV09extMemberC0yyF public func extMemberInternal() {} // expected-warning {{'public' modifier conflicts with extension's default access of 'internal'}} {{none}} @@ -114,18 +156,48 @@ internal struct PrivateSettersForReadOnlyInternal : PublicReadOnlyOperations { } } - public class PublicClass { - // CHECK-DAG: sil{{( \[.+\])*}} @$s22accessibility_warnings11PublicClassC9publicVarSivg + // CHECK-RES-DAG: sil [ossa] @$s22accessibility_warnings11PublicClassC9publicVarSivg + // CHECK-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s22accessibility_warnings11PublicClassC9publicVarSivg + // CHECK-RES-DAG: sil [ossa] @$s22accessibility_warnings11PublicClassC9publicVarSivs + // CHECK-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s22accessibility_warnings11PublicClassC9publicVarSivs public var publicVar = 0 - // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings11PublicClassCACycfc + + // CHECK-RES-DAG: sil [ossa] @$s22accessibility_warnings11PublicClassC19publicVarPrivateSetSivg + // CHECK-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s22accessibility_warnings11PublicClassC19publicVarPrivateSetSivg + // CHECK-RES-DAG: sil hidden [ossa] @$s22accessibility_warnings11PublicClassC19publicVarPrivateSetSivs + // CHECK-NONRES-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings11PublicClassC19publicVarPrivateSetSivs + public private(set) var publicVarPrivateSet = 0 + + // CHECK-RES-DAG: sil [ossa] @$s22accessibility_warnings11PublicClassC20publicVarInternalSetSivg + // CHECK-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s22accessibility_warnings11PublicClassC20publicVarInternalSetSivg + // CHECK-RES-DAG: sil hidden [ossa] @$s22accessibility_warnings11PublicClassC20publicVarInternalSetSivs + // CHECK-NONRES-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings11PublicClassC20publicVarInternalSetSivs + public internal(set) var publicVarInternalSet = 0 + + // CHECK-RES-DAG: sil [ossa] @$s22accessibility_warnings11PublicClassC19publicVarPackageSetSivg + // CHECK-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s22accessibility_warnings11PublicClassC19publicVarPackageSetSivg + // CHECK-RES-DAG: sil package [ossa] @$s22accessibility_warnings11PublicClassC19publicVarPackageSetSivs + // CHECK-NONRES-DAG: sil package [transparent] [ossa] @$s22accessibility_warnings11PublicClassC19publicVarPackageSetSivs + public package(set) var publicVarPackageSet = 0 + + // CHECK-DAG: sil [ossa] @$s22accessibility_warnings11PublicClassC16publicVarGetOnlySivg + public var publicVarGetOnly: Int { return 0 } + + // CHECK-DAG: sil [ossa] @$s22accessibility_warnings11PublicClassC15publicVarGetSetSivg + // CHECK-DAG: sil [ossa] @$s22accessibility_warnings11PublicClassC15publicVarGetSetSivs + public var publicVarGetSet: Int { get { return 0 } set {} } + + // CHECK-DAG: sil hidden{{( \[.+\])*}} [ossa] @$s22accessibility_warnings11PublicClassCACycfc } internal class InternalClass { - // CHECK-DAG: sil hidden{{( \[.+\])*}} [ossa] @$s22accessibility_warnings13InternalClassC9publicVarSivg + // CHECK-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings13InternalClassC9publicVarSivg + // CHECK-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings13InternalClassC9publicVarSivs public var publicVar = 0 // CHECK-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings13InternalClassC19publicVarPrivateSetSivg + // CHECK-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings13InternalClassC19publicVarPrivateSetSivs public private(set) var publicVarPrivateSet = 0 // expected-warning@+1 {{'public(set)' modifier is redundant for a public property}} {{10-22=}} @@ -134,34 +206,44 @@ internal class InternalClass { // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings13InternalClassC16publicVarGetOnlySivg public var publicVarGetOnly: Int { return 0 } - // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings13InternalClassC15publicVarGetSetSivg + // CHECK-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings13InternalClassC18publicVarPublicSetSivg + // CHECK-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings13InternalClassC18publicVarPublicSetSivs public var publicVarGetSet: Int { get { return 0 } set {} } - // CHECK-DAG: sil hidden [ossa] @$s22accessibility_warnings13InternalClassCACycfc + // CHECK-DAG: sil hidden{{( \[.+\])*}} [ossa] @$s22accessibility_warnings13InternalClassCACycfc } package class PackageClass { - // CHECK-DAG: sil{{( \[.+\])*}} [ossa] @$s22accessibility_warnings12PackageClassC9publicVarSivg + // CHECK-RES-DAG: sil package [ossa] @$s22accessibility_warnings12PackageClassC9publicVarSivg + // CHECK-RES-DAG: sil package [ossa] @$s22accessibility_warnings12PackageClassC9publicVarSivs + // CHECK-NONRES-DAG: sil package [transparent] [ossa] @$s22accessibility_warnings12PackageClassC9publicVarSivg + // CHECK-NONRES-DAG: sil package [transparent] [ossa] @$s22accessibility_warnings12PackageClassC9publicVarSivs public var publicVar = 0 - // CHECK-DAG: sil{{( \[.+\])*}} [ossa] @$s22accessibility_warnings12PackageClassC19publicVarPrivateSetSivg + // CHECK-RES-DAG: sil package [ossa] @$s22accessibility_warnings12PackageClassC19publicVarPrivateSetSivg + // CHECK-RES-DAG: sil hidden [ossa] @$s22accessibility_warnings12PackageClassC19publicVarPrivateSetSivs + // CHECK-NONRES-DAG: sil package [transparent] [ossa] @$s22accessibility_warnings12PackageClassC19publicVarPrivateSetSivg + // CHECK-NONRES-DAG: sil hidden [transparent] [ossa] @$s22accessibility_warnings12PackageClassC19publicVarPrivateSetSivs public private(set) var publicVarPrivateSet = 0 // expected-warning@+1 {{'public(set)' modifier is redundant for a public property}} {{10-22=}} public public(set) var publicVarPublicSet = 0 - // CHECK-DAG: sil{{( \[.+\])*}} [ossa] @$s22accessibility_warnings12PackageClassC16publicVarGetOnlySivg + // CHECK-RES-DAG: sil package [ossa] @$s22accessibility_warnings12PackageClassC18publicVarPublicSetSivg + // CHECK-NONRES-DAG: sil package [ossa] @$s22accessibility_warnings12PackageClassC16publicVarGetOnlySivg public var publicVarGetOnly: Int { return 0 } - // CHECK-DAG: sil{{( \[.+\])*}} [ossa] @$s22accessibility_warnings12PackageClassC15publicVarGetSetSivg + // CHECK-DAG: sil package [ossa] @$s22accessibility_warnings12PackageClassC15publicVarGetSetSivg + // CHECK-DAG: sil package [ossa] @$s22accessibility_warnings12PackageClassC15publicVarGetSetSivs public var publicVarGetSet: Int { get { return 0 } set {} } // CHECK-DAG: sil hidden{{( \[.+\])*}} [ossa] @$s22accessibility_warnings12PackageClassCACycfc } private class PrivateClass { - // CHECK-DAG: sil private{{( \[.+\])*}} [ossa] @$s22accessibility_warnings12PrivateClass33_5D2F2E026754A901C0FF90C404896D02LLC9publicVarSivg + //CHECK-DAG: sil private [transparent] [ossa] @$s22accessibility_warnings12PrivateClass33_5D2F2E026754A901C0FF90C404896D02LLC9publicVarSivg + // CHECK-DAG: sil private [transparent] [ossa] @$s22accessibility_warnings12PrivateClass33_5D2F2E026754A901C0FF90C404896D02LLC9publicVarSivs public var publicVar = 0 - // CHECK-DAG: sil private [ossa] @$s22accessibility_warnings12PrivateClass33_5D2F2E026754A901C0FF90C404896D02LLCADycfc + // CHECK-DAG: sil private{{( \[.+\])*}} [ossa] @$s22accessibility_warnings12PrivateClass33_5D2F2E026754A901C0FF90C404896D02LLCADycfc } diff --git a/test/SILGen/package_sil_linkage.swift b/test/SILGen/package_sil_linkage.swift new file mode 100644 index 0000000000000..0b0cead411743 --- /dev/null +++ b/test/SILGen/package_sil_linkage.swift @@ -0,0 +1,703 @@ +// RUN: %empty-directory(%t) +// RUN: split-file %s %t + +/// Build Utils module resiliently. +// RUN: %target-swift-frontend -emit-module %t/Utils.swift \ +// RUN: -module-name Utils -swift-version 5 -I %t \ +// RUN: -package-name mypkg \ +// RUN: -enable-library-evolution \ +// RUN: -emit-module -emit-module-path %t/Utils.swiftmodule + +// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t -swift-version 5 -package-name mypkg -verify + +/// Check serialization in SILGEN with resilience enabled. +// RUN: %target-swift-emit-silgen -emit-verbose-sil -sil-verify-all -enable-library-evolution -module-name Utils %t/Utils.swift -package-name mypkg -I %t > %t/Utils-Res.sil +// RUN: %FileCheck %s --check-prefixes=UTILS-RES,UTILS-COMMON < %t/Utils-Res.sil + +/// Check for indirect access with a resiliently built module dependency. +// RUN: %target-swift-emit-silgen -sil-verify-all %t/Client.swift -package-name mypkg -I %t > %t/Client-Res.sil +// RUN: %FileCheck %s --check-prefixes=CLIENT-RES,CLIENT-COMMON < %t/Client-Res.sil + +// RUN: rm -rf %t/Utils.swiftmodule + +/// Build Utils module non-resiliently +// RUN: %target-swift-frontend -emit-module %t/Utils.swift \ +// RUN: -module-name Utils -swift-version 5 -I %t \ +// RUN: -package-name mypkg \ +// RUN: -emit-module -emit-module-path %t/Utils.swiftmodule + +// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t -swift-version 5 -package-name mypkg -verify + +/// Check serialization in SILGEN with resilience not enabled. +// RUN: %target-swift-emit-silgen -emit-verbose-sil -sil-verify-all -module-name Utils %t/Utils.swift -package-name mypkg -I %t > %t/Utils-NonRes.sil +// RUN: %FileCheck %s --check-prefixes=UTILS-NONRES,UTILS-COMMON < %t/Utils-NonRes.sil + +/// Check for indirect access with a non-resiliently built module dependency. +// RUN: %target-swift-emit-silgen -sil-verify-all %t/Client.swift -package-name mypkg -I %t > %t/Client-NonRes.sil +// RUN: %FileCheck %s --check-prefixes=CLIENT-NONRES,CLIENT-COMMON < %t/Client-NonRes.sil + + +//--- Utils.swift + +// UTILS-NONRES-NOT: sil shared [thunk] [ossa] @$s5Utils11PublicKlassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed PublicKlass) -> () { +// UTILS-NONRES-NOT: sil shared [thunk] [ossa] @$s5Utils11PublicKlassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed PublicKlass) -> () { + +// UTILS-NONRES-NOT: sil shared [thunk] [ossa] @$s5Utils8PkgKlassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed PkgKlass) -> @out Int { +// UTILS-NONRES-NOT: sil shared [thunk] [ossa] @$s5Utils8PkgKlassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed PkgKlass) -> () { + +// UTILS-NONRES-NOT: sil shared [thunk] [ossa] @$s5Utils11UfiPkgClassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed UfiPkgClass) -> @out Int { +// UTILS-NONRES-NOT: sil shared [thunk] [ossa] @$s5Utils11UfiPkgClassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed UfiPkgClass) -> () { + +// UTILS-NONRES-NOT: sil shared [thunk] [ossa] @$s5Utils15PkgClassGenericC4dataxvplACyxGTK : $@convention(keypath_accessor_getter) (@in_guaranteed PkgClassGeneric) -> @out T { +// UTILS-NONRES-NOT: sil shared [thunk] [ossa] @$s5Utils15PkgClassGenericC4dataxvplACyxGTk : $@convention(keypath_accessor_setter) (@in_guaranteed T, @in_guaranteed PkgClassGeneric) -> () { + +public protocol PublicProto { + var data: Int { get set } + func pfunc(_ arg: Int) -> Int +} + +public class PublicKlass: PublicProto { + // key path getter/setter for PublicKlass are only emitted when resilient. + // key path getter for PublicKlass.data : PublicKlass + // UTILS-RES-DAG: sil shared [thunk] [ossa] @$s5Utils11PublicKlassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed PublicKlass) -> @out Int { + + // key path setter for PublicKlass.data : PublicKlass + // UTILS-RES-DAG: sil shared [thunk] [ossa] @$s5Utils11PublicKlassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed PublicKlass) -> () { + + // PublicKlass.data.getter + // UTILS-RES-DAG: sil [ossa] @$s5Utils11PublicKlassC4dataSivg : $@convention(method) (@guaranteed PublicKlass) -> Int + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils11PublicKlassC4dataSivg : $@convention(method) (@guaranteed PublicKlass) -> Int { + + // PublicKlass.data.setter + // UTILS-RES-DAG: sil [ossa] @$s5Utils11PublicKlassC4dataSivs : $@convention(method) (Int, @guaranteed PublicKlass) -> () { + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils11PublicKlassC4dataSivs : $@convention(method) (Int, @guaranteed PublicKlass) -> () { + + // PublicKlass.data.modify + // UTILS-RES-DAG: sil [ossa] @$s5Utils11PublicKlassC4dataSivM : $@yield_once @convention(method) (@guaranteed PublicKlass) -> @yields @inout Int { + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils11PublicKlassC4dataSivM : $@yield_once @convention(method) (@guaranteed PublicKlass) -> @yields @inout Int { + + // protocol witness for PublicProto.data.getter in conformance PublicKlass + // UTILS-RES-DAG: sil private [transparent] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivgTW : $@convention(witness_method: PublicProto) (@in_guaranteed PublicKlass) -> Int { + // UTILS-NONRES-DAG: sil shared [transparent] [serialized] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivgTW : $@convention(witness_method: PublicProto) (@in_guaranteed PublicKlass) -> Int { + + // protocol witness for PublicProto.data.setter in conformance PublicKlass + // UTILS-RES-DAG: sil private [transparent] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivsTW : $@convention(witness_method: PublicProto) (Int, @inout PublicKlass) -> () { + // UTILS-NONRES-DAG: sil shared [transparent] [serialized] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivsTW : $@convention(witness_method: PublicProto) (Int, @inout PublicKlass) -> () { + + // protocol witness for PublicProto.data.modify in conformance PublicKlass + // UTILS-RES-DAG: sil private [transparent] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivMTW : $@yield_once @convention(witness_method: PublicProto) @substituted <τ_0_0> (@inout τ_0_0) -> @yields @inout Int for { + // UTILS-NONRES-DAG: sil shared [transparent] [serialized] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivMTW : $@yield_once @convention(witness_method: PublicProto) @substituted <τ_0_0> (@inout τ_0_0) -> @yields @inout Int for { + public var data: Int + + // default argument 0 of PublicKlass.init(data:) + // UTILS-COMMON-DAG: sil non_abi [serialized] [ossa] @$s5Utils11PublicKlassC4dataACSi_tcfcfA_ : $@convention(thin) () -> Int { + + // PublicKlass.__allocating_init(data:) + // UTILS-COMMON-DAG: sil [serialized] [exact_self_class] [ossa] @$s5Utils11PublicKlassC4dataACSi_tcfC : $@convention(method) (Int, @thick PublicKlass.Type) -> @owned PublicKlass { + public init(data: Int = 1) { + self.data = data + } + + // protocol witness for PublicProto.pfunc(_:) in conformance PublicKlass + // UTILS-RES-DAG: sil private [transparent] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP5pfuncyS2iFTW : $@convention(witness_method: PublicProto) (Int, @in_guaranteed PublicKlass) -> Int { + // UTILS-NONRES-DAG: sil shared [transparent] [serialized] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP5pfuncyS2iFTW : $@convention(witness_method: PublicProto) (Int, @in_guaranteed PublicKlass) -> Int { + public func pfunc(_ arg: Int) -> Int { + return data + arg + } +} + +package protocol PkgProto { + var data: Int { get set } + func pkgfunc(_ arg: Int) -> Int +} + +package class PkgKlass: PkgProto { + // Similar to PublicKlass, key path getter/setter for PkgKlass are only emitted + // when resilient. + + // key path getter for PkgKlass.data : PkgKlass + // UTILS-RES-DAG: sil shared [thunk] [ossa] @$s5Utils8PkgKlassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed PkgKlass) -> @out Int { + + // key path setter for PkgKlass.data : PkgKlass + // UTILS-RES-DAG: sil shared [thunk] [ossa] @$s5Utils8PkgKlassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed PkgKlass) -> () { + + // protocol witness for PkgProto.data.getter in conformance PkgKlass + // UTILS-COMMON-DAG: sil private [transparent] [thunk] [ossa] @$s5Utils8PkgKlassCAA0B5ProtoA2aDP4dataSivgTW : $@convention(witness_method: PkgProto) (@in_guaranteed PkgKlass) -> Int { + + // protocol witness for PkgProto.data.setter in conformance PkgKlass + // UTILS-COMMON-DAG: sil private [transparent] [thunk] [ossa] @$s5Utils8PkgKlassCAA0B5ProtoA2aDP4dataSivsTW : $@convention(witness_method: PkgProto) (Int, @inout PkgKlass) -> () { + + // PkgKlass.data.getter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils8PkgKlassC4dataSivg : $@convention(method) (@guaranteed PkgKlass) -> Int { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils8PkgKlassC4dataSivg : $@convention(method) (@guaranteed PkgKlass) -> Int { + + // PkgKlass.data.setter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils8PkgKlassC4dataSivs : $@convention(method) (Int, @guaranteed PkgKlass) -> () { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils8PkgKlassC4dataSivs : $@convention(method) (Int, @guaranteed PkgKlass) -> () { + + // PkgKlass.data.modify + // UTILS-RES-DAG: sil package [ossa] @$s5Utils8PkgKlassC4dataSivM : $@yield_once @convention(method) (@guaranteed PkgKlass) -> @yields @inout Int { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils8PkgKlassC4dataSivM : $@yield_once @convention(method) (@guaranteed PkgKlass) -> @yields @inout Int { + + // protocol witness for PkgProto.pkgfunc(_:) in conformance PkgKlass + // UTILS-COMMON-DAG: sil private [transparent] [thunk] [ossa] @$s5Utils8PkgKlassCAA0B5ProtoA2aDP7pkgfuncyS2iFTW : $@convention(witness_method: PkgProto) (Int, @in_guaranteed PkgKlass) -> Int { + package var data: Int + + // default argument 0 of PkgKlass.init(data:) + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils8PkgKlassC4dataACSi_tcfcfA_ : $@convention(thin) () -> Int { + + // PkgKlass.__allocating_init(data:) + // UTILS-COMMON-DAG: sil package [exact_self_class] [ossa] @$s5Utils8PkgKlassC4dataACSi_tcfC : $@convention(method) (Int, @thick PkgKlass.Type) -> @owned PkgKlass { + + // PkgKlass.init(data:) + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils8PkgKlassC4dataACSi_tcfc : $@convention(method) (Int, @owned PkgKlass) -> @owned PkgKlass { + + // PkgKlass.deinit + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils8PkgKlassCfd : $@convention(method) (@guaranteed PkgKlass) -> @owned Builtin.NativeObject { + + // PkgKlass.__deallocating_deinit + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils8PkgKlassCfD : $@convention(method) (@owned PkgKlass) -> () { + package init(data: Int = 1) { + self.data = data + } + + // PkgKlass.pkgfunc(_:) + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils8PkgKlassC7pkgfuncyS2iF : $@convention(method) (Int, @guaranteed PkgKlass) -> Int { + package func pkgfunc(_ arg: Int) -> Int { + return data + arg + } +} + +class InternalClass { + // InternalClass.data.getter + // UTILS-COMMON-DAG: sil hidden [transparent] [ossa] @$s5Utils13InternalClassC4dataSivg : $@convention(method) (@guaranteed InternalClass) -> Int { + + // InternalClass.data.setter + // UTILS-COMMON-DAG: sil hidden [transparent] [ossa] @$s5Utils13InternalClassC4dataSivs : $@convention(method) (Int, @guaranteed InternalClass) -> () { + + // InternalClass.data.modify + // UTILS-COMMON-DAG: sil hidden [transparent] [ossa] @$s5Utils13InternalClassC4dataSivM : $@yield_once @convention(method) (@guaranteed InternalClass) -> @yields @inout Int { + var data: Int + + // default argument 0 of InternalClass.init(data:) + // UTILS-COMMON-DAG: sil hidden [ossa] @$s5Utils13InternalClassC4dataACSi_tcfcfA_ : $@convention(thin) () -> Int { + + // InternalClass.__allocating_init(data:) + // UTILS-COMMON-DAG: sil hidden [exact_self_class] [ossa] @$s5Utils13InternalClassC4dataACSi_tcfC : $@convention(method) (Int, @thick InternalClass.Type) -> @owned InternalClass { + + // InternalClass.init(data:) + // UTILS-COMMON-DAG: sil hidden [ossa] @$s5Utils13InternalClassC4dataACSi_tcfc : $@convention(method) (Int, @owned InternalClass) -> @owned InternalClass { + + // InternalClass.deinit + // UTILS-COMMON-DAG: sil hidden [ossa] @$s5Utils13InternalClassCfd : $@convention(method) (@guaranteed InternalClass) -> @owned Builtin.NativeObject { + + // InternalClass.__deallocating_deinit + // UTILS-COMMON-DAG: sil hidden [ossa] @$s5Utils13InternalClassCfD : $@convention(method) (@owned InternalClass) -> () { + init(data: Int = 1) { + self.data = data + } + + // InternalClass.internalfunc(_:) + // UTILS-COMMON-DAG: sil hidden [ossa] @$s5Utils13InternalClassC12internalfuncyS2iF : $@convention(method) (Int, @guaranteed InternalClass) -> Int { + func internalfunc(_ arg: Int) -> Int { + return data + arg + } +} + +@usableFromInline +package class UfiPkgClass { + // variable initialization expression of UfiPkgClass.data + // UTILS-RES-DAG: sil hidden [transparent] [ossa] @$s5Utils11UfiPkgClassC4dataSivpfi : $@convention(thin) () -> Int { + // UTILS-NONRES-DAG: sil [transparent] [ossa] @$s5Utils11UfiPkgClassC4dataSivpfi : $@convention(thin) () -> Int { + + // Similar to PublicKlass and PkgKlass, key path get/setter are emitted only when resilient. + // key path getter for UfiPkgClass.data : UfiPkgClass + // UTILS-RES-DAG: sil shared [thunk] [ossa] @$s5Utils11UfiPkgClassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed UfiPkgClass) -> @out Int { + + // key path setter for UfiPkgClass.data : UfiPkgClass + // UTILS-RES-DAG: sil shared [thunk] [ossa] @$s5Utils11UfiPkgClassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed UfiPkgClass) -> () { + + // UfiPkgClass.data.getter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils11UfiPkgClassC4dataSivg : $@convention(method) (@guaranteed UfiPkgClass) -> Int { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils11UfiPkgClassC4dataSivg : $@convention(method) (@guaranteed UfiPkgClass) -> Int { + + // UfiPkgClass.data.setter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils11UfiPkgClassC4dataSivs : $@convention(method) (Int, @guaranteed UfiPkgClass) -> () { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils11UfiPkgClassC4dataSivs : $@convention(method) (Int, @guaranteed UfiPkgClass) -> () { + + // UfiPkgClass.data.modify + // UTILS-RES-DAG: sil package [ossa] @$s5Utils11UfiPkgClassC4dataSivM : $@yield_once @convention(method) (@guaranteed UfiPkgClass) -> @yields @inout Int { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils11UfiPkgClassC4dataSivM : $@yield_once @convention(method) (@guaranteed UfiPkgClass) -> @yields @inout Int { + package var data: Int = 0 + + // UfiPkgClass.__allocating_init() + // UTILS-COMMON-DAG: sil package [exact_self_class] [ossa] @$s5Utils11UfiPkgClassCACycfC : $@convention(method) (@thick UfiPkgClass.Type) -> @owned UfiPkgClass { + + // UfiPkgClass.init() + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils11UfiPkgClassCACycfc : $@convention(method) (@owned UfiPkgClass) -> @owned UfiPkgClass { + + // UfiPkgClass.deinit + // UTILS-COMMON-DAG: sil [ossa] @$s5Utils11UfiPkgClassCfd : $@convention(method) (@guaranteed UfiPkgClass) -> @owned Builtin.NativeObject { + + // UfiPkgClass.__deallocating_deinit + // UTILS-COMMON-DAG: sil [ossa] @$s5Utils11UfiPkgClassCfD : $@convention(method) (@owned UfiPkgClass) -> () { + package init() {} +} + +@usableFromInline +class UfiInternalClass { + // variable initialization expression of UfiInternalClass.data + // UTILS-RES-DAG: sil hidden [transparent] [ossa] @$s5Utils16UfiInternalClassC4dataSivpfi : $@convention(thin) () -> + // UTILS-NONRES-DAG: sil [transparent] [ossa] @$s5Utils16UfiInternalClassC4dataSivpfi : $@convention(thin) () -> + + // UfiInternalClass.data.getter + // UTILS-RES-DAG: sil hidden [ossa] @$s5Utils16UfiInternalClassC4dataSivg : $@convention(method) (@guaranteed UfiInternalClass) -> Int { + // UTILS-NONRES-DAG: sil hidden [transparent] [ossa] @$s5Utils16UfiInternalClassC4dataSivg : $@convention(method) (@guaranteed UfiInternalClass) -> Int { + + // UfiInternalClass.data.setter + // UTILS-RES-DAG: sil hidden [ossa] @$s5Utils16UfiInternalClassC4dataSivs : $@convention(method) (Int, @guaranteed UfiInternalClass) -> () { + // UTILS-NONRES-DAG: sil hidden [transparent] [ossa] @$s5Utils16UfiInternalClassC4dataSivs : $@convention(method) (Int, @guaranteed UfiInternalClass) -> () { + + // UfiInternalClass.data.modify + // UTILS-RES-DAG: sil hidden [ossa] @$s5Utils16UfiInternalClassC4dataSivM : $@yield_once @convention(method) (@guaranteed UfiInternalClass) -> @yields @inout Int { + // UTILS-NONRES-DAG: sil hidden [transparent] [ossa] @$s5Utils16UfiInternalClassC4dataSivM : $@yield_once @convention(method) (@guaranteed UfiInternalClass) -> @yields @inout Int { + var data: Int = 0 + + // UfiInternalClass.deinit + // UTILS-COMMON-DAG: sil [ossa] @$s5Utils16UfiInternalClassCfd : $@convention(method) (@guaranteed UfiInternalClass) -> + // UfiInternalClass.__deallocating_deinit + // UTILS-COMMON-DAG: sil [ossa] @$s5Utils16UfiInternalClassCfD : $@convention(method) (@owned UfiInternalClass) -> () { + // UfiInternalClass.__allocating_init() + // UTILS-COMMON-DAG: sil hidden [exact_self_class] [ossa] @$s5Utils16UfiInternalClassCACycfC : $@convention(method) (@thick UfiInternalClass.Type) -> @owned UfiInternalClass { + // UfiInternalClass.init() + // UTILS-COMMON-DAG: sil hidden [ossa] @$s5Utils16UfiInternalClassCACycfc : $@convention(method) (@owned UfiInternalClass) -> @owned UfiInternalClass { + init() {} +} + +public struct PublicStruct { + // variable initialization expression of PublicStruct.data + // UTILS-RES-DAG: sil hidden [transparent] [ossa] @$s5Utils12PublicStructV4dataSivpfi : $@convention(thin) () -> Int { + // UTILS-NONRES-DAG: sil [transparent] [ossa] @$s5Utils12PublicStructV4dataSivpfi : $@convention(thin) () -> Int { + + // PublicStruct.data.getter + // UTILS-RES-DAG: sil [ossa] @$s5Utils12PublicStructV4dataSivg : $@convention(method) (@in_guaranteed PublicStruct) -> Int { + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils12PublicStructV4dataSivg : $@convention(method) (PublicStruct) -> Int { + + // PublicStruct.data.setter + // UTILS-RES-DAG: sil [ossa] @$s5Utils12PublicStructV4dataSivs : $@convention(method) (Int, @inout PublicStruct) -> () { + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils12PublicStructV4dataSivs : $@convention(method) (Int, @inout PublicStruct) -> () { + + // PublicStruct.data.modify + // UTILS-RES-DAG: sil [ossa] @$s5Utils12PublicStructV4dataSivM : $@yield_once @convention(method) (@inout PublicStruct) -> @yields @inout Int { + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils12PublicStructV4dataSivM : $@yield_once @convention(method) (@inout PublicStruct) -> @yields @inout Int { + public var data: Int = 0 + + // PublicStruct.init() + // UTILS-RES-DAG: sil [ossa] @$s5Utils12PublicStructVACycfC : $@convention(method) (@thin PublicStruct.Type) -> @out PublicStruct { + // UTILS-NONRES-DAG: sil [ossa] @$s5Utils12PublicStructVACycfC : $@convention(method) (@thin PublicStruct.Type) -> PublicStruct { + public init() {} +} + +@_frozen +public struct FrozenPublicStruct { + // variable initialization expression of FrozenPublicStruct.data + // UTILS-COMMON-DAG: sil non_abi [transparent] [serialized] [ossa] @$s5Utils18FrozenPublicStructV4dataSivpfi : $@convention(thin) () -> Int { + + // FrozenPublicStruct.data.getter + // UTILS-COMMON-DAG: sil [transparent] [serialized] [ossa] @$s5Utils18FrozenPublicStructV4dataSivg : $@convention(method) (FrozenPublicStruct) -> Int { + + // FrozenPublicStruct.data.setter + // UTILS-COMMON-DAG: sil [transparent] [serialized] [ossa] @$s5Utils18FrozenPublicStructV4dataSivs : $@convention(method) (Int, @inout FrozenPublicStruct) -> () { + + // FrozenPublicStruct.data.modify + // UTILS-COMMON-DAG: sil [transparent] [serialized] [ossa] @$s5Utils18FrozenPublicStructV4dataSivM : $@yield_once @convention(method) (@inout FrozenPublicStruct) -> @yields @inout Int { + public var data: Int = 0 + + // FrozenPublicStruct.init() + // UTILS-COMMON-DAG: sil [ossa] @$s5Utils18FrozenPublicStructVACycfC : $@convention(method) (@thin FrozenPublicStruct.Type) -> FrozenPublicStruct { + public init() {} +} + +package struct PkgStruct { + // variable initialization expression of PkgStruct.data + // UTILS-RES-DAG: sil hidden [transparent] [ossa] @$s5Utils9PkgStructV4dataSivpfi : $@convention(thin) () -> Int { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils9PkgStructV4dataSivpfi : $@convention(thin) () -> Int { + package var data: Int = 0 + // PkgStruct.init() + // UTILS-RES-DAG: sil package [ossa] @$s5Utils9PkgStructVACycfC : $@convention(method) (@thin PkgStruct.Type) -> @out PkgStruct { + // UTILS-NONRES-DAG: sil package [ossa] @$s5Utils9PkgStructVACycfC : $@convention(method) (@thin PkgStruct.Type) -> PkgStruct { + package init() {} +} + +struct InternalStruct { + // variable initialization expression of InternalStruct.data + // UTILS-COMMON-DAG: sil hidden [transparent] [ossa] @$s5Utils14InternalStructV4dataSivpfi : $@convention(thin) () -> Int { + var data: Int = 0 + // InternalStruct.init() + // UTILS-COMMON-DAG: sil hidden [ossa] @$s5Utils14InternalStructVACycfC : $@convention(method) (@thin InternalStruct.Type) -> InternalStruct { + init() {} +} + +@usableFromInline +package struct UfiPkgStruct { + // variable initialization expression of UfiPkgStruct.data + // UTILS-RES-DAG: sil hidden [transparent] [ossa] @$s5Utils12UfiPkgStructV4dataSivpfi : $@convention(thin) () -> Int { + // UTILS-NONRES-DAG: sil [transparent] [ossa] @$s5Utils12UfiPkgStructV4dataSivpfi : $@convention(thin) () -> Int { + package var data: Int = 0 + // UfiPkgStruct.init() + // UTILS-RES-DAG: sil package [ossa] @$s5Utils12UfiPkgStructVACycfC : $@convention(method) (@thin UfiPkgStruct.Type) -> @out UfiPkgStruct { + // UTILS-NONRES-DAG: sil package [ossa] @$s5Utils12UfiPkgStructVACycfC : $@convention(method) (@thin UfiPkgStruct.Type) -> UfiPkgStruct { + package init() {} +} + +@usableFromInline +struct UfiInternalStruct { + // variable initialization expression of UfiInternalStruct.data + // UTILS-RES-DAG: sil hidden [transparent] [ossa] @$s5Utils17UfiInternalStructV4dataSivpfi : $@convention(thin) () -> Int { + // UTILS-NONRES-DAG: sil [transparent] [ossa] @$s5Utils17UfiInternalStructV4dataSivpfi : $@convention(thin) () -> Int { + var data: Int = 0 + + // UfiInternalStruct.init() + // UTILS-RES-DAG: sil hidden [ossa] @$s5Utils17UfiInternalStructVACycfC : $@convention(method) (@thin UfiInternalStruct.Type) -> @out UfiInternalStruct { + // UTILS-NONRES-DAG: sil hidden [ossa] @$s5Utils17UfiInternalStructVACycfC : $@convention(method) (@thin UfiInternalStruct.Type) -> UfiInternalStruct { + init() {} +} + +package struct PkgStructGeneric { + package var data: T + package init(_ arg: T) { data = arg } + // PkgStructGeneric.init(_:) + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils16PkgStructGenericVyACyxGxcfC : $@convention(method) (@in T, @thin PkgStructGeneric.Type) -> @out PkgStructGeneric { +} + +package class PkgClassGeneric { + package var data: T + package init(_ arg: T) { data = arg } + // key path getter for PkgClassGeneric.data : PkgClassGeneric + // UTILS-RES-DAG: sil shared [thunk] [ossa] @$s5Utils15PkgClassGenericC4dataxvplACyxGTK : $@convention(keypath_accessor_getter) (@in_guaranteed PkgClassGeneric) -> @out T { + + // key path setter for PkgClassGeneric.data : PkgClassGeneric + // UTILS-RES-DAG: sil shared [thunk] [ossa] @$s5Utils15PkgClassGenericC4dataxvplACyxGTk : $@convention(keypath_accessor_setter) (@in_guaranteed T, @in_guaranteed PkgClassGeneric) -> () { + + // PkgClassGeneric.data.getter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils15PkgClassGenericC4dataxvg : $@convention(method) (@guaranteed PkgClassGeneric) -> @out T { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils15PkgClassGenericC4dataxvg : $@convention(method) (@guaranteed PkgClassGeneric) -> @out T { + + // PkgClassGeneric.data.setter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils15PkgClassGenericC4dataxvs : $@convention(method) (@in T, @guaranteed PkgClassGeneric) -> () { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils15PkgClassGenericC4dataxvs : $@convention(method) (@in T, @guaranteed PkgClassGeneric) -> () { + + // PkgClassGeneric.data.modify + // UTILS-RES-DAG: sil package [ossa] @$s5Utils15PkgClassGenericC4dataxvM : $@yield_once @convention(method) (@guaranteed PkgClassGeneric) -> @yields @inout T { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils15PkgClassGenericC4dataxvM : $@yield_once @convention(method) (@guaranteed PkgClassGeneric) -> @yields @inout T { + + // PkgClassGeneric.__allocating_init(_:) + // UTILS-COMMON-DAG: sil package [exact_self_class] [ossa] @$s5Utils15PkgClassGenericCyACyxGxcfC : $@convention(method) (@in T, @thick PkgClassGeneric.Type) -> @owned PkgClassGeneric { + + // PkgClassGeneric.init(_:) + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils15PkgClassGenericCyACyxGxcfc : $@convention(method) (@in T, @owned PkgClassGeneric) -> @owned PkgClassGeneric { + // PkgClassGeneric.deinit + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils15PkgClassGenericCfd : $@convention(method) (@guaranteed PkgClassGeneric) -> @owned Builtin.NativeObject { + // PkgClassGeneric.__deallocating_deinit + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils15PkgClassGenericCfD : $@convention(method) (@owned PkgClassGeneric) -> () { +} + +package struct PkgStructWithPublicMember { + package var member: PublicStruct +} + +public struct PublicStructWithPublicExistential { + // PublicStructWithPublicExistential.member.getter + // UTILS-RES-DAG: sil [ossa] @$s5Utils016PublicStructWithB11ExistentialV6memberAA0B5Proto_pvg : $@convention(method) (@in_guaranteed PublicStructWithPublicExistential) -> @out any PublicProto { + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils016PublicStructWithB11ExistentialV6memberAA0B5Proto_pvg : $@convention(method) (@in_guaranteed PublicStructWithPublicExistential) -> @out any PublicProto { + + // PublicStructWithPublicExistential.member.setter + // UTILS-RES-DAG: sil [ossa] @$s5Utils016PublicStructWithB11ExistentialV6memberAA0B5Proto_pvs : $@convention(method) (@in any PublicProto, @inout PublicStructWithPublicExistential) -> () { + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils016PublicStructWithB11ExistentialV6memberAA0B5Proto_pvs : $@convention(method) (@in any PublicProto, @inout PublicStructWithPublicExistential) -> () { + + // PublicStructWithPublicExistential.member.modify + // UTILS-RES-DAG: sil [ossa] @$s5Utils016PublicStructWithB11ExistentialV6memberAA0B5Proto_pvM : $@yield_once @convention(method) (@inout PublicStructWithPublicExistential) -> @yields @inout any PublicProto { + // UTILS-NONRES-DAG: sil [transparent] [serialized] [ossa] @$s5Utils016PublicStructWithB11ExistentialV6memberAA0B5Proto_pvM : $@yield_once @convention(method) (@inout PublicStructWithPublicExistential) -> @yields @inout any PublicProto { + public var member: any PublicProto + + // PublicStructWithPublicExistential.init(_:) + // UTILS-COMMON-DAG: sil [ossa] @$s5Utils016PublicStructWithB11ExistentialVyAcA0B5Proto_pcfC : $@convention(method) (@in any PublicProto, @thin PublicStructWithPublicExistential.Type) -> @out PublicStructWithPublicExistential { + public init(_ arg: any PublicProto) { member = arg } +} + +package struct PkgStructWithPublicExistential { + // PkgStructWithPublicExistential.member.getter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto { + + // PkgStructWithPublicExistential.member.setter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvs : $@convention(method) (@in any PublicProto, @inout PkgStructWithPublicExistential) -> () { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvs : $@convention(method) (@in any PublicProto, @inout PkgStructWithPublicExistential) -> () { + + // PkgStructWithPublicExistential.member.modify + // UTILS-RES-DAG: sil package [ossa] @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvM : $@yield_once @convention(method) (@inout PkgStructWithPublicExistential) -> @yields @inout any PublicProto { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvM : $@yield_once @convention(method) (@inout PkgStructWithPublicExistential) -> @yields @inout any PublicProto { + package var member: any PublicProto + + // PkgStructWithPublicExistential.init(_:) + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils30PkgStructWithPublicExistentialVyAcA0E5Proto_pcfC : $@convention(method) (@in any PublicProto, @thin PkgStructWithPublicExistential.Type) -> @out PkgStructWithPublicExistential { + package init(_ arg: any PublicProto) { member = arg } +} + +package struct PkgStructWithPkgExistential { + // PkgStructWithPkgExistential.member.getter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto { + + // PkgStructWithPkgExistential.member.setter + // UTILS-RES-DAG: sil package [ossa] @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvs : $@convention(method) (@in any PkgProto, @inout PkgStructWithPkgExistential) -> () { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvs : $@convention(method) (@in any PkgProto, @inout PkgStructWithPkgExistential) -> () { + + // PkgStructWithPkgExistential.member.modify + // UTILS-RES-DAG: sil package [ossa] @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvM : $@yield_once @convention(method) (@inout PkgStructWithPkgExistential) -> @yields @inout any PkgProto { + // UTILS-NONRES-DAG: sil package [transparent] [ossa] @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvM : $@yield_once @convention(method) (@inout PkgStructWithPkgExistential) -> @yields @inout any PkgProto { + package var member: any PkgProto + + // PkgStructWithPkgExistential.init(_:) + // UTILS-COMMON-DAG: sil package [ossa] @$s5Utils013PkgStructWithB11ExistentialVyAcA0B5Proto_pcfC : $@convention(method) (@in any PkgProto, @thin PkgStructWithPkgExistential.Type) -> @out PkgStructWithPkgExistential { + package init(_ arg: any PkgProto) { member = arg } +} + +// UTILS-RES-DAG: sil_vtable PublicKlass { +// UTILS-NONRES-DAG: sil_vtable [serialized] PublicKlass { + +// FIXME: rdar://121976014 need to serialize package if non-resiliently built +// UTILS-COMMON-DAG: sil_vtable PkgKlass { +// UTILS-COMMON-DAG: sil_vtable PkgClassGeneric { + +// UTILS-COMMON-DAG: sil_vtable InternalClass { + +// UTILS-RES-DAG: sil_vtable UfiPkgClass { +// UTILS-NONRES-DAG: sil_vtable [serialized] UfiPkgClass { + +// UTILS-RES-DAG: sil_vtable UfiInternalClass { +// UTILS-NONRES-DAG: sil_vtable [serialized] UfiInternalClass { + +// UTILS-RES-DAG: sil_witness_table PublicKlass: PublicProto module Utils { +// UTILS-NONRES-DAG: sil_witness_table [serialized] PublicKlass: PublicProto module Utils { + +// NOTE: package added below +// FIXME: rdar://121976014 serialize package when non-resilient +// UTILS-COMMON-DAG: sil_witness_table package PkgKlass: PkgProto module Utils { + +// default witness table is emitted only when resiliently built +// UTILS-RES-DAG: sil_default_witness_table PublicProto { +// NOTE: package added below +// UTILS-RES-DAG: sil_default_witness_table package PkgProto { + +// UTILS-RES-DAG: sil_property #PublicKlass.data (settable_property $Int, id #PublicKlass.data!getter : (PublicKlass) -> () -> Int, getter @$s5Utils11PublicKlassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed PublicKlass) -> @out Int, setter @$s5Utils11PublicKlassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed PublicKlass) -> ()) +// UTILS-NONRES-DAG: sil_property #PublicKlass.data () + +// UTILS-RES-DAG: sil_property #UfiPkgClass.data (settable_property $Int, id #UfiPkgClass.data!getter : (UfiPkgClass) -> () -> Int, getter @$s5Utils11UfiPkgClassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed UfiPkgClass) -> @out Int, setter @$s5Utils11UfiPkgClassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed UfiPkgClass) -> ()) +// UTILS-NONRES-DAG: sil_property #UfiPkgClass.data () + +// UTILS-RES-DAG: sil_property #PkgKlass.data (settable_property $Int, id #PkgKlass.data!getter : (PkgKlass) -> () -> Int, getter @$s5Utils8PkgKlassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed PkgKlass) -> @out Int, setter @$s5Utils8PkgKlassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed PkgKlass) -> ()) +// UTILS-NONRES-DAG: sil_property #PkgKlass.data () + +// UTILS-RES-DAG: sil_property #PkgClassGeneric.data<τ_0_0> (settable_property $τ_0_0, id #PkgClassGeneric.data!getter : (PkgClassGeneric) -> () -> T, getter @$s5Utils15PkgClassGenericC4dataxvplACyxGTK : $@convention(keypath_accessor_getter) <τ_0_0> (@in_guaranteed PkgClassGeneric<τ_0_0>) -> @out τ_0_0, setter @$s5Utils15PkgClassGenericC4dataxvplACyxGTk : $@convention(keypath_accessor_setter) <τ_0_0> (@in_guaranteed τ_0_0, @in_guaranteed PkgClassGeneric<τ_0_0>) -> ()) +// UTILS-NONRES-DAG: sil_property #PkgClassGeneric.data<τ_0_0> () + +// UTILS-RES-DAG: sil_property #PublicStruct.data (stored_property #PublicStruct.data : $Int) +// UTILS-NONRES-DAG: sil_property #PublicStruct.data () + +// UTILS-RES-DAG: sil_property #FrozenPublicStruct.data (stored_property #FrozenPublicStruct.data : $Int) +// UTILS-NONRES-DAG: sil_property #FrozenPublicStruct.data () + +// UTILS-RES-DAG: sil_property #PkgStruct.data (stored_property #PkgStruct.data : $Int) +// UTILS-NONRES-DAG: sil_property #PkgStruct.data () + +// UTILS-RES-DAG: sil_property #UfiPkgStruct.data (stored_property #UfiPkgStruct.data : $Int) +// UTILS-NONRES-DAG: sil_property #UfiPkgStruct.data () + +// UTILS-RES-DAG: sil_property #PkgStructGeneric.data<τ_0_0> (stored_property #PkgStructGeneric.data : $τ_0_0) +// UTILS-NONRES-DAG: sil_property #PkgStructGeneric.data<τ_0_0> () + +// UTILS-RES-DAG: sil_property #PkgStructWithPublicMember.member (stored_property #PkgStructWithPublicMember.member : $PublicStruct) +// UTILS-NONRES-DAG: sil_property #PkgStructWithPublicMember.member () + +// UTILS-RES-DAG: sil_property #PublicStructWithPublicExistential.member (stored_property #PublicStructWithPublicExistential.member : $any PublicProto) +// UTILS-NONRES-DAG: sil_property #PublicStructWithPublicExistential.member () + +// UTILS-RES-DAG: sil_property #PkgStructWithPublicExistential.member (stored_property #PkgStructWithPublicExistential.member : $any PublicProto) +// UTILS-NONRES-DAG: sil_property #PkgStructWithPublicExistential.member () + +// UTILS-RES-DAG: sil_property #PkgStructWithPkgExistential.member (stored_property #PkgStructWithPkgExistential.member : $any PkgProto) +// UTILS-NONRES-DAG: sil_property #PkgStructWithPkgExistential.member () + + +//--- Client.swift +import Utils + +package func f(_ arg: PublicStruct) -> Int { + return arg.data +} + +// CLIENT-RES-LABEL: // f(_:) +// CLIENT-RES-NEXT: sil package [ossa] @$s6Client1fySi5Utils12PublicStructVF : $@convention(thin) (@in_guaranteed PublicStruct) -> Int +// CLIENT-RES-LABEL: // PublicStruct.data.getter +// CLIENT-RES-NEXT: sil @$s5Utils12PublicStructV4dataSivg : $@convention(method) (@in_guaranteed PublicStruct) -> Int + +// CLIENT-NONRES-LABEL: // f(_:) +// CLIENT-NONRES-NEXT: sil package [ossa] @$s6Client1fySi5Utils12PublicStructVF : $@convention(thin) (PublicStruct) -> Int + +public func ff(_ arg: PublicStruct) -> Int { + return arg.data +} + +// CLIENT-RES-LABEL: // ff(_:) +// CLIENT-RES-NEXT: sil [ossa] @$s6Client2ffySi5Utils12PublicStructVF : $@convention(thin) (@in_guaranteed PublicStruct) -> Int + +// CLIENT-NONRES-LABEL: // ff(_:) +// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client2ffySi5Utils12PublicStructVF : $@convention(thin) (PublicStruct) -> Int + + +public func fx(_ arg: FrozenPublicStruct) -> Int { + return arg.data +} + +// CLIENT-COMMON-LABEL: // fx(_:) +// CLIENT-COMMON-LABEL: sil [ossa] @$s6Client2fxySi5Utils18FrozenPublicStructVF : $@convention(thin) (FrozenPublicStruct) -> Int { +// CLIENT-COMMON-LABEL: // %0 "arg" +// CLIENT-COMMON-LABEL: bb0(%0 : $FrozenPublicStruct): +// CLIENT-COMMON-LABEL: debug_value %0 : $FrozenPublicStruct, let, name "arg", argno 1 +// CLIENT-COMMON-LABEL: %2 = struct_extract %0 : $FrozenPublicStruct, #FrozenPublicStruct.data +// CLIENT-COMMON-LABEL: return %2 : $Int +// CLIENT-COMMON-LABEL: } // end sil function '$s6Client2fxySi5Utils18FrozenPublicStructVF' + +package func fy(_ arg: FrozenPublicStruct) -> Int { + return arg.data +} + +// CLIENT-COMMON-LABEL: // fy(_:) +// CLIENT-COMMON-LABEL: sil package [ossa] @$s6Client2fyySi5Utils18FrozenPublicStructVF : $@convention(thin) (FrozenPublicStruct) -> Int { +// CLIENT-COMMON-LABEL: // %0 "arg" +// CLIENT-COMMON-LABEL: bb0(%0 : $FrozenPublicStruct): +// CLIENT-COMMON-LABEL: debug_value %0 : $FrozenPublicStruct, let, name "arg", argno 1 +// CLIENT-COMMON-LABEL: %2 = struct_extract %0 : $FrozenPublicStruct, #FrozenPublicStruct.data +// CLIENT-COMMON-LABEL: return %2 : $Int +// CLIENT-COMMON-LABEL: } // end sil function '$s6Client2fyySi5Utils18FrozenPublicStructVF' + +package func g(_ arg: PkgStruct) -> Int { + return arg.data +} + +// CLIENT-RES-LABEL: // g(_:) +// CLIENT-RES-NEXT: sil package [ossa] @$s6Client1gySi5Utils9PkgStructVF : $@convention(thin) (@in_guaranteed PkgStruct) -> Int +// CLIENT-RES-LABEL: // PkgStruct.data.getter +// CLIENT-RES-NEXT: sil package_external @$s5Utils9PkgStructV4dataSivg : $@convention(method) (@in_guaranteed PkgStruct) -> Int + +// CLIENT-NONRES-LABEL: // g(_:) +// CLIENT-NONRES-NEXT: sil package [ossa] @$s6Client1gySi5Utils9PkgStructVF : $@convention(thin) (PkgStruct) -> Int + +package func gx(_ arg: UfiPkgClass) -> Int { + return arg.data +} + +// CLIENT-COMMON-LABEL: // gx(_:) +// CLIENT-COMMON-NEXT: sil package [ossa] @$s6Client2gxySi5Utils11UfiPkgClassCF : $@convention(thin) (@guaranteed UfiPkgClass) -> Int { + +package func m(_ arg: PkgStructGeneric) -> T { + return arg.data +} + +// CLIENT-RES-LABEL: // m(_:) +// CLIENT-RES-NEXT: sil package [ossa] @$s6Client1myx5Utils16PkgStructGenericVyxGlF : $@convention(thin) (@in_guaranteed PkgStructGeneric) -> @out T { + +// CLIENT-RES-LABEL: // PkgStructGeneric.data.getter +// CLIENT-RES-NEXT: sil package_external @$s5Utils16PkgStructGenericV4dataxvg : $@convention(method) <τ_0_0> (@in_guaranteed PkgStructGeneric<τ_0_0>) -> @out τ_0_0 + +// CLIENT-NONRES-LABEL: // m(_:) +// CLIENT-NONRES-NEXT: sil package [ossa] @$s6Client1myx5Utils16PkgStructGenericVyxGlF : $@convention(thin) (@in_guaranteed PkgStructGeneric) -> @out T { + + +package func m(_ arg: PkgClassGeneric) -> T { + return arg.data +} + + +package func n(_ arg: PkgStructWithPublicMember) -> Int { + return arg.member.data +} + +// CLIENT-RES-LABEL: // n(_:) +// CLIENT-RES-NEXT: sil package [ossa] @$s6Client1nySi5Utils25PkgStructWithPublicMemberVF : $@convention(thin) (@in_guaranteed PkgStructWithPublicMember) -> Int +// CLIENT-RES-LABEL: // PkgStructWithPublicMember.member.getter +// CLIENT-RES-NEXT: sil package_external @$s5Utils25PkgStructWithPublicMemberV6memberAA0eC0Vvg : $@convention(method) (@in_guaranteed PkgStructWithPublicMember) -> @out PublicStruct + + +// CLIENT-NONRES-LABEL: // n(_:) +// CLIENT-NONRES-NEXT: sil package [ossa] @$s6Client1nySi5Utils25PkgStructWithPublicMemberVF : $@convention(thin) (PkgStructWithPublicMember) -> Int + +package func p(_ arg: PkgStructWithPublicExistential) -> any PublicProto { + return arg.member +} + +// CLIENT-RES-LABEL: // p(_:) +// CLIENT-RES-NEXT: sil package [ossa] @$s6Client1py5Utils11PublicProto_pAC013PkgStructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto { + +// CLIENT-RES-LABEL: // PkgStructWithPublicExistential.member.getter +// CLIENT-RES-NEXT: sil package_external @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto + + +// CLIENT-NONRES-LABEL: // p(_:) +// CLIENT-NONRES-NEXT: sil package [ossa] @$s6Client1py5Utils11PublicProto_pAC013PkgStructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto { + +package func q(_ arg: PkgStructWithPkgExistential) -> any PkgProto { + return arg.member +} + +// CLIENT-RES-LABEL: // q(_:) +// CLIENT-RES-NEXT: sil package [ossa] @$s6Client1qy5Utils8PkgProto_pAC0c10StructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto { + +// CLIENT-RES-LABEL: // PkgStructWithPkgExistential.member.getter +// CLIENT-RES-NEXT: sil package_external @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto + + +// CLIENT-NONRES-LABEL: // q(_:) +// CLIENT-NONRES-NEXT: sil package [ossa] @$s6Client1qy5Utils8PkgProto_pAC0c10StructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto { + +package func r(_ arg: PublicProto) -> Int { + return arg.data +} + +// CLIENT-COMMON-LABEL: // r(_:) +// CLIENT-COMMON-NEXT: sil package [ossa] @$s6Client1rySi5Utils11PublicProto_pF : $@convention(thin) (@in_guaranteed any PublicProto) -> Int { + +package func s(_ arg: PkgProto) -> Int { + return arg.data +} + +// CLIENT-COMMON-LABEL: // s(_:) +// CLIENT-COMMON-NEXT: sil package [ossa] @$s6Client1sySi5Utils8PkgProto_pF : $@convention(thin) (@in_guaranteed any PkgProto) -> Int { + +public func t(_ arg: any PublicProto) -> Int { + return arg.pfunc(arg.data) +} +// CLIENT-COMMON-LABEL: // t(_:) +// CLIENT-COMMON-LABEL: sil [ossa] @$s6Client1tySi5Utils11PublicProto_pF : $@convention(thin) (@in_guaranteed any PublicProto) -> Int + +public func u(_ arg: PublicKlass) -> Int { + return arg.pfunc(arg.data) +} + +// CLIENT-COMMON-LABEL: // u(_:) +// CLIENT-COMMON-LABEL: sil [ossa] @$s6Client1uySi5Utils11PublicKlassCF : $@convention(thin) (@guaranteed PublicKlass) -> Int + +package func v(_ arg: any PkgProto) -> Int { + return arg.pkgfunc(arg.data) +} + +// CLIENT-COMMON-LABEL: // v(_:) +// CLIENT-COMMON-LABEL: sil package [ossa] @$s6Client1vySi5Utils8PkgProto_pF : $@convention(thin) (@in_guaranteed any PkgProto) -> Int + +package func w(_ arg: PkgKlass) -> Int { + return arg.pkgfunc(arg.data) +} + +// CLIENT-COMMON-LABEL: // w(_:) +// CLIENT-COMMON-NEXT: sil package [ossa] @$s6Client1wySi5Utils8PkgKlassCF : $@convention(thin) (@guaranteed PkgKlass) -> Int diff --git a/test/SILGen/witness_tables_serialized.swift b/test/SILGen/witness_tables_serialized.swift index f3433bdada348..eb252be22eba1 100644 --- a/test/SILGen/witness_tables_serialized.swift +++ b/test/SILGen/witness_tables_serialized.swift @@ -23,35 +23,35 @@ internal struct UsableFromInlineStruct : PublicProtocol, UsableFromInlineProtoco // CHECK-DAG: sil_witness_table [serialized] PublicFrozenStruct: PublicProtocol // CHECK-DAG: sil_witness_table [serialized] PublicFrozenStruct: UsableFromInlineProtocol -// CHECK-DAG: sil_witness_table PublicFrozenStruct: PackageProtocol +// CHECK-DAG: sil_witness_table package PublicFrozenStruct: PackageProtocol // CHECK-DAG: sil_witness_table hidden PublicFrozenStruct: InternalProtocol // CHECK-RESILIENT-DAG: sil_witness_table UsableFromInlineStruct: UsableFromInlineProtocol // CHECK-RESILIENT-DAG: sil_witness_table UsableFromInlineStruct: PublicProtocol -// CHECK-RESILIENT-DAG: sil_witness_table UsableFromInlineStruct: PackageProtocol +// CHECK-RESILIENT-DAG: sil_witness_table package UsableFromInlineStruct: PackageProtocol // CHECK-RESILIENT-DAG: sil_witness_table hidden UsableFromInlineStruct: InternalProtocol // CHECK-RESILIENT-DAG: sil_witness_table PublicResilientStruct: PublicProtocol // CHECK-RESILIENT-DAG: sil_witness_table PublicResilientStruct: UsableFromInlineProtocol -// CHECK-RESILIENT-DAG: sil_witness_table PublicResilientStruct: PackageProtocol +// CHECK-RESILIENT-DAG: sil_witness_table package PublicResilientStruct: PackageProtocol // CHECK-RESILIENT-DAG: sil_witness_table hidden PublicResilientStruct: InternalProtocol -// CHECK-RESILIENT-DAG: sil_witness_table PackageStruct: PublicProtocol -// CHECK-RESILIENT-DAG: sil_witness_table PackageStruct: UsableFromInlineProtocol -// CHECK-RESILIENT-DAG: sil_witness_table PackageStruct: PackageProtocol +// CHECK-RESILIENT-DAG: sil_witness_table package PackageStruct: PublicProtocol +// CHECK-RESILIENT-DAG: sil_witness_table package PackageStruct: UsableFromInlineProtocol +// CHECK-RESILIENT-DAG: sil_witness_table package PackageStruct: PackageProtocol // CHECK-RESILIENT-DAG: sil_witness_table hidden PackageStruct: InternalProtocol // CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] UsableFromInlineStruct: UsableFromInlineProtocol // CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] UsableFromInlineStruct: PublicProtocol -// CHECK-NONRESILIENT-DAG: sil_witness_table UsableFromInlineStruct: PackageProtocol +// CHECK-NONRESILIENT-DAG: sil_witness_table package UsableFromInlineStruct: PackageProtocol // CHECK-NONRESILIENT-DAG: sil_witness_table hidden UsableFromInlineStruct: InternalProtocol // CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] PublicResilientStruct: PublicProtocol // CHECK-NONRESILIENT-DAG: sil_witness_table [serialized] PublicResilientStruct: UsableFromInlineProtocol -// CHECK-NONRESILIENT-DAG: sil_witness_table PublicResilientStruct: PackageProtocol +// CHECK-NONRESILIENT-DAG: sil_witness_table package PublicResilientStruct: PackageProtocol // CHECK-NONRESILIENT-DAG: sil_witness_table hidden PublicResilientStruct: InternalProtocol -// CHECK-NONRESILIENT-DAG: sil_witness_table PackageStruct: PublicProtocol -// CHECK-NONRESILIENT-DAG: sil_witness_table PackageStruct: UsableFromInlineProtocol -// CHECK-NONRESILIENT-DAG: sil_witness_table PackageStruct: PackageProtocol +// CHECK-NONRESILIENT-DAG: sil_witness_table package PackageStruct: PublicProtocol +// CHECK-NONRESILIENT-DAG: sil_witness_table package PackageStruct: UsableFromInlineProtocol +// CHECK-NONRESILIENT-DAG: sil_witness_table package PackageStruct: PackageProtocol // CHECK-NONRESILIENT-DAG: sil_witness_table hidden PackageStruct: InternalProtocol diff --git a/test/Sema/package_resilience_access.swift b/test/Sema/package_resilience_access.swift deleted file mode 100644 index 52201aa038f55..0000000000000 --- a/test/Sema/package_resilience_access.swift +++ /dev/null @@ -1,547 +0,0 @@ -// RUN: %empty-directory(%t) -// RUN: split-file %s %t - -/// Build Utils module resiliently. -// RUN: %target-swift-frontend -emit-module %t/Utils.swift \ -// RUN: -module-name Utils -swift-version 5 -I %t \ -// RUN: -package-name mypkg \ -// RUN: -enable-library-evolution \ -// RUN: -emit-module -emit-module-path %t/Utils.swiftmodule - -// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t -swift-version 5 -package-name mypkg -verify - -/// Check serialization in SILGEN with resilience enabled. -// RUN: %target-swift-emit-silgen -emit-verbose-sil -enable-library-evolution -module-name Utils %t/Utils.swift -package-name mypkg -I %t > %t/Utils-Res.sil -// RUN: %FileCheck %s --check-prefixes=UTILS-RES,UTILS-COMMON < %t/Utils-Res.sil - -/// Check for indirect access with a resiliently built module dependency. -// RUN: %target-swift-emit-silgen %t/Client.swift -package-name mypkg -I %t > %t/Client-Res.sil -// RUN: %FileCheck %s --check-prefixes=CLIENT-RES,CLIENT-COMMON < %t/Client-Res.sil - -// RUN: rm -rf %t/Utils.swiftmodule - -/// Build Utils module non-resiliently -// RUN: %target-swift-frontend -emit-module %t/Utils.swift \ -// RUN: -module-name Utils -swift-version 5 -I %t \ -// RUN: -package-name mypkg \ -// RUN: -emit-module -emit-module-path %t/Utils.swiftmodule - -// RUN: %target-swift-frontend -typecheck %t/Client.swift -I %t -swift-version 5 -package-name mypkg -verify - -/// Check serialization in SILGEN with resilience not enabled. -// RUN: %target-swift-emit-silgen -emit-verbose-sil -module-name Utils %t/Utils.swift -package-name mypkg -I %t > %t/Utils-NonRes.sil -// RUN: %FileCheck %s --check-prefixes=UTILS-NONRES,UTILS-COMMON < %t/Utils-NonRes.sil - -/// Check for indirect access with a non-resiliently built module dependency. -// RUN: %target-swift-emit-silgen %t/Client.swift -package-name mypkg -I %t > %t/Client-NonRes.sil -// RUN: %FileCheck %s --check-prefixes=CLIENT-NONRES,CLIENT-COMMON < %t/Client-NonRes.sil - - -//--- Utils.swift - -public protocol PublicProto { - var data: Int { get set } - func pfunc(_ arg: Int) -> Int -} - -public class PublicKlass: PublicProto { - public var data: Int - public init(data: Int = 1) { - self.data = data - } - public func pfunc(_ arg: Int) -> Int { - return data + arg - } -} - -// UTILS-RES-LABEL: // PublicKlass.data.getter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils11PublicKlassC4dataSivg : $@convention(method) (@guaranteed PublicKlass) -> Int - -// UTILS-NONRES-LABEL: // PublicKlass.data.getter -// UTILS-NONRES-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils11PublicKlassC4dataSivg : $@convention(method) (@guaranteed PublicKlass) -> Int { - -// UTILS-RES-LABEL: // PublicKlass.data.setter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils11PublicKlassC4dataSivs : $@convention(method) (Int, @guaranteed PublicKlass) -> () { - -// UTILS-NONRES-LABEL: // PublicKlass.data.setter -// UTILS-NONRES-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils11PublicKlassC4dataSivs : $@convention(method) (Int, @guaranteed PublicKlass) -> () { - -// UTILS-RES-LABEL: // PublicKlass.data.modify -// UTILS-RES-NEXT: sil [ossa] @$s5Utils11PublicKlassC4dataSivM : $@yield_once @convention(method) (@guaranteed PublicKlass) -> @yields @inout Int { - -// UTILS-NONRES-LABEL: // PublicKlass.data.modify -// UTILS-NONRES-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils11PublicKlassC4dataSivM : $@yield_once @convention(method) (@guaranteed PublicKlass) -> @yields @inout Int { - -// UTILS-COMMON-LABEL: // default argument 0 of PublicKlass.init(data:) -// UTILS-COMMON-NEXT: sil non_abi [serialized] [ossa] @$s5Utils11PublicKlassC4dataACSi_tcfcfA_ : $@convention(thin) () -> Int { - -// UTILS-COMMON-LABEL: // PublicKlass.__allocating_init(data:) -// UTILS-COMMON-NEXT: sil [serialized] [exact_self_class] [ossa] @$s5Utils11PublicKlassC4dataACSi_tcfC : $@convention(method) (Int, @thick PublicKlass.Type) -> @owned PublicKlass { - -// UTILS-RES-LABEL: // protocol witness for PublicProto.data.getter in conformance PublicKlass -// UTILS-RES-NEXT: sil private [transparent] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivgTW : $@convention(witness_method: PublicProto) (@in_guaranteed PublicKlass) -> Int { - -// UTILS-NONRES-LABEL: // protocol witness for PublicProto.data.getter in conformance PublicKlass -// UTILS-NONRES-NEXT: sil shared [transparent] [serialized] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivgTW : $@convention(witness_method: PublicProto) (@in_guaranteed PublicKlass) -> Int { - -// UTILS-RES-LABEL: // protocol witness for PublicProto.data.setter in conformance PublicKlass -// UTILS-RES-NEXT: sil private [transparent] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivsTW : $@convention(witness_method: PublicProto) (Int, @inout PublicKlass) -> () { - -// UTILS-NONRES-LABEL: // protocol witness for PublicProto.data.setter in conformance PublicKlass -// UTILS-NONRES-NEXT: sil shared [transparent] [serialized] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivsTW : $@convention(witness_method: PublicProto) (Int, @inout PublicKlass) -> () { - - -// UTILS-RES-LABEL: // protocol witness for PublicProto.data.modify in conformance PublicKlass -// UTILS-RES-NEXT: sil private [transparent] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivMTW : $@yield_once @convention(witness_method: PublicProto) @substituted <τ_0_0> (@inout τ_0_0) -> @yields @inout Int for { - -// UTILS-NONRES-LABEL: // protocol witness for PublicProto.data.modify in conformance PublicKlass -// UTILS-NONRES-NEXT: sil shared [transparent] [serialized] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP4dataSivMTW : $@yield_once @convention(witness_method: PublicProto) @substituted <τ_0_0> (@inout τ_0_0) -> @yields @inout Int for { - -// UTILS-RES-LABEL: // protocol witness for PublicProto.pfunc(_:) in conformance PublicKlass -// UTILS-RES-NEXT: sil private [transparent] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP5pfuncyS2iFTW : $@convention(witness_method: PublicProto) (Int, @in_guaranteed PublicKlass) -> Int { - -// UTILS-NONRES-LABEL: // protocol witness for PublicProto.pfunc(_:) in conformance PublicKlass -// UTILS-NONRES-NEXT: sil shared [transparent] [serialized] [thunk] [ossa] @$s5Utils11PublicKlassCAA0B5ProtoA2aDP5pfuncyS2iFTW : $@convention(witness_method: PublicProto) (Int, @in_guaranteed PublicKlass) -> Int { - -package protocol PkgProto { - var data: Int { get set } - func pkgfunc(_ arg: Int) -> Int -} - -package class PkgKlass: PkgProto { - package var data: Int - package init(data: Int = 1) { - self.data = data - } - package func pkgfunc(_ arg: Int) -> Int { - return data + arg - } -} - -// UTILS-COMMON-LABEL: // key path getter for PkgKlass.data : PkgKlass -// UTILS-COMMON-NEXT: sil shared [thunk] [ossa] @$s5Utils8PkgKlassC4dataSivpACTK : $@convention(keypath_accessor_getter) (@in_guaranteed PkgKlass) -> @out Int { - -// UTILS-COMMON-LABEL: // key path setter for PkgKlass.data : PkgKlass -// UTILS-COMMON-NEXT: sil shared [thunk] [ossa] @$s5Utils8PkgKlassC4dataSivpACTk : $@convention(keypath_accessor_setter) (@in_guaranteed Int, @in_guaranteed PkgKlass) -> () { - -// UTILS-RES-LABEL: // PkgKlass.data.getter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils8PkgKlassC4dataSivg : $@convention(method) (@guaranteed PkgKlass) -> Int { -// UTILS-NONRES-LABEL: // PkgKlass.data.getter -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils8PkgKlassC4dataSivg : $@convention(method) (@guaranteed PkgKlass) -> Int { - -// UTILS-RES-LABEL: // PkgKlass.data.setter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils8PkgKlassC4dataSivs : $@convention(method) (Int, @guaranteed PkgKlass) -> () { -// UTILS-NONRES-LABEL: // PkgKlass.data.setter -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils8PkgKlassC4dataSivs : $@convention(method) (Int, @guaranteed PkgKlass) -> () { - - -// UTILS-RES-LABEL: // PkgKlass.data.modify -// UTILS-RES-NEXT: sil [ossa] @$s5Utils8PkgKlassC4dataSivM : $@yield_once @convention(method) (@guaranteed PkgKlass) -> @yields @inout Int { -// UTILS-NONRES-LABEL: // PkgKlass.data.modify -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils8PkgKlassC4dataSivM : $@yield_once @convention(method) (@guaranteed PkgKlass) -> @yields @inout Int { - -// UTILS-COMMON-LABEL: // default argument 0 of PkgKlass.init(data:) -// UTILS-COMMON-NEXT: sil [ossa] @$s5Utils8PkgKlassC4dataACSi_tcfcfA_ : $@convention(thin) () -> Int { - -// UTILS-COMMON-LABEL: // PkgKlass.__allocating_init(data:) -// UTILS-COMMON-NEXT: sil [exact_self_class] [ossa] @$s5Utils8PkgKlassC4dataACSi_tcfC : $@convention(method) (Int, @thick PkgKlass.Type) -> @owned PkgKlass { - -// UTILS-COMMON-LABEL: // PkgKlass.init(data:) -// UTILS-COMMON-NEXT: sil [ossa] @$s5Utils8PkgKlassC4dataACSi_tcfc : $@convention(method) (Int, @owned PkgKlass) -> @owned PkgKlass { - -// UTILS-COMMON-LABEL: // PkgKlass.pkgfunc(_:) -// UTILS-COMMON-NEXT: sil [ossa] @$s5Utils8PkgKlassC7pkgfuncyS2iF : $@convention(method) (Int, @guaranteed PkgKlass) -> Int { - -// UTILS-COMMON-LABEL: // PkgKlass.deinit -// UTILS-COMMON-NEXT: sil [ossa] @$s5Utils8PkgKlassCfd : $@convention(method) (@guaranteed PkgKlass) -> @owned Builtin.NativeObject { - -// UTILS-COMMON-LABEL: // PkgKlass.__deallocating_deinit -// UTILS-COMMON-NEXT: sil [ossa] @$s5Utils8PkgKlassCfD : $@convention(method) (@owned PkgKlass) -> () { - -// UTILS-COMMON-LABEL: // protocol witness for PkgProto.data.getter in conformance PkgKlass -// UTILS-COMMON-NEXT: sil private [transparent] [thunk] [ossa] @$s5Utils8PkgKlassCAA0B5ProtoA2aDP4dataSivgTW : $@convention(witness_method: PkgProto) (@in_guaranteed PkgKlass) -> Int { - -// UTILS-COMMON-LABEL: // protocol witness for PkgProto.data.setter in conformance PkgKlass -// UTILS-COMMON-NEXT: sil private [transparent] [thunk] [ossa] @$s5Utils8PkgKlassCAA0B5ProtoA2aDP4dataSivsTW : $@convention(witness_method: PkgProto) (Int, @inout PkgKlass) -> () { - -// UTILS-COMMON-LABEL: // protocol witness for PkgProto.pkgfunc(_:) in conformance PkgKlass -// UTILS-COMMON-NEXT: sil private [transparent] [thunk] [ossa] @$s5Utils8PkgKlassCAA0B5ProtoA2aDP7pkgfuncyS2iFTW : $@convention(witness_method: PkgProto) (Int, @in_guaranteed PkgKlass) -> Int { - -public struct PublicStruct { - public var data: Int -} - -// UTILS-RES-LABEL: // PublicStruct.data.getter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils12PublicStructV4dataSivg : $@convention(method) (@in_guaranteed PublicStruct) -> Int { - -// UTILS-NONRES-LABEL: // PublicStruct.data.getter -// UTILS-NONRES-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils12PublicStructV4dataSivg : $@convention(method) (PublicStruct) -> Int { - -// UTILS-RES-LABEL: // PublicStruct.data.setter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils12PublicStructV4dataSivs : $@convention(method) (Int, @inout PublicStruct) -> () { - -// UTILS-NONRES-LABEL: // PublicStruct.data.setter -// UTILS-NONRES-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils12PublicStructV4dataSivs : $@convention(method) (Int, @inout PublicStruct) -> () { - -// UTILS-RES-LABEL: // PublicStruct.data.modify -// UTILS-RES-NEXT: sil [ossa] @$s5Utils12PublicStructV4dataSivM : $@yield_once @convention(method) (@inout PublicStruct) -> @yields @inout Int { - -// UTILS-NONRES-LABEL: // PublicStruct.data.modify -// UTILS-NONRES-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils12PublicStructV4dataSivM : $@yield_once @convention(method) (@inout PublicStruct) -> @yields @inout Int { - -@_frozen -public struct FrozenPublicStruct { - public var data: Int -} - -// UTILS-COMMON-LABEL: // FrozenPublicStruct.data.getter -// UTILS-COMMON-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils18FrozenPublicStructV4dataSivg : $@convention(method) (FrozenPublicStruct) -> Int { - -// UTILS-COMMON-LABEL: // FrozenPublicStruct.data.setter -// UTILS-COMMON-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils18FrozenPublicStructV4dataSivs : $@convention(method) (Int, @inout FrozenPublicStruct) -> () { - -// UTILS-COMMON-LABEL: // FrozenPublicStruct.data.modify -// UTILS-COMMON-NEXT: sil [transparent] [serialized] [ossa] @$s5Utils18FrozenPublicStructV4dataSivM : $@yield_once @convention(method) (@inout FrozenPublicStruct) -> @yields @inout Int { - -package struct PkgStruct { - package var data: Int -} - -// UTILS-RES-LABEL: // PkgStruct.data.getter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils9PkgStructV4dataSivg : $@convention(method) (@in_guaranteed PkgStruct) -> Int { - -// UTILS-NONRES-LABEL: // PkgStruct.data.getter -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils9PkgStructV4dataSivg : $@convention(method) (PkgStruct) -> Int { - -// UTILS-RES-LABEL: // PkgStruct.data.setter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils9PkgStructV4dataSivs : $@convention(method) (Int, @inout PkgStruct) -> () { - -// UTILS-NONRES-LABEL: // PkgStruct.data.setter -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils9PkgStructV4dataSivs : $@convention(method) (Int, @inout PkgStruct) -> () { - -// UTILS-RES-LABEL: // PkgStruct.data.modify -// UTILS-RES-NEXT: sil [ossa] @$s5Utils9PkgStructV4dataSivM : $@yield_once @convention(method) (@inout PkgStruct) -> @yields @inout Int { - -// UTILS-NONRES-LABEL: // PkgStruct.data.modify -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils9PkgStructV4dataSivM : $@yield_once @convention(method) (@inout PkgStruct) -> @yields @inout Int { - -@usableFromInline -package struct UfiPkgStruct { - package var data: Int -} - -// UTILS-RES-LABEL: // UfiPkgStruct.data.getter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils12UfiPkgStructV4dataSivg : $@convention(method) (@in_guaranteed UfiPkgStruct) -> Int { - -// UTILS-NONRES-LABEL: // UfiPkgStruct.data.getter -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils12UfiPkgStructV4dataSivg : $@convention(method) (UfiPkgStruct) -> Int { - -// UTILS-RES-LABEL: // UfiPkgStruct.data.setter -// UTILS-RES-NEXT: sil [ossa] @$s5Utils12UfiPkgStructV4dataSivs : $@convention(method) (Int, @inout UfiPkgStruct) -> () { - -// UTILS-NONRES-LABEL: // UfiPkgStruct.data.setter -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils12UfiPkgStructV4dataSivs : $@convention(method) (Int, @inout UfiPkgStruct) -> () { - -// UTILS-RES-LABEL: // UfiPkgStruct.data.modify -// UTILS-RES-NEXT: sil [ossa] @$s5Utils12UfiPkgStructV4dataSivM : $@yield_once @convention(method) (@inout UfiPkgStruct) -> @yields @inout Int { - -// UTILS-NONRES-LABEL: // UfiPkgStruct.data.modify -// UTILS-NONRES-NEXT: sil [transparent] [ossa] @$s5Utils12UfiPkgStructV4dataSivM : $@yield_once @convention(method) (@inout UfiPkgStruct) -> @yields @inout Int { - -package struct PkgStructGeneric { - package var data: T -} - -package struct PkgStructWithPublicMember { - package var member: PublicStruct -} - -package struct PkgStructWithPublicExistential { - package var member: any PublicProto -} - -package struct PkgStructWithPkgExistential { - package var member: any PkgProto -} - -struct InternalStruct { - var data: Int -} - -// UTILS-RES-LABEL: sil_vtable PublicKlass { -// UTILS-NONRES-LABEL: sil_vtable [serialized] PublicKlass { -// UTILS-COMMON-LABEL: sil_vtable PkgKlass { - -// UTILS-RES-LABEL: sil_witness_table PublicKlass: PublicProto module Utils { -// UTILS-NONRES-LABEL: sil_witness_table [serialized] PublicKlass: PublicProto module Utils { -// UTILS-COMMON-LABEL: sil_witness_table PkgKlass: PkgProto module Utils { - - - -//--- Client.swift -import Utils - -package func f(_ arg: PublicStruct) -> Int { - return arg.data -} - -// CLIENT-RES-LABEL: // f(_:) -// CLIENT-RES-NEXT: sil [ossa] @$s6Client1fySi5Utils12PublicStructVF : $@convention(thin) (@in_guaranteed PublicStruct) -> Int -// CLIENT-RES-LABEL: // PublicStruct.data.getter -// CLIENT-RES-NEXT: sil @$s5Utils12PublicStructV4dataSivg : $@convention(method) (@in_guaranteed PublicStruct) -> Int - -// CLIENT-NONRES-LABEL: // f(_:) -// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client1fySi5Utils12PublicStructVF : $@convention(thin) (PublicStruct) -> Int - -public func ff(_ arg: PublicStruct) -> Int { - return arg.data -} - -// CLIENT-RES-LABEL: // ff(_:) -// CLIENT-RES-NEXT: sil [ossa] @$s6Client2ffySi5Utils12PublicStructVF : $@convention(thin) (@in_guaranteed PublicStruct) -> Int - -// CLIENT-NONRES-LABEL: // ff(_:) -// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client2ffySi5Utils12PublicStructVF : $@convention(thin) (PublicStruct) -> Int - - -public func fx(_ arg: FrozenPublicStruct) -> Int { - return arg.data -} - -// CLIENT-COMMON-LABEL: // fx(_:) -// CLIENT-COMMON-LABEL: sil [ossa] @$s6Client2fxySi5Utils18FrozenPublicStructVF : $@convention(thin) (FrozenPublicStruct) -> Int { -// CLIENT-COMMON-LABEL: // %0 "arg" -// CLIENT-COMMON-LABEL: bb0(%0 : $FrozenPublicStruct): -// CLIENT-COMMON-LABEL: debug_value %0 : $FrozenPublicStruct, let, name "arg", argno 1 -// CLIENT-COMMON-LABEL: %2 = struct_extract %0 : $FrozenPublicStruct, #FrozenPublicStruct.data -// CLIENT-COMMON-LABEL: return %2 : $Int -// CLIENT-COMMON-LABEL: } // end sil function '$s6Client2fxySi5Utils18FrozenPublicStructVF' - -package func fy(_ arg: FrozenPublicStruct) -> Int { - return arg.data -} - -// CLIENT-COMMON-LABEL: // fy(_:) -// CLIENT-COMMON-LABEL: sil [ossa] @$s6Client2fyySi5Utils18FrozenPublicStructVF : $@convention(thin) (FrozenPublicStruct) -> Int { -// CLIENT-COMMON-LABEL: // %0 "arg" -// CLIENT-COMMON-LABEL: bb0(%0 : $FrozenPublicStruct): -// CLIENT-COMMON-LABEL: debug_value %0 : $FrozenPublicStruct, let, name "arg", argno 1 -// CLIENT-COMMON-LABEL: %2 = struct_extract %0 : $FrozenPublicStruct, #FrozenPublicStruct.data -// CLIENT-COMMON-LABEL: return %2 : $Int -// CLIENT-COMMON-LABEL: } // end sil function '$s6Client2fyySi5Utils18FrozenPublicStructVF' - -package func g(_ arg: PkgStruct) -> Int { - return arg.data -} - -// CLIENT-RES-LABEL: // g(_:) -// CLIENT-RES-NEXT: sil [ossa] @$s6Client1gySi5Utils9PkgStructVF : $@convention(thin) (@in_guaranteed PkgStruct) -> Int -// CLIENT-RES-LABEL: // PkgStruct.data.getter -// CLIENT-RES-NEXT: sil @$s5Utils9PkgStructV4dataSivg : $@convention(method) (@in_guaranteed PkgStruct) -> Int - -// CLIENT-NONRES-LABEL: // g(_:) -// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client1gySi5Utils9PkgStructVF : $@convention(thin) (PkgStruct) -> Int - -package func gx(_ arg: UfiPkgStruct) -> Int { - return arg.data -} - -// CLIENT-RES-LABEL: // gx(_:) -// CLIENT-RES-NEXT: sil [ossa] @$s6Client2gxySi5Utils12UfiPkgStructVF : $@convention(thin) (@in_guaranteed UfiPkgStruct) -> Int -// CLIENT-RES-LABEL: // UfiPkgStruct.data.getter -// CLIENT-RES-NEXT: sil @$s5Utils12UfiPkgStructV4dataSivg : $@convention(method) (@in_guaranteed UfiPkgStruct) -> Int - -// CLIENT-NONRES-LABEL: // gx(_:) -// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client2gxySi5Utils12UfiPkgStructVF : $@convention(thin) (UfiPkgStruct) -> Int - -package func m(_ arg: PkgStructGeneric) -> T { - return arg.data -} - -// CLIENT-RES-LABEL: // m(_:) -// CLIENT-RES-NEXT: sil [ossa] @$s6Client1myx5Utils16PkgStructGenericVyxGlF : $@convention(thin) (@in_guaranteed PkgStructGeneric) -> @out T { -// CLIENT-RES-NEXT: // %0 "$return_value" -// CLIENT-RES-NEXT: // %1 "arg" -// CLIENT-RES-NEXT: bb0(%0 : $*T, %1 : $*PkgStructGeneric): -// CLIENT-RES-NEXT: debug_value %1 : $*PkgStructGeneric, let, name "arg", argno 1, expr op_deref -// CLIENT-RES-NEXT: %3 = alloc_stack $PkgStructGeneric -// CLIENT-RES-NEXT: copy_addr %1 to [init] %3 : $*PkgStructGeneric -// CLIENT-RES-NEXT: // function_ref PkgStructGeneric.data.getter -// CLIENT-RES-NEXT: %5 = function_ref @$s5Utils16PkgStructGenericV4dataxvg : $@convention(method) <τ_0_0> (@in_guaranteed PkgStructGeneric<τ_0_0>) -> @out τ_0_0 -// CLIENT-RES-NEXT: %6 = apply %5(%0, %3) : $@convention(method) <τ_0_0> (@in_guaranteed PkgStructGeneric<τ_0_0>) -> @out τ_0_0 -// CLIENT-RES-NEXT: destroy_addr %3 : $*PkgStructGeneric -// CLIENT-RES-NEXT: dealloc_stack %3 : $*PkgStructGeneric -// CLIENT-RES-NEXT: %9 = tuple () -// CLIENT-RES-NEXT: return %9 : $() -// CLIENT-RES-NEXT: } // end sil function '$s6Client1myx5Utils16PkgStructGenericVyxGlF' - -// CLIENT-RES-LABEL: // PkgStructGeneric.data.getter -// CLIENT-RES-NEXT: sil @$s5Utils16PkgStructGenericV4dataxvg : $@convention(method) <τ_0_0> (@in_guaranteed PkgStructGeneric<τ_0_0>) -> @out τ_0_0 - -// CLIENT-NONRES-LABEL: // m(_:) -// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client1myx5Utils16PkgStructGenericVyxGlF : $@convention(thin) (@in_guaranteed PkgStructGeneric) -> @out T { -// CLIENT-NONRES-NEXT: // %0 "$return_value" -// CLIENT-NONRES-NEXT: // %1 "arg" -// CLIENT-NONRES-NEXT: bb0(%0 : $*T, %1 : $*PkgStructGeneric): -// CLIENT-NONRES-NEXT: debug_value %1 : $*PkgStructGeneric, let, name "arg", argno 1, expr op_deref -// CLIENT-NONRES-NEXT: %3 = struct_element_addr %1 : $*PkgStructGeneric, #PkgStructGeneric.data -// CLIENT-NONRES-NEXT: copy_addr %3 to [init] %0 : $*T -// CLIENT-NONRES-NEXT: %5 = tuple () -// CLIENT-NONRES-NEXT: return %5 : $() -// CLIENT-NONRES-NEXT: } // end sil function '$s6Client1myx5Utils16PkgStructGenericVyxGlF' - - -package func n(_ arg: PkgStructWithPublicMember) -> Int { - return arg.member.data -} - -// CLIENT-RES-LABEL: // n(_:) -// CLIENT-RES-NEXT: sil [ossa] @$s6Client1nySi5Utils25PkgStructWithPublicMemberVF : $@convention(thin) (@in_guaranteed PkgStructWithPublicMember) -> Int -// CLIENT-RES-LABEL: // PkgStructWithPublicMember.member.getter -// CLIENT-RES-NEXT: sil @$s5Utils25PkgStructWithPublicMemberV6memberAA0eC0Vvg : $@convention(method) (@in_guaranteed PkgStructWithPublicMember) -> @out PublicStruct - - -// CLIENT-NONRES-LABEL: // n(_:) -// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client1nySi5Utils25PkgStructWithPublicMemberVF : $@convention(thin) (PkgStructWithPublicMember) -> Int - -package func p(_ arg: PkgStructWithPublicExistential) -> any PublicProto { - return arg.member -} - -// CLIENT-RES-LABEL: // p(_:) -// CLIENT-RES-NEXT: sil [ossa] @$s6Client1py5Utils11PublicProto_pAC013PkgStructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto { -// CLIENT-RES-NEXT: // %0 "$return_value" -// CLIENT-RES-NEXT: // %1 "arg" -// CLIENT-RES-NEXT: bb0(%0 : $*any PublicProto, %1 : $*PkgStructWithPublicExistential): -// CLIENT-RES-NEXT: debug_value %1 : $*PkgStructWithPublicExistential, let, name "arg", argno 1, expr op_deref -// CLIENT-RES-NEXT: %3 = alloc_stack $PkgStructWithPublicExistential -// CLIENT-RES-NEXT: copy_addr %1 to [init] %3 : $*PkgStructWithPublicExistential -// CLIENT-RES-NEXT: // function_ref PkgStructWithPublicExistential.member.getter -// CLIENT-RES-NEXT: %5 = function_ref @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto -// CLIENT-RES-NEXT: %6 = apply %5(%0, %3) : $@convention(method) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto -// CLIENT-RES-NEXT: destroy_addr %3 : $*PkgStructWithPublicExistential -// CLIENT-RES-NEXT: dealloc_stack %3 : $*PkgStructWithPublicExistential -// CLIENT-RES-NEXT: %9 = tuple () -// CLIENT-RES-NEXT: return %9 : $() -// CLIENT-RES-NEXT: } // end sil function '$s6Client1py5Utils11PublicProto_pAC013PkgStructWithC11ExistentialVF' - -// CLIENT-RES-LABEL: // PkgStructWithPublicExistential.member.getter -// CLIENT-RES-NEXT: sil @$s5Utils30PkgStructWithPublicExistentialV6memberAA0E5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto - - -// CLIENT-NONRES-LABEL: // p(_:) -// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client1py5Utils11PublicProto_pAC013PkgStructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPublicExistential) -> @out any PublicProto { -// CLIENT-NONRES-NEXT: // %0 "$return_value" -// CLIENT-NONRES-NEXT: // %1 "arg" -// CLIENT-NONRES-NEXT: bb0(%0 : $*any PublicProto, %1 : $*PkgStructWithPublicExistential): -// CLIENT-NONRES-NEXT: debug_value %1 : $*PkgStructWithPublicExistential, let, name "arg", argno 1, expr op_deref -// CLIENT-NONRES-NEXT: %3 = struct_element_addr %1 : $*PkgStructWithPublicExistential, #PkgStructWithPublicExistential.member -// CLIENT-NONRES-NEXT: copy_addr %3 to [init] %0 : $*any PublicProto -// CLIENT-NONRES-NEXT: %5 = tuple () -// CLIENT-NONRES-NEXT: return %5 : $() -// CLIENT-NONRES-NEXT: } // end sil function '$s6Client1py5Utils11PublicProto_pAC013PkgStructWithC11ExistentialVF' - - -package func q(_ arg: PkgStructWithPkgExistential) -> any PkgProto { - return arg.member -} - -// CLIENT-RES-LABEL: // q(_:) -// CLIENT-RES-NEXT: sil [ossa] @$s6Client1qy5Utils8PkgProto_pAC0c10StructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto { -// CLIENT-RES-NEXT: // %0 "$return_value" -// CLIENT-RES-NEXT: // %1 "arg" -// CLIENT-RES-NEXT: bb0(%0 : $*any PkgProto, %1 : $*PkgStructWithPkgExistential): -// CLIENT-RES-NEXT: debug_value %1 : $*PkgStructWithPkgExistential, let, name "arg", argno 1, expr op_deref -// CLIENT-RES-NEXT: %3 = alloc_stack $PkgStructWithPkgExistential -// CLIENT-RES-NEXT: copy_addr %1 to [init] %3 : $*PkgStructWithPkgExistential -// CLIENT-RES-NEXT: // function_ref PkgStructWithPkgExistential.member.getter -// CLIENT-RES-NEXT: %5 = function_ref @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto -// CLIENT-RES-NEXT: %6 = apply %5(%0, %3) : $@convention(method) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto -// CLIENT-RES-NEXT: destroy_addr %3 : $*PkgStructWithPkgExistential -// CLIENT-RES-NEXT: dealloc_stack %3 : $*PkgStructWithPkgExistential -// CLIENT-RES-NEXT: %9 = tuple () -// CLIENT-RES-NEXT: return %9 : $() -// CLIENT-RES-NEXT: } // end sil function '$s6Client1qy5Utils8PkgProto_pAC0c10StructWithC11ExistentialVF' - -// CLIENT-RES-LABEL: // PkgStructWithPkgExistential.member.getter -// CLIENT-RES-NEXT: sil @$s5Utils013PkgStructWithB11ExistentialV6memberAA0B5Proto_pvg : $@convention(method) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto - - -// CLIENT-NONRES-LABEL: // q(_:) -// CLIENT-NONRES-NEXT: sil [ossa] @$s6Client1qy5Utils8PkgProto_pAC0c10StructWithC11ExistentialVF : $@convention(thin) (@in_guaranteed PkgStructWithPkgExistential) -> @out any PkgProto { -// CLIENT-NONRES-NEXT: // %0 "$return_value" -// CLIENT-NONRES-NEXT: // %1 "arg" -// CLIENT-NONRES-NEXT: bb0(%0 : $*any PkgProto, %1 : $*PkgStructWithPkgExistential): -// CLIENT-NONRES-NEXT: debug_value %1 : $*PkgStructWithPkgExistential, let, name "arg", argno 1, expr op_deref -// CLIENT-NONRES-NEXT: %3 = struct_element_addr %1 : $*PkgStructWithPkgExistential, #PkgStructWithPkgExistential.member -// CLIENT-NONRES-NEXT: copy_addr %3 to [init] %0 : $*any PkgProto -// CLIENT-NONRES-NEXT: %5 = tuple () -// CLIENT-NONRES-NEXT: return %5 : $() -// CLIENT-NONRES-NEXT: } // end sil function '$s6Client1qy5Utils8PkgProto_pAC0c10StructWithC11ExistentialVF' - - -package func r(_ arg: PublicProto) -> Int { - return arg.data -} - -// CLIENT-COMMON-LABEL: // r(_:) -// CLIENT-COMMON-NEXT: sil [ossa] @$s6Client1rySi5Utils11PublicProto_pF : $@convention(thin) (@in_guaranteed any PublicProto) -> Int { -// CLIENT-COMMON-NEXT: // %0 "arg" -// CLIENT-COMMON-NEXT: bb0(%0 : $*any PublicProto): -// CLIENT-COMMON-NEXT: debug_value %0 : $*any PublicProto, let, name "arg", argno 1, expr op_deref -// CLIENT-COMMON-NEXT: %2 = open_existential_addr immutable_access %0 : $*any PublicProto to $*@opened({{.*}}, any PublicProto) Self -// CLIENT-COMMON-NEXT: %3 = alloc_stack $@opened("{{.*}}", any PublicProto) Self -// CLIENT-COMMON-NEXT: copy_addr %2 to [init] %3 : $*@opened("{{.*}}", any PublicProto) Self -// CLIENT-COMMON-NEXT: %5 = witness_method $@opened("{{.*}}", any PublicProto) Self, #PublicProto.data!getter : (Self) -> () -> Int, %2 : $*@opened("{{.*}}", any PublicProto) Self : $@convention(witness_method: PublicProto) <τ_0_0 where τ_0_0 : PublicProto> (@in_guaranteed τ_0_0) -> Int -// CLIENT-COMMON-NEXT: %6 = apply %5<@opened("{{.*}}", any PublicProto) Self>(%3) : $@convention(witness_method: PublicProto) <τ_0_0 where τ_0_0 : PublicProto> (@in_guaranteed τ_0_0) -> Int -// CLIENT-COMMON-NEXT: destroy_addr %3 : $*@opened("{{.*}}", any PublicProto) Self -// CLIENT-COMMON-NEXT: dealloc_stack %3 : $*@opened("{{.*}}", any PublicProto) Self -// CLIENT-COMMON-NEXT: return %6 : $Int -// CLIENT-COMMON-NEXT: } // end sil function '$s6Client1rySi5Utils11PublicProto_pF' - -package func s(_ arg: PkgProto) -> Int { - return arg.data -} - -// CLIENT-COMMON-LABEL: // s(_:) -// CLIENT-COMMON-NEXT: sil [ossa] @$s6Client1sySi5Utils8PkgProto_pF : $@convention(thin) (@in_guaranteed any PkgProto) -> Int { -// CLIENT-COMMON-NEXT: // %0 "arg" -// CLIENT-COMMON-NEXT: bb0(%0 : $*any PkgProto): -// CLIENT-COMMON-NEXT: debug_value %0 : $*any PkgProto, let, name "arg", argno 1, expr op_deref -// CLIENT-COMMON-NEXT: %2 = open_existential_addr immutable_access %0 : $*any PkgProto to $*@opened("{{.*}}", any PkgProto) Self -// CLIENT-COMMON-NEXT: %3 = alloc_stack $@opened("{{.*}}", any PkgProto) Self -// CLIENT-COMMON-NEXT: copy_addr %2 to [init] %3 : $*@opened("{{.*}}", any PkgProto) Self -// CLIENT-COMMON-NEXT: %5 = witness_method $@opened("{{.*}}", any PkgProto) Self, #PkgProto.data!getter : (Self) -> () -> Int, %2 : $*@opened("{{.*}}", any PkgProto) Self : $@convention(witness_method: PkgProto) <τ_0_0 where τ_0_0 : PkgProto> (@in_guaranteed τ_0_0) -> Int -// CLIENT-COMMON-NEXT: %6 = apply %5<@opened("{{.*}}", any PkgProto) Self>(%3) : $@convention(witness_method: PkgProto) <τ_0_0 where τ_0_0 : PkgProto> (@in_guaranteed τ_0_0) -> Int -// CLIENT-COMMON-NEXT: destroy_addr %3 : $*@opened("{{.*}}", any PkgProto) Self -// CLIENT-COMMON-NEXT: dealloc_stack %3 : $*@opened("{{.*}}", any PkgProto) Self -// CLIENT-COMMON-NEXT: return %6 : $Int -// CLIENT-COMMON-NEXT: } // end sil function '$s6Client1sySi5Utils8PkgProto_pF' - - -public func t(_ arg: any PublicProto) -> Int { - return arg.pfunc(arg.data) -} -// CLIENT-COMMON-LABEL: // t(_:) -// CLIENT-COMMON-LABEL: sil [ossa] @$s6Client1tySi5Utils11PublicProto_pF : $@convention(thin) (@in_guaranteed any PublicProto) -> Int - -public func u(_ arg: PublicKlass) -> Int { - return arg.pfunc(arg.data) -} - -// CLIENT-COMMON-LABEL: // u(_:) -// CLIENT-COMMON-LABEL: sil [ossa] @$s6Client1uySi5Utils11PublicKlassCF : $@convention(thin) (@guaranteed PublicKlass) -> Int - -package func v(_ arg: any PkgProto) -> Int { - return arg.pkgfunc(arg.data) -} - -// CLIENT-COMMON-LABEL: // v(_:) -// CLIENT-COMMON-LABEL: sil [ossa] @$s6Client1vySi5Utils8PkgProto_pF : $@convention(thin) (@in_guaranteed any PkgProto) -> Int - -package func w(_ arg: PkgKlass) -> Int { - return arg.pkgfunc(arg.data) -} - -// CLIENT-COMMON-LABEL: // w(_:) -// CLIENT-COMMON-NEXT: sil [ossa] @$s6Client1wySi5Utils8PkgKlassCF : $@convention(thin) (@guaranteed PkgKlass) -> Int