Skip to content

Commit 0b14bdc

Browse files
committed
[swiftinterface] Handle target variants the same as targets
Based on preliminary work from @rhow. The compilation arguments for a swiftinterface file are preprocessed to modify the `-target` argument to match the preferred target (which comes from the command line) in cases in which the sub-architecture differs, but it is compatible (for example using `arm64e` when `arm64` is being compiled), but this was not done for the target variant, which ended up with mismatches on the sub-architecture used by the target and target variant, which fails an assert in assert toolchains.
1 parent 4db04f9 commit 0b14bdc

File tree

3 files changed

+45
-22
lines changed

3 files changed

+45
-22
lines changed

include/swift/Serialization/SerializedModuleLoader.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,8 @@ class SerializedASTFile final : public LoadedFile {
571571
bool extractCompilerFlagsFromInterface(
572572
StringRef interfacePath, StringRef buffer, llvm::StringSaver &ArgSaver,
573573
SmallVectorImpl<const char *> &SubArgs,
574-
std::optional<llvm::Triple> PreferredTarget = std::nullopt);
574+
std::optional<llvm::Triple> PreferredTarget = std::nullopt,
575+
std::optional<llvm::Triple> PreferredTargetVariant = std::nullopt);
575576

576577
/// Extract the user module version number from an interface file.
577578
llvm::VersionTuple extractUserModuleVersionFromInterface(StringRef moduleInterfacePath);

