Skip to content

Commit f693280

Browse files
bc-leenico
authored andcommitted
[cc1as] Add support for emitting the build version load command for -darwin-target-variant
This patch extends cc1as to export the build version load command with LC_VERSION_MIN_MACOSX. This is especially important for Mac Catalyst as Mac Catalyst uses the MacOS's compiler rt built-ins. Differential Revision: https://reviews.llvm.org/D121868
1 parent e1afae0 commit f693280

File tree

6 files changed

+67
-4
lines changed

6 files changed

+67
-4
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4854,16 +4854,21 @@ def target_abi : Separate<["-"], "target-abi">,
48544854
MarshallingInfoString<TargetOpts<"ABI">>;
48554855
def target_sdk_version_EQ : Joined<["-"], "target-sdk-version=">,
48564856
HelpText<"The version of target SDK used for compilation">;
4857-
def darwin_target_variant_triple : Separate<["-"], "darwin-target-variant-triple">,
4858-
HelpText<"Specify the darwin target variant triple">,
4859-
MarshallingInfoString<TargetOpts<"DarwinTargetVariantTriple">>,
4860-
Normalizer<"normalizeTriple">;
48614857
def darwin_target_variant_sdk_version_EQ : Joined<["-"],
48624858
"darwin-target-variant-sdk-version=">,
48634859
HelpText<"The version of darwin target variant SDK used for compilation">;
48644860

48654861
} // let Flags = [CC1Option, CC1AsOption, NoDriverOption]
48664862

4863+
let Flags = [CC1Option, CC1AsOption] in {
4864+
4865+
def darwin_target_variant_triple : Separate<["-"], "darwin-target-variant-triple">,
4866+
HelpText<"Specify the darwin target variant triple">,
4867+
MarshallingInfoString<TargetOpts<"DarwinTargetVariantTriple">>,
4868+
Normalizer<"normalizeTriple">;
4869+
4870+
} // let Flags = [CC1Option, CC1AsOption]
4871+
48674872
//===----------------------------------------------------------------------===//
48684873
// Target Options (cc1 + cc1as + fc1)
48694874
//===----------------------------------------------------------------------===//

clang/include/clang/Driver/ToolChain.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,10 @@ class ToolChain {
717717
return llvm::DenormalMode::getIEEE();
718718
}
719719

720+
virtual Optional<llvm::Triple> getTargetVariantTriple() const {
721+
return llvm::None;
722+
}
723+
720724
// We want to expand the shortened versions of the triples passed in to
721725
// the values used for the bitcode libraries.
722726
static llvm::Triple getOpenMPTriple(StringRef TripleStr) {

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7721,6 +7721,8 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
77217721

77227722
const llvm::Triple &Triple = getToolChain().getEffectiveTriple();
77237723
const std::string &TripleStr = Triple.getTriple();
7724+
const Optional<llvm::Triple> TargetVariantTriple =
7725+
getToolChain().getTargetVariantTriple();
77247726
const auto &D = getToolChain().getDriver();
77257727

77267728
// Don't warn about "clang -w -c foo.s"
@@ -7738,6 +7740,10 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
77387740
// Add the "effective" target triple.
77397741
CmdArgs.push_back("-triple");
77407742
CmdArgs.push_back(Args.MakeArgString(TripleStr));
7743+
if (TargetVariantTriple) {
7744+
CmdArgs.push_back("-darwin-target-variant-triple");
7745+
CmdArgs.push_back(Args.MakeArgString(TargetVariantTriple->getTriple()));
7746+
}
77417747

77427748
// Set the output mode, we currently only expect to be used as a real
77437749
// assembler.

clang/lib/Driver/ToolChains/Darwin.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,12 @@ class LLVM_LIBRARY_VISIBILITY Darwin : public MachO {
489489
: TargetVersion) < VersionTuple(V0, V1, V2);
490490
}
491491

