|
26 | 26 | #include "llvm/Support/MemoryBuffer.h" |
27 | 27 | #include "llvm/Support/OnDiskHashTable.h" |
28 | 28 | #include "llvm/Support/PrettyStackTrace.h" |
| 29 | +#include "llvm/TargetParser/Triple.h" |
29 | 30 |
|
30 | 31 | using namespace swift; |
31 | 32 | using namespace swift::serialization; |
@@ -241,6 +242,7 @@ static ValidationInfo validateControlBlock( |
241 | 242 | bool requiresOSSAModules, |
242 | 243 | bool requiresRevisionMatch, |
243 | 244 | StringRef requiredSDK, |
| 245 | + std::optional<llvm::Triple> target, |
244 | 246 | ExtendedValidationInfo *extendedInfo, |
245 | 247 | PathObfuscator &pathRecoverer) { |
246 | 248 | // The control block is malformed until we've at least read a major version |
@@ -376,9 +378,17 @@ static ValidationInfo validateControlBlock( |
376 | 378 | case control_block::MODULE_NAME: |
377 | 379 | result.name = blobData; |
378 | 380 | break; |
379 | | - case control_block::TARGET: |
| 381 | + case control_block::TARGET: { |
380 | 382 | result.targetTriple = blobData; |
| 383 | + if (target && |
| 384 | + !areCompatible(*target, llvm::Triple(llvm::Triple::normalize( |
| 385 | + result.targetTriple)))) { |
| 386 | + result.status = Status::TargetIncompatible; |
| 387 | + return result; |
| 388 | + } |
| 389 | + |
381 | 390 | break; |
| 391 | + } |
382 | 392 | case control_block::ALLOWABLE_CLIENT_NAME: |
383 | 393 | result.allowableClients.push_back(blobData); |
384 | 394 | break; |
@@ -606,7 +616,8 @@ ValidationInfo serialization::validateSerializedAST( |
606 | 616 | StringRef requiredSDK, |
607 | 617 | ExtendedValidationInfo *extendedInfo, |
608 | 618 | SmallVectorImpl<SerializationOptions::FileDependency> *dependencies, |
609 | | - SmallVectorImpl<SearchPath> *searchPaths) { |
| 619 | + SmallVectorImpl<SearchPath> *searchPaths, |
| 620 | + std::optional<llvm::Triple> target) { |
610 | 621 | ValidationInfo result; |
611 | 622 |
|
612 | 623 | // Check 32-bit alignment. |
@@ -649,7 +660,7 @@ ValidationInfo serialization::validateSerializedAST( |
649 | 660 | {SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR}, |
650 | 661 | requiresOSSAModules, |
651 | 662 | /*requiresRevisionMatch=*/true, |
652 | | - requiredSDK, |
| 663 | + requiredSDK, target, |
653 | 664 | extendedInfo, localObfuscator); |
654 | 665 | if (result.status != Status::Valid) |
655 | 666 | return result; |
@@ -1201,7 +1212,8 @@ bool ModuleFileSharedCore::readModuleDocIfPresent(PathObfuscator &pathRecoverer) |
1201 | 1212 | docCursor, scratch, {SWIFTDOC_VERSION_MAJOR, SWIFTDOC_VERSION_MINOR}, |
1202 | 1213 | RequiresOSSAModules, |
1203 | 1214 | /*requiresRevisionMatch*/false, |
1204 | | - /*requiredSDK*/StringRef(), /*extendedInfo*/nullptr, pathRecoverer); |
| 1215 | + /*requiredSDK*/StringRef(), /*target*/std::nullopt, |
| 1216 | + /*extendedInfo*/nullptr, pathRecoverer); |
1205 | 1217 | if (info.status != Status::Valid) |
1206 | 1218 | return false; |
1207 | 1219 | // Check that the swiftdoc is actually for this module. |
@@ -1346,7 +1358,8 @@ bool ModuleFileSharedCore::readModuleSourceInfoIfPresent(PathObfuscator &pathRec |
1346 | 1358 | {SWIFTSOURCEINFO_VERSION_MAJOR, SWIFTSOURCEINFO_VERSION_MINOR}, |
1347 | 1359 | RequiresOSSAModules, |
1348 | 1360 | /*requiresRevisionMatch*/false, |
1349 | | - /*requiredSDK*/StringRef(), /*extendedInfo*/nullptr, pathRecoverer); |
| 1361 | + /*requiredSDK*/StringRef(), /*target*/std::nullopt, |
| 1362 | + /*extendedInfo*/nullptr, pathRecoverer); |
1350 | 1363 | if (info.status != Status::Valid) |
1351 | 1364 | return false; |
1352 | 1365 | // Check that the swiftsourceinfo is actually for this module. |
@@ -1423,6 +1436,7 @@ ModuleFileSharedCore::ModuleFileSharedCore( |
1423 | 1436 | bool isFramework, |
1424 | 1437 | bool requiresOSSAModules, |
1425 | 1438 | StringRef requiredSDK, |
| 1439 | + std::optional<llvm::Triple> target, |
1426 | 1440 | serialization::ValidationInfo &info, PathObfuscator &pathRecoverer) |
1427 | 1441 | : ModuleInputBuffer(std::move(moduleInputBuffer)), |
1428 | 1442 | ModuleDocInputBuffer(std::move(moduleDocInputBuffer)), |
@@ -1475,7 +1489,7 @@ ModuleFileSharedCore::ModuleFileSharedCore( |
1475 | 1489 | cursor, scratch, |
1476 | 1490 | {SWIFTMODULE_VERSION_MAJOR, SWIFTMODULE_VERSION_MINOR}, |
1477 | 1491 | RequiresOSSAModules, |
1478 | | - /*requiresRevisionMatch=*/true, requiredSDK, |
| 1492 | + /*requiresRevisionMatch=*/true, requiredSDK, target, |
1479 | 1493 | &extInfo, pathRecoverer); |
1480 | 1494 | if (info.status != Status::Valid) { |
1481 | 1495 | error(info.status); |
|
0 commit comments