IRGen: Honor -target-variant flag for zippered macCatalyst binaries.

This commit is contained in:
Allan Shortlidge
2024-07-19 16:13:33 -07:00
parent cbb9b80378
commit bb8a837dcf
5 changed files with 48 additions and 1 deletions

View File

@@ -869,6 +869,22 @@ importer::addCommonInvocationArguments(
invocationArgStrs.push_back("-mcx16"); invocationArgStrs.push_back("-mcx16");
} }
if (triple.isOSDarwin()) {
if (auto variantTriple = ctx.LangOpts.TargetVariant) {
// Passing the -target-variant along to clang causes clang's
// CodeGenerator to emit zippered .o files.
invocationArgStrs.push_back("-darwin-target-variant");
invocationArgStrs.push_back(variantTriple->str());
}
if (ctx.LangOpts.VariantSDKVersion) {
invocationArgStrs.push_back("-Xclang");
invocationArgStrs.push_back(
("-darwin-target-variant-sdk-version=" +
ctx.LangOpts.VariantSDKVersion->getAsString()));
}
}
if (std::optional<StringRef> R = ctx.SearchPathOpts.getWinSDKRoot()) { if (std::optional<StringRef> R = ctx.SearchPathOpts.getWinSDKRoot()) {
invocationArgStrs.emplace_back("-Xmicrosoft-windows-sdk-root"); invocationArgStrs.emplace_back("-Xmicrosoft-windows-sdk-root");
invocationArgStrs.emplace_back(*R); invocationArgStrs.emplace_back(*R);

View File

@@ -1030,6 +1030,22 @@ static void initLLVMModule(const IRGenModule &IGM, SILModule &SIL) {
assert(Module->getSDKVersion() == *IGM.Context.LangOpts.SDKVersion); assert(Module->getSDKVersion() == *IGM.Context.LangOpts.SDKVersion);
} }
if (!IGM.VariantTriple.str().empty()) {
if (Module->getDarwinTargetVariantTriple().empty()) {
Module->setDarwinTargetVariantTriple(IGM.VariantTriple.str());
} else {
assert(Module->getDarwinTargetVariantTriple() == IGM.VariantTriple.str());
}
}
if (IGM.Context.LangOpts.VariantSDKVersion) {
if (Module->getDarwinTargetVariantSDKVersion().empty())
Module->setDarwinTargetVariantSDKVersion(*IGM.Context.LangOpts.VariantSDKVersion);
else
assert(Module->getDarwinTargetVariantSDKVersion() ==
*IGM.Context.LangOpts.VariantSDKVersion);
}
// Set the module's string representation. // Set the module's string representation.
Module->setDataLayout(IGM.DataLayout.getStringRepresentation()); Module->setDataLayout(IGM.DataLayout.getStringRepresentation());

View File

@@ -220,7 +220,9 @@ IRGenModule::IRGenModule(IRGenerator &irgen,
ModuleName, PrivateDiscriminator)), ModuleName, PrivateDiscriminator)),
Module(*ClangCodeGen->GetModule()), Module(*ClangCodeGen->GetModule()),
DataLayout(irgen.getClangDataLayoutString()), DataLayout(irgen.getClangDataLayoutString()),
Triple(irgen.getEffectiveClangTriple()), TargetMachine(std::move(target)), Triple(irgen.getEffectiveClangTriple()),
VariantTriple(irgen.getEffectiveClangVariantTriple()),
TargetMachine(std::move(target)),
silConv(irgen.SIL), OutputFilename(OutputFilename), silConv(irgen.SIL), OutputFilename(OutputFilename),
MainInputFilenameForDebugInfo(MainInputFilenameForDebugInfo), MainInputFilenameForDebugInfo(MainInputFilenameForDebugInfo),
TargetInfo(SwiftTargetInfo::get(*this)), DebugInfo(nullptr), TargetInfo(SwiftTargetInfo::get(*this)), DebugInfo(nullptr),
@@ -2229,6 +2231,13 @@ llvm::Triple IRGenerator::getEffectiveClangTriple() {
return llvm::Triple(CI->getTargetInfo().getTargetOpts().Triple); return llvm::Triple(CI->getTargetInfo().getTargetOpts().Triple);
} }
llvm::Triple IRGenerator::getEffectiveClangVariantTriple() {
auto CI = static_cast<ClangImporter *>(
&*SIL.getASTContext().getClangModuleLoader());
assert(CI && "no clang module loader");
return llvm::Triple(CI->getTargetInfo().getTargetOpts().DarwinTargetVariantTriple);
}
const llvm::StringRef IRGenerator::getClangDataLayoutString() { const llvm::StringRef IRGenerator::getClangDataLayoutString() {
return static_cast<ClangImporter *>( return static_cast<ClangImporter *>(
SIL.getASTContext().getClangModuleLoader()) SIL.getASTContext().getClangModuleLoader())

View File

@@ -554,6 +554,9 @@ public:
/// Return the effective triple used by clang. /// Return the effective triple used by clang.
llvm::Triple getEffectiveClangTriple(); llvm::Triple getEffectiveClangTriple();
/// Return the effective variant triple used by clang.
llvm::Triple getEffectiveClangVariantTriple();
const llvm::StringRef getClangDataLayoutString(); const llvm::StringRef getClangDataLayoutString();
}; };
@@ -658,6 +661,7 @@ public:
llvm::Module &Module; llvm::Module &Module;
const llvm::DataLayout DataLayout; const llvm::DataLayout DataLayout;
const llvm::Triple Triple; const llvm::Triple Triple;
const llvm::Triple VariantTriple;
std::unique_ptr<llvm::TargetMachine> TargetMachine; std::unique_ptr<llvm::TargetMachine> TargetMachine;
ModuleDecl *getSwiftModule() const; ModuleDecl *getSwiftModule() const;
AvailabilityContext getAvailabilityContext() const; AvailabilityContext getAvailabilityContext() const;

View File

@@ -5,3 +5,5 @@
public func test() { } public func test() { }
// CHECK: "SDK Version", [3 x i32] [i32 10, i32 15, i32 4] // CHECK: "SDK Version", [3 x i32] [i32 10, i32 15, i32 4]
// CHECK: "darwin.target_variant.triple", !"{{.*}}-apple-ios13.1-macabi"
// CHECK: "darwin.target_variant.SDK Version", [2 x i32] [i32 13, i32 4]