[clang] [Clang][AArch64] Extract get target CPU by triple (NFC) (PR #179097)
Tomer Shafir via cfe-commits
cfe-commits at lists.llvm.org
Sun Feb 1 02:24:01 PST 2026
https://github.com/tomershafir created https://github.com/llvm/llvm-project/pull/179097
This patch refactors the AArch64 target resolution in Clang driver, extracting a new static local function called `getAArch64TargetCPUByTriple` to reduce redundant checks at runtime. Previously, `getAArch64TargetFeatures` would redundantly double-check `march` and `mcpu` arguments. Also removes the un-informative comment for native handling on the way.
>From 2406e10f1b7e29b13eca4eb3e1aff276de021dba Mon Sep 17 00:00:00 2001
From: tomershafir <tomer.shafir8 at gmail.com>
Date: Sun, 1 Feb 2026 12:10:04 +0200
Subject: [PATCH] [Clang][AArch64] Extract get target CPU by triple (NFC)
This patch refactors the AArch64 target resolution in Clang driver, extracting a new static local function called `getAArch64TargetCPUByTriple` to reduce redundant checks at runtime. Previously, `getAArch64TargetFeatures` would redundantly double-check `march` and `mcpu` arguments. Also removes the un-informative comment for native handling on the way.
---
clang/lib/Driver/ToolChains/Arch/AArch64.cpp | 63 +++++++++++---------
1 file changed, 35 insertions(+), 28 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
index 4aa3743fb5cd5..d39337b6f4ada 100644
--- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp
@@ -25,31 +25,10 @@ static bool isCPUDeterminedByTriple(const llvm::Triple &Triple) {
return Triple.isOSDarwin();
}
-/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
-/// targeting. Set \p A to the Arg corresponding to the -mcpu argument if it is
-/// provided, or to nullptr otherwise.
-std::string aarch64::getAArch64TargetCPU(const ArgList &Args,
- const llvm::Triple &Triple, Arg *&A) {
- std::string CPU;
- // If we have -mcpu, use that.
- if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
- StringRef Mcpu = A->getValue();
- CPU = Mcpu.split("+").first.lower();
- } else if (const Arg *MArch = Args.getLastArg(options::OPT_march_EQ)) {
- // Otherwise, use -march=native if specified.
- StringRef MArchValue = MArch->getValue();
- if (MArchValue.split("+").first.equals_insensitive("native"))
- CPU = "native";
- }
-
- CPU = llvm::AArch64::resolveCPUAlias(CPU);
-
- // Handle CPU name is 'native'.
- if (CPU == "native")
- return std::string(llvm::sys::getHostCPUName());
-
- if (CPU.size())
- return CPU;
+/// \return target CPU based on the target triple.
+static std::string getAArch64TargetCPUByTriple(const llvm::Triple &Triple) {
+ assert(isCPUDeterminedByTriple(Triple) &&
+ "Cannot determine target CPU by triple");
if (Triple.isTargetMachineMac() &&
Triple.getArch() == llvm::Triple::aarch64) {
@@ -90,7 +69,35 @@ std::string aarch64::getAArch64TargetCPU(const ArgList &Args,
return Triple.getArch() == llvm::Triple::aarch64_32 ? "apple-s4"
: "apple-a7";
- return "generic";
+ llvm_unreachable("Unhandled triple");
+}
+
+/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
+/// targeting. Set \p A to the Arg corresponding to the -mcpu argument if it is
+/// provided, or to nullptr otherwise.
+std::string aarch64::getAArch64TargetCPU(const ArgList &Args,
+ const llvm::Triple &Triple, Arg *&A) {
+ std::string CPU;
+ // If we have -mcpu, use that.
+ if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
+ StringRef Mcpu = A->getValue();
+ CPU = Mcpu.split("+").first.lower();
+ } else if (const Arg *MArch = Args.getLastArg(options::OPT_march_EQ)) {
+ // Otherwise, use -march=native if specified.
+ StringRef MArchValue = MArch->getValue();
+ if (MArchValue.split("+").first.equals_insensitive("native"))
+ CPU = "native";
+ }
+
+ CPU = llvm::AArch64::resolveCPUAlias(CPU);
+
+ if (CPU == "native")
+ return std::string(llvm::sys::getHostCPUName());
+
+ if (CPU.size())
+ return CPU;
+
+ return getAArch64TargetCPUByTriple(Triple);
}
// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
@@ -231,7 +238,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Extensions);
else if (isCPUDeterminedByTriple(Triple))
success = getAArch64ArchFeaturesFromMcpu(
- D, getAArch64TargetCPU(Args, Triple, A), Args, Extensions);
+ D, getAArch64TargetCPUByTriple(Triple), Args, Extensions);
else
// Default to 'A' profile if the architecture is not specified.
success = getAArch64ArchFeaturesFromMarch(D, "armv8-a", Args, Extensions);
@@ -242,7 +249,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
success = getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args);
else if (success && isCPUDeterminedByTriple(Triple))
success = getAArch64MicroArchFeaturesFromMcpu(
- D, getAArch64TargetCPU(Args, Triple, A), Args);
+ D, getAArch64TargetCPUByTriple(Triple), Args);
if (!success) {
auto Diag = D.Diag(diag::err_drv_unsupported_option_argument);
More information about the cfe-commits
mailing list