[llvm-branch-commits] [clang] [clang][Driver] Use the Windows ARM64 defaults for aarch64-unknown-uefi (PR #232706)
Prabhu Rajasekaran via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sat Oct 17 23:03:43 PDT 2026
https://github.com/Prabhuk updated https://github.com/llvm/llvm-project/pull/232706
>From 1d62c58a5b1455236df0bad61f61bbf7c4d00ae4 Mon Sep 17 00:00:00 2001
From: prabhukr <prabhukr at google.com>
Date: Fri, 16 Oct 2026 04:51:56 -0700
Subject: [PATCH] [clang][Driver] Use the Windows ARM64 defaults for
aarch64-unknown-uefi
Match the Windows ARM64 driver defaults for aarch64-unknown-uefi, which
follows the same ABI:
* char is signed, so do not pass -fno-signed-char,
* the frame chain must stay valid even when frame pointers are omitted,
so -fomit-frame-pointer yields -mframe-pointer=reserved rather than
none, as the backend reserves the frame pointer for UEFI as well,
* -msign-return-address selects the B key, the only one the backend
accepts for Windows and UEFI.
Assisted-by: Claude
---
clang/lib/Driver/ToolChains/Clang.cpp | 8 ++++----
clang/lib/Driver/ToolChains/CommonArgs.cpp | 8 ++++----
clang/test/Driver/aarch64-security-options.c | 9 +++++++++
clang/test/Driver/aarch64-uefi-constructed-args.c | 9 +++++++++
4 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 45aede75681103..f83ee840596bd5 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1215,7 +1215,7 @@ static bool isSignedCharDefault(const llvm::Triple &Triple) {
case llvm::Triple::armeb:
case llvm::Triple::thumb:
case llvm::Triple::thumbeb:
- if (Triple.isOSDarwin() || Triple.isOSWindows())
+ if (Triple.isOSDarwin() || Triple.isOSWindowsOrUEFI())
return true;
return false;
@@ -1458,9 +1458,9 @@ static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
if (Scope != "none" && Scope != "non-leaf" && Scope != "all")
D.Diag(diag::err_drv_unsupported_option_argument)
<< A->getSpelling() << Scope;
- // This spelling cannot express a key, and AArch64 Windows only supports
- // B-key, so default to it there as parseBranchProtection() does.
- Key = isAArch64 && Triple.isOSWindows() ? "b_key" : "a_key";
+ // This spelling cannot express a key, and AArch64 Windows and UEFI only
+ // support B-key, so default to it there as parseBranchProtection() does.
+ Key = isAArch64 && Triple.isOSWindowsOrUEFI() ? "b_key" : "a_key";
IndirectBranches =
(Triple.isOSOpenBSD() || Triple.isAndroid()) && isAArch64;
BranchProtectionPAuthLR = false;
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 7c832ef405fa51..7d77cd0b916324 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -211,10 +211,10 @@ static bool mustMaintainValidFrameChain(const llvm::opt::ArgList &Args,
return false;
case llvm::Triple::aarch64:
- // Arm64 Windows requires that the frame chain is valid, as there is no
- // way to indicate during a stack walk that a frame has used the frame
- // pointer as a general purpose register.
- return Triple.isOSWindows();
+ // Arm64 Windows (and UEFI, which follows the same ABI) requires that the
+ // frame chain is valid, as there is no way to indicate during a stack walk
+ // that a frame has used the frame pointer as a general purpose register.
+ return Triple.isOSWindowsOrUEFI();
}
}
diff --git a/clang/test/Driver/aarch64-security-options.c b/clang/test/Driver/aarch64-security-options.c
index 183b49b352ad03..81a7d7c571542c 100644
--- a/clang/test/Driver/aarch64-security-options.c
+++ b/clang/test/Driver/aarch64-security-options.c
@@ -17,12 +17,21 @@
// RUN: %clang --target=aarch64-windows-msvc -c %s -### -msign-return-address=all 2>&1 | \
// RUN: FileCheck %s --check-prefix=RA-ALL --check-prefix=KEY-B --check-prefix=BTE-OFF --check-prefix=GCS-OFF --check-prefix=WARN
+// RUN: %clang --target=aarch64-unknown-uefi -c %s -### -msign-return-address=non-leaf 2>&1 | \
+// RUN: FileCheck %s --check-prefix=RA-NON-LEAF --check-prefix=KEY-B --check-prefix=BTE-OFF --check-prefix=GCS-OFF --check-prefix=WARN
+// RUN: %clang --target=aarch64-unknown-uefi -c %s -### -msign-return-address=all 2>&1 | \
+// RUN: FileCheck %s --check-prefix=RA-ALL --check-prefix=KEY-B --check-prefix=BTE-OFF --check-prefix=GCS-OFF --check-prefix=WARN
+// RUN: %clang --target=aarch64-unknown-uefi -c %s -### -mbranch-protection=pac-ret+leaf+bti 2>&1 | \
+// RUN: FileCheck %s --check-prefix=RA-ALL --check-prefix=KEY-B --check-prefix=BTE-ON --check-prefix=GCS-OFF --check-prefix=WARN
+
// -mbranch-protection with standard
// RUN: %clang --target=aarch64 -c %s -### -mbranch-protection=standard 2>&1 | \
// RUN: FileCheck %s --check-prefix=RA-NON-LEAF --check-prefix=KEY-A --check-prefix=BTE-ON --check-prefix=GCS-ON --check-prefix=WARN
// RUN: %clang --target=aarch64-windows-msvc -c %s -### -mbranch-protection=standard 2>&1 | \
// RUN: FileCheck %s --check-prefix=RA-NON-LEAF --check-prefix=KEY-B --check-prefix=BTE-ON --check-prefix=GCS-ON --check-prefix=WARN
+// RUN: %clang --target=aarch64-unknown-uefi -c %s -### -mbranch-protection=standard 2>&1 | \
+// RUN: FileCheck %s --check-prefix=RA-NON-LEAF --check-prefix=KEY-B --check-prefix=BTE-ON --check-prefix=GCS-ON --check-prefix=WARN
// RUN: not %clang -target arm64-apple-darwin -c %s -### -mbranch-protection=standard -fptrauth-returns 2>&1 | \
// RUN: FileCheck %s --check-prefixes=RA-INCOMPATIBLE-PTRAUTHRETURNS
diff --git a/clang/test/Driver/aarch64-uefi-constructed-args.c b/clang/test/Driver/aarch64-uefi-constructed-args.c
index 704bdf6a79db3c..ac84b06856f42b 100644
--- a/clang/test/Driver/aarch64-uefi-constructed-args.c
+++ b/clang/test/Driver/aarch64-uefi-constructed-args.c
@@ -5,6 +5,7 @@
// CHECK: "-cc1"
// CHECK-SAME: "-triple" "aarch64-unknown-uefi"
// CHECK-SAME: "-mrelocation-model" "pic" "-pic-level" "2"
+// CHECK-SAME: "-mframe-pointer=non-leaf"
// CHECK-SAME: "-fms-extensions"
// CHECK-NEXT: "/nologo"
// CHECK-SAME: "/subsystem:efi_application"
@@ -13,6 +14,14 @@
// CHECK-SAME: "/debug"
// CHECK-SAME: "/Brepro"
+// As on Windows ARM64, the frame chain must stay valid even when frame
+// pointers are omitted, and char is signed.
+// RUN: %clang -### --target=aarch64-unknown-uefi -fomit-frame-pointer -c -- %s 2>&1 \
+// RUN: | FileCheck -check-prefixes=DEFAULTS %s
+// DEFAULTS: "-cc1"
+// DEFAULTS-SAME: "-mframe-pointer=reserved"
+// DEFAULTS-NOT: "-fno-signed-char"
+
// RUN: %clang -### --target=aarch64-unknown-uefi -print-search-dirs 2>&1 \
// RUN: | FileCheck -check-prefixes=PROGPATH %s
// PROGPATH: InstalledDir: [[DRIVER_INSTALLED_DIR:.*]]
More information about the llvm-branch-commits
mailing list