@@ -173,6 +173,7 @@ static ValidationInfo validateControlBlock(
173173 llvm::BitstreamCursor &cursor, SmallVectorImpl<uint64_t > &scratch,
174174 std::pair<uint16_t , uint16_t > expectedVersion, bool requiresOSSAModules,
175175 bool requiresRevisionMatch,
176+ StringRef requiredSDK,
176177 ExtendedValidationInfo *extendedInfo,
177178 PathObfuscator &pathRecoverer) {
178179 // The control block is malformed until we've at least read a major version
@@ -307,6 +308,30 @@ static ValidationInfo validateControlBlock(
307308 break ;
308309 case control_block::SDK_NAME: {
309310 result.sdkName = blobData;
311+
312+ // Enable this check for tagged compiler or when the
313+ // env var is set (for testing).
314+ static const char * forceDebugPreSDKRestriction =
315+ ::getenv (" SWIFT_DEBUG_FORCE_SWIFTMODULE_PER_SDK" );
316+ if (!version::isCurrentCompilerTagged () &&
317+ !forceDebugPreSDKRestriction) {
318+ break ;
319+ }
320+
321+ // The loaded module was built with a compatible SDK if either:
322+ // * it was the same SDK
323+ // * or one who's name is a prefix of the clients' SDK name. This expects
324+ // that a module built with macOS11 can be used with the macOS11.secret SDK.
325+ // This is generally the case as SDKs with suffixes are a superset of the
326+ // short SDK name equivalent. While this is accepted, this is still not a
327+ // recommended configuration and may lead to unreadable swiftmodules.
328+ StringRef moduleSDK = blobData;
329+ if (!moduleSDK.empty () && !requiredSDK.empty () &&
330+ !requiredSDK.startswith (moduleSDK)) {
331+ result.status = Status::SDKMismatch;
332+ return result;
333+ }
334+
310335 break ;
311336 }
312337 case control_block::REVISION: {
@@ -329,7 +354,7 @@ static ValidationInfo validateControlBlock(
329354 ::getenv (" SWIFT_DEBUG_FORCE_SWIFTMODULE_REVISION" );
330355
331356 bool isCompilerTagged = forcedDebugRevision ||
332- ! version::Version::getCurrentCompilerVersion (). empty ();
357+ version::isCurrentCompilerTagged ();
333358
334359 StringRef moduleRevision = blobData;
335360 if (isCompilerTagged) {
@@ -443,7 +468,7 @@ bool serialization::isSerializedAST(StringRef data) {
443468}
444469
445470ValidationInfo serialization::validateSerializedAST (
446- StringRef data, bool requiresOSSAModules,
471+ StringRef data, bool requiresOSSAModules, StringRef requiredSDK,
447472 ExtendedValidationInfo *extendedInfo,
448473 SmallVectorImpl<SerializationOptions::FileDependency> *dependencies) {
449474 ValidationInfo result;
@@ -487,6 +512,7 @@ ValidationInfo serialization::validateSerializedAST(
487512 cursor, scratch,
488513 {SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR},
489514 requiresOSSAModules, /* requiresRevisionMatch=*/ true ,
515+ requiredSDK,
490516 extendedInfo, localObfuscator);
491517 if (result.status == Status::Malformed)
492518 return result;
@@ -995,8 +1021,8 @@ bool ModuleFileSharedCore::readModuleDocIfPresent(PathObfuscator &pathRecoverer)
9951021
9961022 info = validateControlBlock (
9971023 docCursor, scratch, {SWIFTDOC_VERSION_MAJOR, SWIFTDOC_VERSION_MINOR},
998- RequiresOSSAModules, /* requiresRevisionMatch= */ false ,
999- /* extendedInfo */ nullptr , pathRecoverer);
1024+ RequiresOSSAModules, /* requiresRevisionMatch*/ false ,
1025+ /* requiredSDK */ StringRef (), /* extendedInfo */ nullptr , pathRecoverer);
10001026 if (info.status != Status::Valid)
10011027 return false ;
10021028 // Check that the swiftdoc is actually for this module.
@@ -1139,9 +1165,8 @@ bool ModuleFileSharedCore::readModuleSourceInfoIfPresent(PathObfuscator &pathRec
11391165 info = validateControlBlock (
11401166 infoCursor, scratch,
11411167 {SWIFTSOURCEINFO_VERSION_MAJOR, SWIFTSOURCEINFO_VERSION_MINOR},
1142- RequiresOSSAModules, /* requiresRevisionMatch=*/ false ,
1143- /* extendedInfo*/ nullptr ,
1144- pathRecoverer);
1168+ RequiresOSSAModules, /* requiresRevisionMatch*/ false ,
1169+ /* requiredSDK*/ StringRef (), /* extendedInfo*/ nullptr , pathRecoverer);
11451170 if (info.status != Status::Valid)
11461171 return false ;
11471172 // Check that the swiftsourceinfo is actually for this module.
@@ -1215,7 +1240,7 @@ ModuleFileSharedCore::ModuleFileSharedCore(
12151240 std::unique_ptr<llvm::MemoryBuffer> moduleInputBuffer,
12161241 std::unique_ptr<llvm::MemoryBuffer> moduleDocInputBuffer,
12171242 std::unique_ptr<llvm::MemoryBuffer> moduleSourceInfoInputBuffer,
1218- bool isFramework, bool requiresOSSAModules,
1243+ bool isFramework, bool requiresOSSAModules, StringRef requiredSDK,
12191244 serialization::ValidationInfo &info, PathObfuscator &pathRecoverer)
12201245 : ModuleInputBuffer(std::move(moduleInputBuffer)),
12211246 ModuleDocInputBuffer(std::move(moduleDocInputBuffer)),
@@ -1267,7 +1292,7 @@ ModuleFileSharedCore::ModuleFileSharedCore(
12671292 info = validateControlBlock (
12681293 cursor, scratch,
12691294 {SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR},
1270- RequiresOSSAModules, /* requiresRevisionMatch=*/ true ,
1295+ RequiresOSSAModules, /* requiresRevisionMatch=*/ true , requiredSDK,
12711296 &extInfo, pathRecoverer);
12721297 if (info.status != Status::Valid) {
12731298 error (info.status );
0 commit comments