Skip to content

Commit 51041e4

Browse files
committed
Serialization: Reject swiftmodules built with a different C++ interop mode
Intro an option to reject swiftmodules built in a different C++ interop mode. This rejects non-library-evolution swiftmodules that are incompabtible with a fatal error, and forces rebuilding library-evolution enabled modules from the swiftinterface. This applies to both local and distributed modules. This option is behind the env var SWIFT_ENABLE_SWIFTMODULE_PER_CXX_INTEROP for now. Allow for modules under the resource dir to be be rebuilt from swiftinterface on a C++ interop mismatch.
1 parent 861f14f commit 51041e4

File tree

20 files changed

+192
-21
lines changed

20 files changed

+192
-21
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,11 @@ ERROR(serialization_target_incompatible,Fatal,
949949
ERROR(serialization_sdk_mismatch,Fatal,
950950
"cannot load module %0 built with SDK '%1' when using SDK '%2': %3",
951951
(Identifier, StringRef, StringRef, StringRef))
952+
ERROR(serialization_cxx_interop_mismatch,Fatal,
953+
"cannot load module %0 built with the C++ interop "
954+
"%select{enabled|disabled}1 from a module where it's "
955+
"%select{disabled|enabled}1",
956+
(Identifier, bool))
952957
ERROR(serialization_target_incompatible_repl,none,
953958
"module %0 was created for incompatible target %1: %2",
954959
(Identifier, StringRef, StringRef))

include/swift/Serialization/SerializationOptions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ class SerializationOptions {
163163
bool HermeticSealAtLink = false;
164164
bool EmbeddedSwiftModule = false;
165165
bool IsOSSA = false;
166+
bool IsCXXInterop = false;
166167
bool SkipNonExportableDecls = false;
167168
bool ExplicitModuleBuild = false;
168169
bool EnableSerializationRemarks = false;

include/swift/Serialization/SerializedModuleLoader.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ class SerializedModuleLoaderBase : public ModuleLoader {
186186
bool isRequiredOSSAModules,
187187
StringRef SDKName,
188188
const llvm::Triple &target,
189+
bool isRequiredCXXInterop,
189190
StringRef packageName,
190191
llvm::vfs::FileSystem *fileSystem,
191192
PathObfuscator &recoverer);

include/swift/Serialization/Validation.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ enum class Status {
8686
/// The module file was built with a different SDK than the one in use
8787
/// to build the client.
8888
SDKMismatch,
89+
90+
/// The module was built with a different C++ interop mode.
91+
CxxInteropMismatch,
8992
};
9093

9194
/// Returns the string for the Status enum.
@@ -302,7 +305,7 @@ struct SearchPath {
302305
/// input files the module depends on, if present in INPUT_BLOCK.
303306
ValidationInfo validateSerializedAST(
304307
StringRef data, bool requiresOSSAModules,
305-
StringRef requiredSDK,
308+
StringRef requiredSDK, bool requiresCXXInterop,
306309
ExtendedValidationInfo *extendedInfo = nullptr,
307310
SmallVectorImpl<SerializationOptions::FileDependency> *dependencies =
308311
nullptr,

lib/ASTSectionImporter/ASTSectionImporter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ swift::parseASTSection(MemoryBufferSerializedModuleLoader &Loader,
5959
while (!buf.empty()) {
6060
auto info = serialization::validateSerializedAST(
6161
buf, Loader.isRequiredOSSAModules(),
62-
/*requiredSDK*/StringRef());
62+
/*requiredSDK*/StringRef(), /*requiresCXXInterop*/false);
6363

6464
assert(info.name.size() < (2 << 10) && "name failed sanity check");
6565

lib/Frontend/CompilerInvocation.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4168,6 +4168,7 @@ CompilerInvocation::loadFromSerializedAST(StringRef data) {
41684168
data,
41694169
getSILOptions().EnableOSSAModules,
41704170
LangOpts.SDKName,
4171+
LangOpts.EnableCXXInterop,
41714172
&extendedInfo);
41724173

41734174
if (info.status != serialization::Status::Valid)
@@ -4206,6 +4207,7 @@ CompilerInvocation::setUpInputForSILTool(
42064207
fileBufOrErr.get()->getBuffer(),
42074208
getSILOptions().EnableOSSAModules,
42084209
LangOpts.SDKName,
4210+
LangOpts.EnableCXXInterop,
42094211
&extendedInfo);
42104212
bool hasSerializedAST = result.status == serialization::Status::Valid;
42114213

lib/Frontend/Frontend.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ SerializationOptions CompilerInvocation::computeSerializationOptions(
280280
}
281281

282282
serializationOpts.IsOSSA = getSILOptions().EnableOSSAModules;
283+
serializationOpts.IsCXXInterop =
284+
getLangOptions().EnableCXXInterop;
283285

284286
serializationOpts.SkipNonExportableDecls =
285287
getLangOptions().SkipNonExportableDecls;

lib/Frontend/ModuleInterfaceBuilder.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,8 @@ std::error_code ExplicitModuleInterfaceBuilder::buildSwiftModuleFromInterface(
307307
SerializationOpts.Dependencies = Deps;
308308
}
309309
SerializationOpts.IsOSSA = SILOpts.EnableOSSAModules;
310+
SerializationOpts.IsCXXInterop =
311+
Instance.getASTContext().LangOpts.EnableCXXInterop;
310312

311313
SILMod->setSerializeSILAction([&]() {
312314
// We don't want to serialize module docs in the cache -- they

lib/Frontend/ModuleInterfaceLoader.cpp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,12 @@ namespace path = llvm::sys::path;
214214

215215
static bool serializedASTLooksValid(const llvm::MemoryBuffer &buf,
216216
bool requiresOSSAModules,
217-
StringRef requiredSDK) {
217+
StringRef requiredSDK,
218+
bool requiresCXXInterop) {
218219
auto VI = serialization::validateSerializedAST(buf.getBuffer(),
219220
requiresOSSAModules,
220-
requiredSDK);
221+
requiredSDK,
222+
requiresCXXInterop);
221223
return VI.status == serialization::Status::Valid;
222224
}
223225

@@ -461,7 +463,8 @@ class UpToDateModuleCheker {
461463
LLVM_DEBUG(llvm::dbgs() << "Validating deps of " << path << "\n");
462464
auto validationInfo = serialization::validateSerializedAST(
463465
buf.getBuffer(), requiresOSSAModules,
464-
ctx.LangOpts.SDKName, /*ExtendedValidationInfo=*/nullptr, &allDeps);
466+
ctx.LangOpts.SDKName, ctx.LangOpts.EnableCXXInterop,
467+
/*ExtendedValidationInfo=*/nullptr, &allDeps);
465468

466469
if (validationInfo.status != serialization::Status::Valid) {
467470
rebuildInfo.setSerializationStatus(path, validationInfo.status);
@@ -623,7 +626,8 @@ class ModuleInterfaceLoaderImpl {
623626

624627
auto looksValid = serializedASTLooksValid(*modBuf.get(),
625628
requiresOSSAModules,
626-
ctx.LangOpts.SDKName);
629+
ctx.LangOpts.SDKName,
630+
ctx.LangOpts.EnableCXXInterop);
627631
if (!looksValid)
628632
return false;
629633

@@ -936,6 +940,9 @@ class ModuleInterfaceLoaderImpl {
936940
rebuildInfo.getOrInsertCandidateModule(adjacentMod)
937941
.serializationStatus !=
938942
serialization::Status::SDKMismatch &&
943+
rebuildInfo.getOrInsertCandidateModule(adjacentMod)
944+
.serializationStatus !=
945+
serialization::Status::CxxInteropMismatch &&
939946
// FIXME (meg-gupta): We need to support recompilation of
940947
// modules in the resource directory if the mismatch is due
941948
// to importing a non-ossa module to an ossa module. This is
@@ -2404,7 +2411,8 @@ bool ExplicitSwiftModuleLoader::canImportModule(
24042411
auto metaData = serialization::validateSerializedAST(
24052412
(*moduleBuf)->getBuffer(),
24062413
Ctx.SILOpts.EnableOSSAModules,
2407-
Ctx.LangOpts.SDKName);
2414+
Ctx.LangOpts.SDKName,
2415+
Ctx.LangOpts.EnableCXXInterop);
24082416
versionInfo->setVersion(metaData.userModuleVersion,
24092417
ModuleVersionSourceKind::SwiftBinaryModule);
24102418
return true;
@@ -2758,7 +2766,7 @@ bool ExplicitCASModuleLoader::canImportModule(
27582766
}
27592767
auto metaData = serialization::validateSerializedAST(
27602768
moduleBuf->getBuffer(), Ctx.SILOpts.EnableOSSAModules,
2761-
Ctx.LangOpts.SDKName);
2769+
Ctx.LangOpts.SDKName, Ctx.LangOpts.EnableCXXInterop);
27622770
versionInfo->setVersion(metaData.userModuleVersion,
27632771
ModuleVersionSourceKind::SwiftBinaryModule);
27642772
return true;

lib/FrontendTool/FrontendTool.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,6 +1455,7 @@ static bool serializeSIB(SILModule *SM, const PrimarySpecificPaths &PSPs,
14551455
serializationOpts.SerializeAllSIL = true;
14561456
serializationOpts.IsSIB = true;
14571457
serializationOpts.IsOSSA = Context.SILOpts.EnableOSSAModules;
1458+
serializationOpts.IsCXXInterop = Context.LangOpts.EnableCXXInterop;
14581459

14591460
symbolgraphgen::SymbolGraphOptions symbolGraphOptions;
14601461

0 commit comments

Comments
 (0)