drodriguez created this revision. drodriguez added reviewers: bc-lee, MaskRay, arphaman. Herald added a subscriber: StephenFan. Herald added a project: All. drodriguez requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
D121868 <https://reviews.llvm.org/D121868> provided support for -darwin-target-variant-triple, but the support for -darwin-target-variant-sdk-version was still missing for cc1as. These changes build upon the previous and provides such support. - Extracted the common code to handle -darwin-target-variant-triple and -darwin-target-variant-sdk-version in the Darwin toolchain to a method that can be used for both the cc1 and the cc1as job construction. cc1as does not support some of the parameters that were provided to cc1, so the same code cannot be used for both. - Invoke that new common code when constructing a cc1as invocation. - Parse the new -darwin-target-variant-sdk-version in the cc1as driver. Apply its value to the MCObjectFileInfo to generate the right values in the object files. - Includes two new tests that check that cc1as uses the provided values in -darwin-target-variant-sdk and that the Clang driver creates the jobs with the correct arguments. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D135729 Files: clang/include/clang/Driver/ToolChain.h clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Driver/ToolChains/Clang.h clang/lib/Driver/ToolChains/Darwin.cpp clang/lib/Driver/ToolChains/Darwin.h clang/test/Driver/clang-cc1as-target-variant.s clang/test/Misc/cc1as-darwin-target-variant-sdk-version.s clang/tools/driver/cc1as_main.cpp
Index: clang/tools/driver/cc1as_main.cpp =================================================================== --- clang/tools/driver/cc1as_main.cpp +++ clang/tools/driver/cc1as_main.cpp @@ -151,6 +151,10 @@ /// Darwin target variant triple, the variant of the deployment target /// for which the code is being compiled. llvm::Optional<llvm::Triple> DarwinTargetVariantTriple; + + /// The version of the darwin target variant SDK which was used during the + /// compilation + llvm::VersionTuple DarwinTargetVariantSDKVersion; /// @} public: @@ -220,6 +224,14 @@ Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple)); if (Arg *A = Args.getLastArg(options::OPT_darwin_target_variant_triple)) Opts.DarwinTargetVariantTriple = llvm::Triple(A->getValue()); + if (Arg *A = Args.getLastArg(OPT_darwin_target_variant_sdk_version_EQ)) { + VersionTuple Version; + if (Version.tryParse(A->getValue())) + Diags.Report(diag::err_drv_invalid_value) + << A->getAsString(Args) << A->getValue(); + else + Opts.DarwinTargetVariantSDKVersion = Version; + } Opts.CPU = std::string(Args.getLastArgValue(OPT_target_cpu)); Opts.Features = Args.getAllArgValues(OPT_target_feature); @@ -433,6 +445,8 @@ TheTarget->createMCObjectFileInfo(Ctx, PIC)); if (Opts.DarwinTargetVariantTriple) MOFI->setDarwinTargetVariantTriple(*Opts.DarwinTargetVariantTriple); + if (!Opts.DarwinTargetVariantSDKVersion.empty()) + MOFI->setDarwinTargetVariantSDKVersion(Opts.DarwinTargetVariantSDKVersion); Ctx.setObjectFileInfo(MOFI.get()); if (Opts.SaveTemporaryLabels) Index: clang/test/Misc/cc1as-darwin-target-variant-sdk-version.s =================================================================== --- /dev/null +++ clang/test/Misc/cc1as-darwin-target-variant-sdk-version.s @@ -0,0 +1,34 @@ +// Run cc1as using darwin-target-variant-sdk-version +// REQUIRES: x86-registered-target +// RUN: %clang -cc1as -triple x86_64-apple-macos10.9 -darwin-target-variant-triple x86_64-apple-ios13.1-macabi -target-sdk-version=11.1 -darwin-target-variant-sdk-version=14.1 -filetype obj %s -o - \ +// RUN: | llvm-readobj --file-headers --macho-version-min - \ +// RUN: | FileCheck --check-prefix=CHECK %s + +// CHECK: File: <stdin> +// CHECK-NEXT: Format: Mach-O 64-bit x86-64 +// CHECK-NEXT: Arch: x86_64 +// CHECK-NEXT: AddressSize: 64bit +// CHECK-NEXT: MachHeader { +// CHECK-NEXT: Magic: Magic64 (0xFEEDFACF) +// CHECK-NEXT: CpuType: X86-64 (0x1000007) +// CHECK-NEXT: CpuSubType: CPU_SUBTYPE_X86_64_ALL (0x3) +// CHECK-NEXT: FileType: Relocatable (0x1) +// CHECK-NEXT: NumOfLoadCommands: 3 +// CHECK-NEXT: SizeOfLoadCommands: 192 +// CHECK-NEXT: Flags [ (0x0) +// CHECK-NEXT: ] +// CHECK-NEXT: Reserved: 0x0 +// CHECK-NEXT: } +// CHECK-NEXT: MinVersion { +// CHECK-NEXT: Cmd: LC_VERSION_MIN_MACOSX +// CHECK-NEXT: Size: 16 +// CHECK-NEXT: Version: 10.9 +// CHECK-NEXT: SDK: n/a +// CHECK-NEXT: } +// CHECK-NEXT: MinVersion { +// CHECK-NEXT: Cmd: LC_BUILD_VERSION +// CHECK-NEXT: Size: 24 +// CHECK-NEXT: Platform: macCatalyst +// CHECK-NEXT: Version: 13.1 +// CHECK-NEXT: SDK: 14.1 +// CHECK-NEXT: } Index: clang/test/Driver/clang-cc1as-target-variant.s =================================================================== --- /dev/null +++ clang/test/Driver/clang-cc1as-target-variant.s @@ -0,0 +1,33 @@ +// RUN: touch %t.S + +// RUN: %clang -target x86_64-apple-ios13.1-macabi -darwin-target-variant x86_64-apple-macos10.15 -isysroot %S/Inputs/MacOSX10.15.versioned.sdk -mlinker-version=520 -### %t.S 2>&1 \ +// RUN: | FileCheck %s + +// RUN: %clang -target x86_64-apple-ios-macabi -mmacos-version-min=10.15 -isysroot %S/Inputs/MacOSX10.15.versioned.sdk -mlinker-version=520 -### %t.S 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-SDK-INFO %s + +// RUN: %clang -target x86_64-apple-ios-macabi -mmacos-version-min=10.15 -darwin-target-variant x86_64-apple-macos -isysroot %S/Inputs/MacOSX10.15.versioned.sdk -mlinker-version=520 -### %t.S 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VARIANT-SDK-INFO %s + +// RUN: %clang -target x86_64-apple-macos -mmacos-version-min=10.15 -darwin-target-variant x86_64-apple-ios-macabi -isysroot %S/Inputs/MacOSX10.15.versioned.sdk -mlinker-version=520 -### %t.S 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-VARIANT-SDK-INFO-INV %s + +// CHECK: "-cc1as" +// CHECK-SAME: "-triple" "x86_64-apple-ios13.1.0-macabi" +// CHECK-SAME: "-darwin-target-variant-triple" "x86_64-apple-macos10.15" + +// CHECK-SDK-INFO: "-cc1as" +// CHECK-SDK-INFO-SAME: "-triple" "x86_64-apple-ios13.1.0-macabi" +// CHECK-SDK-INFO-SAME: "-target-sdk-version=13.1" + +// CHECK-VARIANT-SDK-INFO: "-cc1as" +// CHECK-VARIANT-SDK-INFO-SAME: "-triple" "x86_64-apple-ios13.1.0-macabi" +// CHECK-VARIANT-SDK-INFO-SAME: "-darwin-target-variant-triple" "x86_64-apple-macos" +// CHECK-VARIANT-SDK-INFO-SAME: "-target-sdk-version=13.1" +// CHECK-VARIANT-SDK-INFO-SAME: "-darwin-target-variant-sdk-version=10.15" + +// CHECK-VARIANT-SDK-INFO-INV: "-cc1as" +// CHECK-VARIANT-SDK-INFO-INV-SAME: "-triple" "x86_64-apple-macosx10.15.0" +// CHECK-VARIANT-SDK-INFO-INV-SAME: "-darwin-target-variant-triple" "x86_64-apple-ios-macabi" +// CHECK-VARIANT-SDK-INFO-INV-SAME: "-target-sdk-version=10.15" +// CHECK-VARIANT-SDK-INFO-INV-SAME: "-darwin-target-variant-sdk-version=13.1" Index: clang/lib/Driver/ToolChains/Darwin.h =================================================================== --- clang/lib/Driver/ToolChains/Darwin.h +++ clang/lib/Driver/ToolChains/Darwin.h @@ -496,11 +496,11 @@ : TargetVersion) < VersionTuple(V0, V1, V2); } - /// Returns the darwin target variant triple, the variant of the deployment - /// target for which the code is being compiled. - Optional<llvm::Triple> getTargetVariantTriple() const override { - return TargetVariantTriple; - } + /// Adds the necessary arguments to CC1Args to handle the different cases + /// of variant targets in Darwin. To be used to construct invocations to + /// cc1 and cc1as. + void addClangTargetVariantOptions(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const; protected: /// Return true if c++17 aligned allocation/deallocation functions are not Index: clang/lib/Driver/ToolChains/Darwin.cpp =================================================================== --- clang/lib/Driver/ToolChains/Darwin.cpp +++ clang/lib/Driver/ToolChains/Darwin.cpp @@ -2793,6 +2793,23 @@ isAlignedAllocationUnavailable()) CC1Args.push_back("-faligned-alloc-unavailable"); + addClangTargetVariantOptions(DriverArgs, CC1Args); + + // Enable compatibility mode for NSItemProviderCompletionHandler in + // Foundation/NSItemProvider.h. + CC1Args.push_back("-fcompatibility-qualified-id-block-type-checking"); + + // Give static local variables in inline functions hidden visibility when + // -fvisibility-inlines-hidden is enabled. + if (!DriverArgs.getLastArgNoClaim( + options::OPT_fvisibility_inlines_hidden_static_local_var, + options::OPT_fno_visibility_inlines_hidden_static_local_var)) + CC1Args.push_back("-fvisibility-inlines-hidden-static-local-var"); +} + +void Darwin::addClangTargetVariantOptions( + const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const { if (TargetVariantTriple) { CC1Args.push_back("-darwin-target-variant-triple"); CC1Args.push_back( @@ -2843,17 +2860,6 @@ } } } - - // Enable compatibility mode for NSItemProviderCompletionHandler in - // Foundation/NSItemProvider.h. - CC1Args.push_back("-fcompatibility-qualified-id-block-type-checking"); - - // Give static local variables in inline functions hidden visibility when - // -fvisibility-inlines-hidden is enabled. - if (!DriverArgs.getLastArgNoClaim( - options::OPT_fvisibility_inlines_hidden_static_local_var, - options::OPT_fno_visibility_inlines_hidden_static_local_var)) - CC1Args.push_back("-fvisibility-inlines-hidden-static-local-var"); } DerivedArgList * Index: clang/lib/Driver/ToolChains/Clang.h =================================================================== --- clang/lib/Driver/ToolChains/Clang.h +++ clang/lib/Driver/ToolChains/Clang.h @@ -131,6 +131,8 @@ llvm::opt::ArgStringList &CmdArgs) const; void AddRISCVTargetArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; + void AddDarwinTargetArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const; bool hasGoodDiagnostics() const override { return true; } bool hasIntegratedAssembler() const override { return false; } bool hasIntegratedCPP() const override { return false; } Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -21,6 +21,7 @@ #include "Arch/VE.h" #include "Arch/X86.h" #include "CommonArgs.h" +#include "Darwin.h" #include "Hexagon.h" #include "MSP430.h" #include "PS4CPU.h" @@ -7886,6 +7887,12 @@ CmdArgs.push_back(ABIName.data()); } +void ClangAs::AddDarwinTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + const auto &TC = static_cast<const toolchains::Darwin &>(getToolChain()); + TC.addClangTargetVariantOptions(Args, CmdArgs); +} + void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &Args, @@ -7897,8 +7904,6 @@ const llvm::Triple &Triple = getToolChain().getEffectiveTriple(); const std::string &TripleStr = Triple.getTriple(); - const Optional<llvm::Triple> TargetVariantTriple = - getToolChain().getTargetVariantTriple(); const auto &D = getToolChain().getDriver(); // Don't warn about "clang -w -c foo.s" @@ -7916,10 +7921,8 @@ // Add the "effective" target triple. CmdArgs.push_back("-triple"); CmdArgs.push_back(Args.MakeArgString(TripleStr)); - if (TargetVariantTriple) { - CmdArgs.push_back("-darwin-target-variant-triple"); - CmdArgs.push_back(Args.MakeArgString(TargetVariantTriple->getTriple())); - } + if (Triple.isOSDarwin()) + AddDarwinTargetArgs(Args, CmdArgs); // Set the output mode, we currently only expect to be used as a real // assembler. Index: clang/include/clang/Driver/ToolChain.h =================================================================== --- clang/include/clang/Driver/ToolChain.h +++ clang/include/clang/Driver/ToolChain.h @@ -750,10 +750,6 @@ return llvm::DenormalMode::getIEEE(); } - virtual Optional<llvm::Triple> getTargetVariantTriple() const { - return llvm::None; - } - // We want to expand the shortened versions of the triples passed in to // the values used for the bitcode libraries. static llvm::Triple getOpenMPTriple(StringRef TripleStr) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits