Serialization: restrict swiftmodules to distribution channels

There are scenarios where different compilers are distributed with
compatible serialization format versions and the same tag. Distinguish
swiftmodules in such a case by assigning them to different distribution
channels. A compiler expecting a specific channel will only read
swiftmodules from the same channel. The channels should be defined by
downstream code as it is by definition vendor specific.

For development, a no-channel compiler loads or defining the env var
SWIFT_IGNORE_SWIFTMODULE_REVISION skips this new check.

rdar://123731777
This commit is contained in:
Alexis Laferrière
2024-02-29 17:48:34 -08:00
parent ffc2d9f9a7
commit 1e4fe67f40
10 changed files with 149 additions and 1 deletions

View File

@@ -1081,6 +1081,12 @@ void swift::serialization::diagnoseSerializedASTLoadFailure(
Ctx.Diags.diagnose(diagLoc, diag::serialization_module_incompatible_revision,
loadInfo.problematicRevision, ModuleName, moduleBufferID);
break;
case serialization::Status::ChannelIncompatible:
Ctx.Diags.diagnose(diagLoc, diag::serialization_module_incompatible_channel,
loadInfo.problematicChannel,
version::getCurrentCompilerChannel(),
ModuleName, moduleBufferID);
break;
case serialization::Status::Malformed:
Ctx.Diags.diagnose(diagLoc, diag::serialization_malformed_module,
moduleBufferID);
@@ -1168,6 +1174,7 @@ void swift::serialization::diagnoseSerializedASTLoadFailureTransitive(
case serialization::Status::NotInOSSA:
case serialization::Status::NoncopyableGenericsMismatch:
case serialization::Status::RevisionIncompatible:
case serialization::Status::ChannelIncompatible:
case serialization::Status::Malformed:
case serialization::Status::MalformedDocumentation:
case serialization::Status::FailedToLoadBridgingHeader: