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,52 +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
- // If Package CMO is enabled, decls imported with `package import`
788
- // or `@_spiOnly import` into this module should be allowed to be
789
- // serialized. They are used in decls with `package` or higher
790
- // access level, with or without @_spi; a client of this module
791
- // should be able to access them directly if in the same package.
792
- filter = { ModuleDecl::ImportFilterKind::ImplementationOnly };
793
- } else {
794
- // See if context is imported in a "regular" way, i.e. not with
795
- // @_implementationOnly, `package import` or @_spiOnly.
796
- filter = {
797
- ModuleDecl::ImportFilterKind::ImplementationOnly,
798
- ModuleDecl::ImportFilterKind::PackageOnly,
799
- ModuleDecl::ImportFilterKind::SPIOnly
800
- };
801
- }
802
- SmallVector<ImportedModule, 4 > results;
803
- M.getSwiftModule ()->getImportedModules (results, filter);
804
-
805
- auto &imports = M.getSwiftModule ()->getASTContext ().getImportCache ();
806
- for (auto &desc : results) {
807
- if (imports.isImportedBy (moduleOfCtxt, desc.importedModule )) {
808
- // E.g. `@_implementationOnly import QuartzCore_Private.CALayerPrivate`
809
- // imports `Foundation` as its transitive dependency module; use of a
810
- // a `public` decl in `Foundation` such as `IndexSet` in a function
811
- // signature should not block serialization in Package CMO given the
812
- // function has `package` or higher access level.
813
- if (isPackageCMOEnabled (M.getSwiftModule ()) &&
814
- moduleOfCtxt->isNonUserModule ())
815
- continue ;
816
- return false ;
817
- }
818
- }
819
- return true ;
820
- }
821
-
822
765
// / Returns true if the function \p func can be used from a serialized function.
823
766
bool CrossModuleOptimization::canUseFromInline (SILFunction *function) {
824
767
if (everything)
0 commit comments