Skip to content

Commit bb8a837

Browse files
committed
IRGen: Honor -target-variant flag for zippered macCatalyst binaries.
1 parent cbb9b80 commit bb8a837

File tree

5 files changed

+48
-1
lines changed

5 files changed

+48
-1
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,22 @@ importer::addCommonInvocationArguments(
869869
invocationArgStrs.push_back("-mcx16");
870870
}
871871

872+
if (triple.isOSDarwin()) {
873+
if (auto variantTriple = ctx.LangOpts.TargetVariant) {
874+
// Passing the -target-variant along to clang causes clang's
875+
// CodeGenerator to emit zippered .o files.
876+
invocationArgStrs.push_back("-darwin-target-variant");
877+
invocationArgStrs.push_back(variantTriple->str());
878+
}
879+
880+
if (ctx.LangOpts.VariantSDKVersion) {
881+
invocationArgStrs.push_back("-Xclang");
882+
invocationArgStrs.push_back(
883+
("-darwin-target-variant-sdk-version=" +
884+
ctx.LangOpts.VariantSDKVersion->getAsString()));
885+
}
886+
}
887+
872888
if (std::optional<StringRef> R = ctx.SearchPathOpts.getWinSDKRoot()) {
873889
invocationArgStrs.emplace_back("-Xmicrosoft-windows-sdk-root");
874890
invocationArgStrs.emplace_back(*R);

lib/IRGen/IRGen.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,6 +1030,22 @@ static void initLLVMModule(const IRGenModule &IGM, SILModule &SIL) {
10301030
assert(Module->getSDKVersion() == *IGM.Context.LangOpts.SDKVersion);
10311031
}
10321032

1033+
if (!IGM.VariantTriple.str().empty()) {
1034+
if (Module->getDarwinTargetVariantTriple().empty()) {
1035+
Module->setDarwinTargetVariantTriple(IGM.VariantTriple.str());
1036+
} else {
1037+
assert(Module->getDarwinTargetVariantTriple() == IGM.VariantTriple.str());
1038+
}
1039+
}
1040+
1041+
if (IGM.Context.LangOpts.VariantSDKVersion) {
1042+
if (Module->getDarwinTargetVariantSDKVersion().empty())
1043+
Module->setDarwinTargetVariantSDKVersion(*IGM.Context.LangOpts.VariantSDKVersion);
1044+
else
1045+
assert(Module->getDarwinTargetVariantSDKVersion() ==
1046+
*IGM.Context.LangOpts.VariantSDKVersion);
1047+
}
1048+
10331049
// Set the module's string representation.
10341050
Module->setDataLayout(IGM.DataLayout.getStringRepresentation());
10351051

lib/IRGen/IRGenModule.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,9 @@ IRGenModule::IRGenModule(IRGenerator &irgen,
220220
ModuleName, PrivateDiscriminator)),
221221
Module(*ClangCodeGen->GetModule()),
222222
DataLayout(irgen.getClangDataLayoutString()),
223-
Triple(irgen.getEffectiveClangTriple()), TargetMachine(std::move(target)),
223+
Triple(irgen.getEffectiveClangTriple()),
224+
VariantTriple(irgen.getEffectiveClangVariantTriple()),
225+
TargetMachine(std::move(target)),
224226
silConv(irgen.SIL), OutputFilename(OutputFilename),
225227
MainInputFilenameForDebugInfo(MainInputFilenameForDebugInfo),
226228
TargetInfo(SwiftTargetInfo::get(*this)), DebugInfo(nullptr),
@@ -2229,6 +2231,13 @@ llvm::Triple IRGenerator::getEffectiveClangTriple() {
22292231
return llvm::Triple(CI->getTargetInfo().getTargetOpts().Triple);
22302232
}
22312233

2234+
llvm::Triple IRGenerator::getEffectiveClangVariantTriple() {
2235+
auto CI = static_cast<ClangImporter *>(
2236+
&*SIL.getASTContext().getClangModuleLoader());
2237+
assert(CI && "no clang module loader");
2238+
return llvm::Triple(CI->getTargetInfo().getTargetOpts().DarwinTargetVariantTriple);
2239+
}
2240+
22322241
const llvm::StringRef IRGenerator::getClangDataLayoutString() {
22332242
return static_cast<ClangImporter *>(
22342243
SIL.getASTContext().getClangModuleLoader())

lib/IRGen/IRGenModule.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,9 @@ class IRGenerator {
554554
/// Return the effective triple used by clang.
555555
llvm::Triple getEffectiveClangTriple();
556556

557+
/// Return the effective variant triple used by clang.
558+
llvm::Triple getEffectiveClangVariantTriple();
559+
557560
const llvm::StringRef getClangDataLayoutString();
558561
};
559562

@@ -658,6 +661,7 @@ class IRGenModule {
658661
llvm::Module &Module;
659662
const llvm::DataLayout DataLayout;
660663
const llvm::Triple Triple;
664+
const llvm::Triple VariantTriple;
661665
std::unique_ptr<llvm::TargetMachine> TargetMachine;
662666
ModuleDecl *getSwiftModule() const;
663667
AvailabilityContext getAvailabilityContext() const;

test/IRGen/macosx-variant-sdk-version.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55
public func test() { }
66

77
// CHECK: "SDK Version", [3 x i32] [i32 10, i32 15, i32 4]
8+
// CHECK: "darwin.target_variant.triple", !"{{.*}}-apple-ios13.1-macabi"
9+
// CHECK: "darwin.target_variant.SDK Version", [2 x i32] [i32 13, i32 4]

0 commit comments

Comments
 (0)