Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -1837,6 +1837,27 @@ } AddAAPCSVolatileBitfieldArgs(Args, CmdArgs); + + if (const Arg *A = Args.getLastArg(clang::driver::options::OPT_mtune_EQ)) { + StringRef Name = A->getValue(); + + std::string TuneCPU; + if (Name == "native") { + Name = llvm::sys::getHostCPUName(); + if (!Name.empty()) + TuneCPU = std::string(Name); + else + TuneCPU = "generic"; + } else + TuneCPU = std::string(Name); + + CmdArgs.push_back("-tune-cpu"); + CmdArgs.push_back(Args.MakeArgString(TuneCPU)); + } + else if (!Args.getLastArg(clang::driver::options::OPT_mcpu_EQ)) { + CmdArgs.push_back("-tune-cpu"); + CmdArgs.push_back("generic"); + } } void Clang::AddMIPSTargetArgs(const ArgList &Args, Index: clang/test/Driver/aarch64-mtune.c =================================================================== --- /dev/null +++ clang/test/Driver/aarch64-mtune.c @@ -0,0 +1,42 @@ +// Ensure we support the -mtune flag. + +// Default mtune should be generic. +// RUN: %clang -target aarch64-unknown-unknown -c -### %s 2>&1 \ +// RUN: | FileCheck %s -check-prefix=notune +// notune: "-tune-cpu" "generic" + +// RUN: %clang -target aarch64-unknown-unknown -c -### %s -mtune=generic 2>&1 \ +// RUN: | FileCheck %s -check-prefix=generic +// generic: "-tune-cpu" "generic" + +// RUN: %clang -target aarch64-unknown-unknown -c -### %s -mtune=neoverse-n1 2>&1 \ +// RUN: | FileCheck %s -check-prefix=neoverse-n1 +// neoverse-n1: "-tune-cpu" "neoverse-n1" + +// RUN: %clang -target aarch64-unknown-unknown -c -### %s -mtune=thunderx2t99 2>&1 \ +// RUN: | FileCheck %s -check-prefix=thunderx2t99 +// thunderx2t99: "-tune-cpu" "thunderx2t99" + +// Check interaction between march and mtune. + +// RUN: %clang -target aarch64-unknown-unknown -c -### %s -march=armv8-a 2>&1 \ +// RUN: | FileCheck %s -check-prefix=marcharmv8a +// marcharmv8a: "-target-cpu" "generic" +// marcharmv8a: "-tune-cpu" "generic" + +// RUN: %clang -target aarch64-unknown-unknown -c -### %s -march=armv8-a -mtune=cortex-a75 2>&1 \ +// RUN: | FileCheck %s -check-prefix=marcharmv8a-a75 +// marcharmv8a-a75: "-target-cpu" "generic" +// marcharmv8a-a75: "-tune-cpu" "cortex-a75" + +// Check interaction between mcpu and mtune. + +// RUN: %clang -target aarch64-unknown-unknown -c -### %s -mcpu=thunderx 2>&1 \ +// RUN: | FileCheck %s -check-prefix=mcputhunderx +// mcputhunderx: "-target-cpu" "thunderx" +// mcputhunderx-NOT: "-tune-cpu" + +// RUN: %clang -target aarch64-unknown-unknown -c -### %s -mcpu=cortex-a75 -mtune=cortex-a57 2>&1 \ +// RUN: | FileCheck %s -check-prefix=mcpua75-mtunea57 +// mcpua75-mtunea57: "-target-cpu" "cortex-a75" +// mcpua75-mtunea57: "-tune-cpu" "cortex-a57"