1616
1717#define DEBUG_TYPE " cross-module-serialization-setup"
1818#include " swift/AST/Module.h"
19- #include " swift/AST/ImportCache.h"
2019#include " swift/Basic/Assertions.h"
2120#include " swift/IRGen/TBDGen.h"
2221#include " swift/SIL/ApplySite.h"
@@ -104,11 +103,6 @@ class CrossModuleOptimization {
104103 bool canSerializeType (CanType type);
105104 bool canSerializeDecl (NominalTypeDecl *decl);
106105
107- // / Check whether decls imported with certain access levels or attributes
108- // / can be serialized.
109- // / The \p ctxt can e.g. be a NominalType or the context of a function.
110- bool checkImports (DeclContext *ctxt) const ;
111-
112106 bool canUseFromInline (DeclContext *declCtxt);
113107
114108 bool canUseFromInline (SILFunction *func);
@@ -742,12 +736,7 @@ static bool couldBeLinkedStatically(DeclContext *funcCtxt, SILModule &module) {
742736 // The stdlib module is always linked dynamically.
743737 if (funcModule == module .getASTContext ().getStdlibModule ())
744738 return false ;
745-
746- // An sdk or system module should be linked dynamically.
747- if (isPackageCMOEnabled (module .getSwiftModule ()) &&
748- funcModule->isNonUserModule ())
749- return false ;
750-
739+
751740 // Conservatively assume the function is in a statically linked module.
752741 return true ;
753742}
@@ -757,7 +746,7 @@ bool CrossModuleOptimization::canUseFromInline(DeclContext *declCtxt) {
757746 if (everything)
758747 return true ;
759748
760- if (!checkImports (declCtxt))
749+ if (!M. getSwiftModule ()-> canBeUsedForCrossModuleOptimization (declCtxt))
761750 return false ;
762751
763752 // / If we are emitting a TBD file, the TBD file only contains public symbols
@@ -773,58 +762,6 @@ bool CrossModuleOptimization::canUseFromInline(DeclContext *declCtxt) {
773762 return true ;
774763}
775764
776- bool CrossModuleOptimization::checkImports (DeclContext *ctxt) const {
777- ModuleDecl *moduleOfCtxt = ctxt->getParentModule ();
778-
779- // If the context defined in the same module - or is the same module, it's
780- // fine.
781- if (moduleOfCtxt == M.getSwiftModule ())
782- return true ;
783-
784- ModuleDecl::ImportFilter filter;
785-
786- if (isPackageCMOEnabled (M.getSwiftModule ())) {
787- // When Package CMO is enabled, types imported with `package import`
788- // or `@_spiOnly import` into this module should be allowed to be
789- // serialized. These types may be used in APIs with `package` or
790- // higher access level, with or without `@_spi`, and such APIs should
791- // be serializable to allow direct access by another module if it's
792- // in the same package.
793- //
794- // However, types are from modules imported as `@_implementationOnly`
795- // should not be serialized, even if their defining modules are SDK
796- // or system modules. Since these types are intended to remain hidden
797- // from external clients, their metadata (e.g. field offsets) may be
798- // stripped, making it unavailable for look up at runtime. If serialized,
799- // the client will attempt to use the serialized accessor and fail
800- // because the metadata is missing, leading to a linker error.
801- //
802- // This issue applies to transitively imported types as well;
803- // `@_implementationOnly import Foundation` imports `ObjectiveC`
804- // indirectly, and metadata for types like `NSObject` from `ObjectiveC`
805- // can also be stripped, thus such types should not be allowed for
806- // serialization.
807- filter = { ModuleDecl::ImportFilterKind::ImplementationOnly };
808- } else {
809- // See if context is imported in a "regular" way, i.e. not with
810- // @_implementationOnly, `package import` or @_spiOnly.
811- filter = {
812- ModuleDecl::ImportFilterKind::ImplementationOnly,
813- ModuleDecl::ImportFilterKind::PackageOnly,
814- ModuleDecl::ImportFilterKind::SPIOnly
815- };
816- }
817- SmallVector<ImportedModule, 4 > results;
818- M.getSwiftModule ()->getImportedModules (results, filter);
819-
820- auto &imports = M.getSwiftModule ()->getASTContext ().getImportCache ();
821- for (auto &desc : results) {
822- if (imports.isImportedBy (moduleOfCtxt, desc.importedModule ))
823- return false ;
824- }
825- return true ;
826- }
827-
828765// / Returns true if the function \p func can be used from a serialized function.
829766bool CrossModuleOptimization::canUseFromInline (SILFunction *function) {
830767 if (everything)
0 commit comments