lib/Frontend/ModuleInterfaceLoader.cpp

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ class UpToDateModuleCheker {
454454
: ctx(ctx),
455455
fs(*ctx.SourceMgr.getFileSystem()),
456456
requiresOSSAModules(requiresOSSAModules) {}
457-
457+
458458
// Check if all the provided file dependencies are up-to-date compared to
459459
// what's currently on disk.
460460
bool dependenciesAreUpToDate(StringRef modulePath,
@@ -524,7 +524,7 @@ class UpToDateModuleCheker {
524524
moduleBuffer = std::move(*OutBuf);
525525
return serializedASTBufferIsUpToDate(modulePath, *moduleBuffer, rebuildInfo, AllDeps);
526526
}
527-
527+
528528
enum class DependencyStatus {
529529
UpToDate,
530530
OutOfDate,
@@ -1513,7 +1513,8 @@ bool ModuleInterfaceLoader::buildSwiftModuleFromSwiftInterface(
15131513
static bool readSwiftInterfaceVersionAndArgs(
15141514
SourceManager &SM, DiagnosticEngine &Diags, llvm::StringSaver &ArgSaver,
15151515
SwiftInterfaceInfo &interfaceInfo, StringRef interfacePath,
1516-
SourceLoc diagnosticLoc, llvm::Triple preferredTarget) {
1516+
SourceLoc diagnosticLoc, llvm::Triple preferredTarget,
1517+
std::optional<llvm::Triple> preferredTargetVariant) {
15171518
llvm::vfs::FileSystem &fs = *SM.getFileSystem();
15181519
auto FileOrError = swift::vfs::getFileOrSTDIN(fs, interfacePath);
15191520
if (!FileOrError) {
@@ -1537,7 +1538,8 @@ static bool readSwiftInterfaceVersionAndArgs(
15371538

15381539
if (extractCompilerFlagsFromInterface(interfacePath, SB, ArgSaver,
15391540
interfaceInfo.Arguments,
1540-
preferredTarget)) {
1541+
preferredTarget,
1542+
preferredTargetVariant)) {
15411543
InterfaceSubContextDelegateImpl::diagnose(
15421544
interfacePath, diagnosticLoc, SM, &Diags,
15431545
diag::error_extracting_version_from_module_interface);
@@ -1592,7 +1594,7 @@ bool ModuleInterfaceLoader::buildExplicitSwiftModuleFromSwiftInterface(
15921594
StringRef outputPath, bool ShouldSerializeDeps,
15931595
ArrayRef<std::string> CompiledCandidates,
15941596
DependencyTracker *tracker) {
1595-
1597+
15961598
if (!Instance.getInvocation().getIRGenOptions().AlwaysCompile) {
15971599
// First, check if the expected output already exists and possibly
15981600
// up-to-date w.r.t. all of the dependencies it was built with. If so, early
@@ -1613,15 +1615,16 @@ bool ModuleInterfaceLoader::buildExplicitSwiftModuleFromSwiftInterface(
16131615
return false;
16141616
}
16151617
}
1616-
1618+
16171619
// Read out the compiler version.
16181620
llvm::BumpPtrAllocator alloc;
16191621
llvm::StringSaver ArgSaver(alloc);
16201622
SwiftInterfaceInfo InterfaceInfo;
16211623
readSwiftInterfaceVersionAndArgs(
16221624
Instance.getSourceMgr(), Instance.getDiags(), ArgSaver, InterfaceInfo,
16231625
interfacePath, SourceLoc(),
1624-
Instance.getInvocation().getLangOptions().Target);
1626+
Instance.getInvocation().getLangOptions().Target,
1627+
Instance.getInvocation().getLangOptions().TargetVariant);
16251628

16261629
auto Builder = ExplicitModuleInterfaceBuilder(
16271630
Instance, &Instance.getDiags(), Instance.getSourceMgr(),
@@ -1670,6 +1673,15 @@ void InterfaceSubContextDelegateImpl::inheritOptionsForBuildingInterface(
16701673
GenericArgs.push_back(triple);
16711674
}
16721675

1676+
if (LangOpts.TargetVariant.has_value()) {
1677+
genericSubInvocation.getLangOptions().TargetVariant = LangOpts.TargetVariant;
1678+
auto variantTriple = ArgSaver.save(genericSubInvocation.getLangOptions().TargetVariant->str());
1679+
if (!variantTriple.empty()) {
1680+
GenericArgs.push_back("-target-variant");
1681+
GenericArgs.push_back(variantTriple);
1682+
}
1683+
}
1684+
16731685
// Inherit the target SDK name and version
16741686
if (!LangOpts.SDKName.empty()) {
16751687
genericSubInvocation.getLangOptions().SDKName = LangOpts.SDKName;
@@ -1835,7 +1847,8 @@ bool InterfaceSubContextDelegateImpl::extractSwiftInterfaceVersionAndArgs(
18351847
StringRef interfacePath, SourceLoc diagnosticLoc) {
18361848
if (readSwiftInterfaceVersionAndArgs(SM, *Diags, ArgSaver, interfaceInfo,
18371849
interfacePath, diagnosticLoc,
1838-
subInvocation.getLangOptions().Target))
1850+
subInvocation.getLangOptions().Target,
1851+
subInvocation.getLangOptions().TargetVariant))
18391852
return true;
18401853

18411854
// Prior to Swift 5.9, swiftinterfaces were always built (accidentally) with

lib/Serialization/SerializedModuleLoader.cpp

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,10 +1379,19 @@ void swift::serialization::diagnoseSerializedASTLoadFailureTransitive(
13791379
}
13801380
}
13811381

1382+
static bool tripleNeedsSubarchitectureAdjustment(const llvm::Triple &lhs, const llvm::Triple &rhs) {
1383+
return (lhs.getSubArch() != rhs.getSubArch() &&
1384+
lhs.getArch() == rhs.getArch() &&
1385+
lhs.getVendor() == rhs.getVendor() &&
1386+
lhs.getOS() == rhs.getOS() &&
1387+
lhs.getEnvironment() == rhs.getEnvironment());
1388+
}
1389+
13821390
bool swift::extractCompilerFlagsFromInterface(
13831391
StringRef interfacePath, StringRef buffer, llvm::StringSaver &ArgSaver,
13841392
SmallVectorImpl<const char *> &SubArgs,
1385-
std::optional<llvm::Triple> PreferredTarget) {
1393+
std::optional<llvm::Triple> PreferredTarget,
1394+
std::optional<llvm::Triple> PreferredTargetVariant) {
13861395
SmallVector<StringRef, 1> FlagMatches;
13871396
auto FlagRe = llvm::Regex("^// swift-module-flags:(.*)$", llvm::Regex::Newline);
13881397
if (!FlagRe.match(buffer, &FlagMatches))
@@ -1395,19 +1404,19 @@ bool swift::extractCompilerFlagsFromInterface(
13951404
// we have loaded a Swift interface from a different-but-compatible
13961405
// architecture slice. Use the compatible subarchitecture.
13971406
for (unsigned I = 1; I < SubArgs.size(); ++I) {
1398-
// FIXME: Also fix up -target-variant (rdar://135322077).
1399-
if (strcmp(SubArgs[I - 1], "-target") != 0) {
1400-
continue;
1407+
if (strcmp(SubArgs[I - 1], "-target") == 0) {
1408+
llvm::Triple target(SubArgs[I]);
1409+
if (PreferredTarget &&
1410+
tripleNeedsSubarchitectureAdjustment(target, *PreferredTarget))
1411+
target.setArch(PreferredTarget->getArch(), PreferredTarget->getSubArch());
1412+
SubArgs[I] = ArgSaver.save(target.str()).data();
1413+
} else if (strcmp(SubArgs[I - 1], "-target-variant") == 0) {
1414+
llvm::Triple targetVariant(SubArgs[I]);
1415+
if (PreferredTargetVariant &&
1416+
tripleNeedsSubarchitectureAdjustment(targetVariant, *PreferredTargetVariant))
1417+
targetVariant.setArch(PreferredTargetVariant->getArch(), PreferredTargetVariant->getSubArch());
1418+
SubArgs[I] = ArgSaver.save(targetVariant.str()).data();
14011419
}
1402-
llvm::Triple target(SubArgs[I]);
1403-
if (PreferredTarget &&
1404-
target.getSubArch() != PreferredTarget->getSubArch() &&
1405-
target.getArch() == PreferredTarget->getArch() &&
1406-
target.getVendor() == PreferredTarget->getVendor() &&
1407-
target.getOS() == PreferredTarget->getOS() &&
1408-
target.getEnvironment() == PreferredTarget->getEnvironment())
1409-
target.setArch(PreferredTarget->getArch(), PreferredTarget->getSubArch());
1410-
SubArgs[I] = ArgSaver.save(target.str()).data();
14111420
}
14121421

14131422
SmallVector<StringRef, 1> IgnFlagMatches;

0 commit comments

Comments
 (0)