[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