16
16
17
17
#define DEBUG_TYPE " cross-module-serialization-setup"
18
18
#include " swift/AST/Module.h"
19
- #include " swift/AST/ImportCache.h"
20
19
#include " swift/Basic/Assertions.h"
21
20
#include " swift/IRGen/TBDGen.h"
22
21
#include " swift/SIL/ApplySite.h"
@@ -104,11 +103,6 @@ class CrossModuleOptimization {
104
103
bool canSerializeType (CanType type);
105
104
bool canSerializeDecl (NominalTypeDecl *decl);
106
105
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
-
112
106
bool canUseFromInline (DeclContext *declCtxt);
113
107
114
108
bool canUseFromInline (SILFunction *func);
@@ -742,12 +736,7 @@ static bool couldBeLinkedStatically(DeclContext *funcCtxt, SILModule &module) {
742
736
// The stdlib module is always linked dynamically.
743
737
if (funcModule == module.getASTContext ().getStdlibModule ())
744
738
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
+
751
740
// Conservatively assume the function is in a statically linked module.
752
741
return true ;
753
742
}
@@ -757,7 +746,7 @@ bool CrossModuleOptimization::canUseFromInline(DeclContext *declCtxt) {
757
746
if (everything)
758
747
return true ;
759
748
760
- if (!checkImports (declCtxt))
749
+ if (!M. getSwiftModule ()-> canBeUsedForCrossModuleOptimization (declCtxt))
761
750
return false ;
762
751
763
752
// / If we are emitting a TBD file, the TBD file only contains public symbols
@@ -773,58 +762,6 @@ bool CrossModuleOptimization::canUseFromInline(DeclContext *declCtxt) {
773
762
return true ;
774
763
}
775
764
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
-
828
765
// / Returns true if the function \p func can be used from a serialized function.
829
766
bool CrossModuleOptimization::canUseFromInline (SILFunction *function) {
830
767
if (everything)
0 commit comments