492+
/// Returns the darwin target variant triple, the variant of the deployment
493+
/// target for which the code is being compiled.
494+
Optional<llvm::Triple> getTargetVariantTriple() const override {
495+
return TargetVariantTriple;
496+
}
497+
492498
protected:
493499
/// Return true if c++17 aligned allocation/deallocation functions are not
494500
/// implemented in the c++ standard library of the deployment target we are
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Run cc1as using darwin-target-variant-triple
2+
// REQUIRES: x86-registered-target
3+
// RUN: %clang -cc1as -triple x86_64-apple-macos10.9 -darwin-target-variant-triple x86_64-apple-ios13.1-macabi -filetype obj %s -o - \
4+
// RUN: | llvm-readobj --file-headers --macho-version-min - \
5+
// RUN: | FileCheck --check-prefix=CHECK %s
6+
7+
// CHECK: File: <stdin>
8+
// CHECK-NEXT: Format: Mach-O 64-bit x86-64
9+
// CHECK-NEXT: Arch: x86_64
10+
// CHECK-NEXT: AddressSize: 64bit
11+
// CHECK-NEXT: MachHeader {
12+
// CHECK-NEXT: Magic: Magic64 (0xFEEDFACF)
13+
// CHECK-NEXT: CpuType: X86-64 (0x1000007)
14+
// CHECK-NEXT: CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3)
15+
// CHECK-NEXT: FileType: Relocatable (0x1)
16+
// CHECK-NEXT: NumOfLoadCommands: 3
17+
// CHECK-NEXT: SizeOfLoadCommands: 192
18+
// CHECK-NEXT: Flags [ (0x0)
19+
// CHECK-NEXT: ]
20+
// CHECK-NEXT: Reserved: 0x0
21+
// CHECK-NEXT: }
22+
// CHECK-NEXT: MinVersion {
23+
// CHECK-NEXT: Cmd: LC_VERSION_MIN_MACOSX
24+
// CHECK-NEXT: Size: 16
25+
// CHECK-NEXT: Version: 10.9
26+
// CHECK-NEXT: SDK: n/a
27+
// CHECK-NEXT: }
28+
// CHECK-NEXT: MinVersion {
29+
// CHECK-NEXT: Cmd: LC_BUILD_VERSION
30+
// CHECK-NEXT: Size: 24
31+
// CHECK-NEXT: Platform: macCatalyst
32+
// CHECK-NEXT: Version: 13.1
33+
// CHECK-NEXT: SDK: n/a
34+
// CHECK-NEXT: }

clang/tools/driver/cc1as_main.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@ struct AssemblerInvocation {
144144
/// otherwise.
145145
std::string TargetABI;
146146

147+
/// Darwin target variant triple, the variant of the deployment target
148+
/// for which the code is being compiled.
149+
llvm::Optional<llvm::Triple> DarwinTargetVariantTriple;
147150
/// @}
148151

149152
public:
@@ -209,6 +212,9 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
209212

210213
// Target Options
211214
Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
215+
if (Arg *A = Args.getLastArg(options::OPT_darwin_target_variant_triple))
216+
Opts.DarwinTargetVariantTriple = llvm::Triple(A->getValue());
217+
212218
Opts.CPU = std::string(Args.getLastArgValue(OPT_target_cpu));
213219
Opts.Features = Args.getAllArgValues(OPT_target_feature);
214220

@@ -407,6 +413,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
407413
// MCObjectFileInfo needs a MCContext reference in order to initialize itself.
408414
std::unique_ptr<MCObjectFileInfo> MOFI(
409415
TheTarget->createMCObjectFileInfo(Ctx, PIC));
416+
if (Opts.DarwinTargetVariantTriple)
417+
MOFI->setDarwinTargetVariantTriple(*Opts.DarwinTargetVariantTriple);
410418
Ctx.setObjectFileInfo(MOFI.get());
411419

412420
if (Opts.SaveTemporaryLabels)

0 commit comments

Comments
 (0)