[clang] 68f703f - [AArch64][COFF] Branch-protection=standard/pac-ret means "b-key" on Windows (#203989)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 16 14:04:31 PDT 2026
Author: Daniel Kiss
Date: 2026-07-17T00:04:26+03:00
New Revision: 68f703f3e58a52c41b39dfc654a675560b6c5614
URL: https://github.com/llvm/llvm-project/commit/68f703f3e58a52c41b39dfc654a675560b6c5614
DIFF: https://github.com/llvm/llvm-project/commit/68f703f3e58a52c41b39dfc654a675560b6c5614.diff
LOG: [AArch64][COFF] Branch-protection=standard/pac-ret means "b-key" on Windows (#203989)
On AArch64 Windows the `B-key` is the only supported key for userspace,
let's make "standard" and "pac-ret" options generate "b-key".
Fixes: #203852
Added:
llvm/test/CodeGen/AArch64/windows-pac-invalid-a-key.ll
Modified:
clang/docs/ReleaseNotes.md
clang/docs/UsersManual.md
clang/lib/Basic/Targets/AArch64.cpp
clang/lib/Basic/Targets/ARM.cpp
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/CodeGen/AArch64/branch-protection-attr.c
clang/test/CodeGen/AArch64/sign-return-address.c
clang/test/Driver/aarch64-security-options.c
clang/test/Preprocessor/aarch64-target-features.c
llvm/docs/ReleaseNotes.md
llvm/include/llvm/TargetParser/ARMTargetParserCommon.h
llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp
llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
llvm/lib/TargetParser/ARMTargetParserCommon.cpp
llvm/test/CodeGen/AArch64/sign-return-address.ll
llvm/test/CodeGen/AArch64/wineh-bti.ll
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 93e48944239af..07262feae9113 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -351,6 +351,9 @@ latest release, please see the [Clang Web Site](https://clang.llvm.org) or the
#### Arm and AArch64 Support
+- On AArch64 Windows targets, `-mbranch-protection=standard` and `-mbranch-protection=pac-ret`
+ now uses the B-key by default.
+
#### Android Support
#### Windows Support
diff --git a/clang/docs/UsersManual.md b/clang/docs/UsersManual.md
index 756f2784dc076..9bccf8e175298 100644
--- a/clang/docs/UsersManual.md
+++ b/clang/docs/UsersManual.md
@@ -2774,6 +2774,36 @@ are listed below.
only. This only applies to the AArch64 architecture.
```
+```{eval-rst}
+.. option:: -mbranch-protection=features
+
+ Select the branch protection features to use for ARM and AArch64 targets.
+ ``features`` can be ``none``, ``standard``, or a ``+``-separated list of
+ ``bti``, ``gcs``, and ``pac-ret`` with optional ``pac-ret`` modifiers.
+
+ ``none`` is the default and turns off all types of branch protection.
+
+ ``standard`` turns on all branch protection features that are valid for the
+ target platform. If a feature has additional tuning options, ``standard``
+ sets them to their standard level.
+
+ ``pac-ret`` turns on return address signing to its standard level: signing
+ functions that save the return address to memory (non-leaf functions
+ practically always do this) using the A-key. On AArch64 Windows targets,
+ ``pac-ret`` uses the B-key by default.
+
+ ``+leaf`` extends the ``pac-ret`` signing to include leaf functions.
+
+ ``+b-key`` can be used to sign functions with the B-key instead of the A-key
+ on AArch64. ``b-key`` is accepted but ignored for ARM targets.
+
+ ``+pc`` enables the PAuth-LR form of return address signing.
+
+ ``bti`` turns on the Branch Target Identification mechanism.
+
+ ``gcs`` turns on Guarded Control Stack compatible code generation.
+```
+
```{eval-rst}
.. option:: -mcompact-branches=[values]
diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp
index debf3ecf589e3..d531e26ade84a 100644
--- a/clang/lib/Basic/Targets/AArch64.cpp
+++ b/clang/lib/Basic/Targets/AArch64.cpp
@@ -254,7 +254,8 @@ bool AArch64TargetInfo::validateBranchProtection(StringRef Spec, StringRef,
const LangOptions &LO,
StringRef &Err) const {
llvm::ARM::ParsedBranchProtection PBP;
- if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err, HasPAuthLR))
+ if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err, getTriple(),
+ HasPAuthLR))
return false;
// GCS is currently untested with ptrauth-returns, but enabling this could be
diff --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index b9744ff9009ca..f963ce38352c2 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -375,7 +375,7 @@ bool ARMTargetInfo::validateBranchProtection(StringRef Spec, StringRef Arch,
const LangOptions &LO,
StringRef &Err) const {
llvm::ARM::ParsedBranchProtection PBP;
- if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
+ if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err, getTriple()))
return false;
if (!isBranchProtectionSupportedArch(Arch))
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index bdf72f848aeff..d5fa51c4be3cc 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1445,7 +1445,7 @@ static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,
if (llvm::any_of(CmdArgs, isPAuthLR))
EnablePAuthLR = true;
}
- if (!llvm::ARM::parseBranchProtection(A->getValue(), PBP, DiagMsg,
+ if (!llvm::ARM::parseBranchProtection(A->getValue(), PBP, DiagMsg, Triple,
EnablePAuthLR))
D.Diag(diag::err_drv_unsupported_option_argument)
<< A->getSpelling() << DiagMsg;
diff --git a/clang/test/CodeGen/AArch64/branch-protection-attr.c b/clang/test/CodeGen/AArch64/branch-protection-attr.c
index c66bce1bee6d3..d3fa2743ef626 100644
--- a/clang/test/CodeGen/AArch64/branch-protection-attr.c
+++ b/clang/test/CodeGen/AArch64/branch-protection-attr.c
@@ -13,6 +13,8 @@
// RUN: | FileCheck %s --check-prefix=CHECK
// RUN: %clang_cc1 -triple aarch64 -emit-llvm -target-cpu generic -target-feature +v8.5a -mguarded-control-stack -mbranch-target-enforce -mbranch-protection-pauth-lr -msign-return-address=all -msign-return-address-key=a_key %s -o - \
// RUN: | FileCheck %s --check-prefix=CHECK
+// RUN: %clang_cc1 -triple aarch64-windows-msvc -emit-llvm -target-cpu generic -target-feature +v8.5a %s -o - \
+// RUN: | FileCheck %s --check-prefix=WIN
__attribute__ ((target("branch-protection=none")))
void none() {}
@@ -21,6 +23,7 @@ void none() {}
__attribute__ ((target("branch-protection=standard")))
void std() {}
// CHECK: define{{.*}} void @std() #[[#STD:]]
+// WIN: define{{.*}} void @std() #[[#WINSTD:]]
__attribute__ ((target("branch-protection=bti")))
void btionly() {}
@@ -29,6 +32,7 @@ void btionly() {}
__attribute__ ((target("branch-protection=pac-ret")))
void paconly() {}
// CHECK: define{{.*}} void @paconly() #[[#PAC:]]
+// WIN: define{{.*}} void @paconly() #[[#WINPAC:]]
__attribute__ ((target("branch-protection=pac-ret+bti")))
void pacbti0() {}
@@ -82,10 +86,12 @@ void gcs() {}
// CHECK-DAG: attributes #[[#NONE]] = { {{.*}}
// CHECK-DAG: attributes #[[#STD]] = { {{.*}} "branch-target-enforcement" "guarded-control-stack" {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
+// WIN-DAG: attributes #[[#WINSTD]] = { {{.*}} "branch-target-enforcement" "guarded-control-stack" {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="b_key"
// CHECK-DAG: attributes #[[#BTI]] = { {{.*}} "branch-target-enforcement"
// CHECK-DAG: attributes #[[#PAC]] = { {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="a_key"
+// WIN-DAG: attributes #[[#WINPAC]] = { {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="b_key"
// CHECK-DAG: attributes #[[#PACLEAF]] = { {{.*}} "sign-return-address"="all" "sign-return-address-key"="a_key"
diff --git a/clang/test/CodeGen/AArch64/sign-return-address.c b/clang/test/CodeGen/AArch64/sign-return-address.c
index 2b505de339054..c617b45c21317 100644
--- a/clang/test/CodeGen/AArch64/sign-return-address.c
+++ b/clang/test/CodeGen/AArch64/sign-return-address.c
@@ -6,6 +6,8 @@
// RUN: %clang -target aarch64-none-elf -S -emit-llvm -o - -mbranch-protection=pac-ret+leaf %s | FileCheck %s --check-prefix=CHECK --check-prefix=ALL
// RUN: %clang -target aarch64-none-elf -S -emit-llvm -o - -mbranch-protection=pac-ret+b-key %s | FileCheck %s --check-prefix=CHECK --check-prefix=B-KEY
// RUN: %clang -target aarch64-none-elf -S -emit-llvm -o - -mbranch-protection=bti %s | FileCheck %s --check-prefix=CHECK --check-prefix=BTE
+// RUN: %clang -target aarch64-windows-msvc -S -emit-llvm -o - -mbranch-protection=pac-ret %s | FileCheck %s --check-prefix=CHECK --check-prefix=WIN-PAC
+// RUN: %clang -target aarch64-windows-msvc -S -emit-llvm -o - -mbranch-protection=standard %s | FileCheck %s --check-prefix=CHECK --check-prefix=WIN-STD
// REQUIRES: aarch64-registered-target
@@ -21,6 +23,8 @@
// PART: attributes #[[#ATTR]] = { {{.*}} "sign-return-address-key"="a_key"
// B-KEY: attributes #[[#ATTR]] = { {{.*}} "sign-return-address-key"="b_key"
// BTE: attributes #[[#ATTR]] = { {{.*}} "branch-target-enforcement"
+// WIN-PAC: attributes #[[#ATTR]] = { {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="b_key"
+// WIN-STD: attributes #[[#ATTR]] = { {{.*}} "branch-target-enforcement" {{.*}} "guarded-control-stack" {{.*}} "sign-return-address"="non-leaf" "sign-return-address-key"="b_key"
// Check module attributes
@@ -30,23 +34,34 @@
// PART-NOT: !"branch-target-enforcement"
// BTE: !{i32 8, !"branch-target-enforcement", i32 2}
// B-KEY-NOT: !"branch-target-enforcement"
+// WIN-PAC-NOT: !"branch-target-enforcement"
+// WIN-STD: !{i32 8, !"branch-target-enforcement", i32 2}
+
+// WIN-PAC-NOT: !"guarded-control-stack"
+// WIN-STD: !{i32 8, !"guarded-control-stack", i32 2}
// NONE-NOT: !"sign-return-address"
// ALL: !{i32 8, !"sign-return-address", i32 2}
// PART: !{i32 8, !"sign-return-address", i32 2}
// BTE-NOT: !"sign-return-address"
// B-KEY: !{i32 8, !"sign-return-address", i32 2}
+// WIN-PAC: !{i32 8, !"sign-return-address", i32 2}
+// WIN-STD: !{i32 8, !"sign-return-address", i32 2}
// NONE-NOT: !"sign-return-address-all"
// ALL: !{i32 8, !"sign-return-address-all", i32 2}
// PART-NOT: !"sign-return-address-all"
// BTE-NOT: !"sign-return-address-all"
// B-KEY-NOT: !"sign-return-address-all"
+// WIN-PAC-NOT: !"sign-return-address-all"
+// WIN-STD-NOT: !"sign-return-address-all"
// NONE-NOT: !"sign-return-address-with-bkey"
// ALL-NOT: !"sign-return-address-with-bkey"
// PART-NOT: !"sign-return-address-with-bkey"
// BTE-NOT: !"sign-return-address-with-bkey"
// B-KEY: !{i32 8, !"sign-return-address-with-bkey", i32 2}
+// WIN-PAC: !{i32 8, !"sign-return-address-with-bkey", i32 2}
+// WIN-STD: !{i32 8, !"sign-return-address-with-bkey", i32 2}
void foo() {}
diff --git a/clang/test/Driver/aarch64-security-options.c b/clang/test/Driver/aarch64-security-options.c
index 146add2d1cf70..967a6122a333d 100644
--- a/clang/test/Driver/aarch64-security-options.c
+++ b/clang/test/Driver/aarch64-security-options.c
@@ -13,6 +13,9 @@
// 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
+
// If the -msign-return-address and -mbranch-protection are both used, the
// right-most one controls return address signing.
// RUN: %clang --target=aarch64 -c %s -### -msign-return-address=non-leaf -mbranch-protection=none 2>&1 | \
@@ -37,6 +40,7 @@
// RA-ALL: "-msign-return-address=all"
// KEY-A: "-msign-return-address-key=a_key"
+// KEY-B: "-msign-return-address-key=b_key"
// KEY-NOT: "-msign-return-address-key"
// BTE-OFF-NOT: "-mbranch-target-enforce"
diff --git a/clang/test/Preprocessor/aarch64-target-features.c b/clang/test/Preprocessor/aarch64-target-features.c
index 70b7c705ead79..a3ded91d5695f 100644
--- a/clang/test/Preprocessor/aarch64-target-features.c
+++ b/clang/test/Preprocessor/aarch64-target-features.c
@@ -541,6 +541,7 @@
// RUN: %clang -target arm64-none-linux-gnu -march=armv8-a -mbranch-protection=pac-ret+b-key -x c -E -dM %s -o - | FileCheck -check-prefix=CHECK-PAUTH-BKEY %s
// RUN: %clang -target arm64-none-linux-gnu -march=armv8-a -mbranch-protection=pac-ret+leaf -x c -E -dM %s -o - | FileCheck -check-prefix=CHECK-PAUTH-ALL %s
// RUN: %clang -target arm64-none-linux-gnu -march=armv8-a -mbranch-protection=pac-ret+leaf+b-key -x c -E -dM %s -o - | FileCheck -check-prefix=CHECK-PAUTH-BKEY-ALL %s
+// RUN: %clang -target aarch64-windows-msvc -march=armv8-a -mbranch-protection=standard -x c -E -dM %s -o - | FileCheck -check-prefix=CHECK-BRANCH-PROTECTION-STANDARD-WINDOWS %s
//
// Note: PAUTH-OFF - pac-ret is disabled
// CPU-NOPAUTH - FEAT_PAUTH support is disabled (but pac-ret can still use HINT-encoded instructions)
@@ -553,6 +554,9 @@
// CHECK-PAUTH-BKEY-ALL: #define __ARM_FEATURE_PAC_DEFAULT 6
// CHECK-CPU-PAUTH: #define __ARM_FEATURE_PAUTH 1
// CHECK-CPU-NOPAUTH-NOT: __ARM_FEATURE_PAUTH
+// CHECK-BRANCH-PROTECTION-STANDARD-WINDOWS-DAG: #define __ARM_FEATURE_BTI_DEFAULT 1
+// CHECK-BRANCH-PROTECTION-STANDARD-WINDOWS-DAG: #define __ARM_FEATURE_GCS_DEFAULT 1
+// CHECK-BRANCH-PROTECTION-STANDARD-WINDOWS-DAG: #define __ARM_FEATURE_PAC_DEFAULT 2
// ================== Check Branch Target Identification (BTI).
// RUN: %clang -target arm64-none-linux-gnu -march=armv8-a -x c -E -dM %s -o - | FileCheck -check-prefix=CHECK-BTI-OFF %s
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index e12dd0d7a8b71..94208f8e36d19 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -70,6 +70,9 @@ Makes programs 10x faster by doing Special New Thing.
### Changes to the AArch64 Backend
+* On AArch64 Windows targets, return address signing now uses the B-key by
+ default because Windows unwind information only supports B-key signing.
+
### Changes to the AMDGPU Backend
### Changes to the ARM Backend
diff --git a/llvm/include/llvm/TargetParser/ARMTargetParserCommon.h b/llvm/include/llvm/TargetParser/ARMTargetParserCommon.h
index 7c8030dd5576a..1df9740fde8b5 100644
--- a/llvm/include/llvm/TargetParser/ARMTargetParserCommon.h
+++ b/llvm/include/llvm/TargetParser/ARMTargetParserCommon.h
@@ -15,6 +15,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Compiler.h"
+#include "llvm/TargetParser/Triple.h"
namespace llvm {
namespace ARM {
@@ -47,7 +48,8 @@ struct ParsedBranchProtection {
};
LLVM_ABI bool parseBranchProtection(StringRef Spec, ParsedBranchProtection &PBP,
- StringRef &Err, bool EnablePAuthLR = false);
+ StringRef &Err, const llvm::Triple &Triple,
+ bool EnablePAuthLR = false);
} // namespace ARM
} // namespace llvm
diff --git a/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp b/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp
index 90dbd7304ec85..29aea3694497f 100644
--- a/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp
@@ -18,6 +18,7 @@
#include "AArch64Subtarget.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/IR/Constants.h"
+#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/MC/MCAsmInfo.h"
@@ -93,6 +94,12 @@ static bool ShouldSignWithBKey(const Function &F, const AArch64Subtarget &STI) {
const StringRef Key =
F.getFnAttribute("sign-return-address-key").getValueAsString();
assert(Key == "a_key" || Key == "b_key");
+ if (STI.getTargetTriple().isOSWindows() && Key == "a_key" &&
+ GetSignReturnAddress(F) != SignReturnAddress::None) {
+ F.getContext().diagnose(DiagnosticInfoUnsupported{
+ F, "A-key return address signing is unsupported on AArch64 Windows"});
+ return true;
+ }
return Key == "b_key";
}
diff --git a/llvm/lib/Target/AArch64/AArch64PointerAuth.cpp b/llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
index 5372ffe869e1f..6be02ba0dc38b 100644
--- a/llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
+++ b/llvm/lib/Target/AArch64/AArch64PointerAuth.cpp
@@ -175,6 +175,8 @@ void AArch64PointerAuthImpl::signLR(MachineFunction &MF,
}
if (!EmitCFI && NeedsWinCFI) {
+ assert(UseBKey &&
+ "Windows SEH PAC unwind info only supports B-key signing");
BuildMI(MBB, MBBI, DL, TII->get(AArch64::SEH_PACSignLR))
.setMIFlag(MachineInstr::FrameSetup);
}
@@ -336,6 +338,8 @@ void AArch64PointerAuthImpl::authenticateLR(
}
if (NeedsWinCFI) {
+ assert(UseBKey &&
+ "Windows SEH PAC unwind info only supports B-key signing");
BuildMI(MBB, MBBI, DL, TII->get(AArch64::SEH_PACSignLR))
.setMIFlag(MachineInstr::FrameDestroy);
}
diff --git a/llvm/lib/TargetParser/ARMTargetParserCommon.cpp b/llvm/lib/TargetParser/ARMTargetParserCommon.cpp
index 15ba1ebd0c037..6d824c78cab97 100644
--- a/llvm/lib/TargetParser/ARMTargetParserCommon.cpp
+++ b/llvm/lib/TargetParser/ARMTargetParserCommon.cpp
@@ -141,7 +141,8 @@ ARM::EndianKind ARM::parseArchEndian(StringRef Arch) {
// returned in `PBP`. Returns false in error, with `Err` containing
// an erroneous part of the spec.
bool ARM::parseBranchProtection(StringRef Spec, ParsedBranchProtection &PBP,
- StringRef &Err, bool EnablePAuthLR) {
+ StringRef &Err, const llvm::Triple &Triple,
+ bool EnablePAuthLR) {
PBP = {"none", "a_key", false, false, false};
if (Spec == "none")
return true; // defaults are ok
@@ -151,6 +152,8 @@ bool ARM::parseBranchProtection(StringRef Spec, ParsedBranchProtection &PBP,
PBP.BranchTargetEnforcement = true;
PBP.GuardedControlStack = true;
PBP.BranchProtectionPAuthLR = EnablePAuthLR;
+ if (Triple.isAArch64() && Triple.isOSWindows())
+ PBP.Key = "b_key";
return true;
}
@@ -164,6 +167,9 @@ bool ARM::parseBranchProtection(StringRef Spec, ParsedBranchProtection &PBP,
}
if (Opt == "pac-ret") {
PBP.Scope = "non-leaf";
+ if (Triple.isAArch64() && Triple.isOSWindows())
+ PBP.Key = "b_key";
+
for (; I + 1 != E; ++I) {
StringRef PACOpt = Opts[I + 1].trim();
if (PACOpt == "leaf")
diff --git a/llvm/test/CodeGen/AArch64/sign-return-address.ll b/llvm/test/CodeGen/AArch64/sign-return-address.ll
index 7267ce0e3afbf..755ba860c7ccc 100644
--- a/llvm/test/CodeGen/AArch64/sign-return-address.ll
+++ b/llvm/test/CodeGen/AArch64/sign-return-address.ll
@@ -5,14 +5,21 @@
; v9.5-A is not expected to change codegen without -mbranch-protection=+pc, so reuse DWARFCFI-V83A.
; RUN: llc -mtriple=aarch64 -mattr=v9.5a < %s | FileCheck --check-prefixes=CHECK,DWARFCFI,DWARFCFI-V83A %s
-; RUN: llc -mtriple=aarch64-windows < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-COMPAT %s
-; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a < %s | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-V83A %s
+; RUN: sed -e '/^define i32 @leaf_sign_all_a_key(/,/^}/d' -e '/^define i32 @leaf_sign_all_a_key_bti(/,/^}/d' %s > %t.win-valid.ll
+; RUN: llc -mtriple=aarch64-windows < %t.win-valid.ll | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-COMPAT %s
+; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a < %t.win-valid.ll | FileCheck --check-prefixes=CHECK,WINCFI,WINCFI-V83A %s
+
+; RUN: sed -n -e '/^define i32 @leaf_sign_all_a_key(/,/^}/p' %s | not llc -mtriple=aarch64-windows -filetype=null 2>&1 | FileCheck --check-prefix=ERR-AKEY %s
; Make sure no errors are detected when emitting SEH opcodes.
; Errors are only checked for when generating a binary, so emit a dummy object
; file and make sure llc produces zero exit code.
-; RUN: llc -mtriple=aarch64-windows -o %t.dummy.o --filetype=obj < %s
-; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a -o %t.dummy.o --filetype=obj < %s
+; RUN: llc -mtriple=aarch64-windows -o %t.dummy.o --filetype=obj < %t.win-valid.ll
+; RUN: llc -mtriple=aarch64-windows -mattr=v8.3a -o %t.dummy.o --filetype=obj < %t.win-valid.ll
+
+; ERR-AKEY: error:
+; ERR-AKEY-SAME: in function leaf_sign_all_a_key
+; ERR-AKEY-SAME: A-key return address signing is unsupported on AArch64 Windows
define i32 @leaf(i32 %x) {
; CHECK-LABEL: leaf:
@@ -649,34 +656,6 @@ define i32 @leaf_sign_all_a_key(i32 %x) "sign-return-address"="all" "sign-return
; DWARFCFI-V83A-NEXT: paciasp
; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
; DWARFCFI-V83A-NEXT: retaa
-;
-; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key:
-; WINCFI-COMPAT: .seh_proc leaf_sign_all_a_key
-; WINCFI-COMPAT-NEXT: // %bb.0:
-; WINCFI-COMPAT-NEXT: hint #25
-; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
-; WINCFI-COMPAT-NEXT: .seh_endprologue
-; WINCFI-COMPAT-NEXT: .seh_startepilogue
-; WINCFI-COMPAT-NEXT: hint #29
-; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
-; WINCFI-COMPAT-NEXT: .seh_endepilogue
-; WINCFI-COMPAT-NEXT: ret
-; WINCFI-COMPAT-NEXT: .seh_endfunclet
-; WINCFI-COMPAT-NEXT: .seh_endproc
-;
-; WINCFI-V83A-LABEL: leaf_sign_all_a_key:
-; WINCFI-V83A: .seh_proc leaf_sign_all_a_key
-; WINCFI-V83A-NEXT: // %bb.0:
-; WINCFI-V83A-NEXT: paciasp
-; WINCFI-V83A-NEXT: .seh_pac_sign_lr
-; WINCFI-V83A-NEXT: .seh_endprologue
-; WINCFI-V83A-NEXT: .seh_startepilogue
-; WINCFI-V83A-NEXT: autiasp
-; WINCFI-V83A-NEXT: .seh_pac_sign_lr
-; WINCFI-V83A-NEXT: .seh_endepilogue
-; WINCFI-V83A-NEXT: ret
-; WINCFI-V83A-NEXT: .seh_endfunclet
-; WINCFI-V83A-NEXT: .seh_endproc
ret i32 %x
}
@@ -764,34 +743,6 @@ define i32 @leaf_sign_all_a_key_bti(i32 %x) "sign-return-address"="all" "sign-re
; DWARFCFI-V83A-NEXT: paciasp
; DWARFCFI-V83A-NEXT: .cfi_negate_ra_state
; DWARFCFI-V83A-NEXT: retaa
-;
-; WINCFI-COMPAT-LABEL: leaf_sign_all_a_key_bti:
-; WINCFI-COMPAT: .seh_proc leaf_sign_all_a_key_bti
-; WINCFI-COMPAT-NEXT: // %bb.0:
-; WINCFI-COMPAT-NEXT: hint #25
-; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
-; WINCFI-COMPAT-NEXT: .seh_endprologue
-; WINCFI-COMPAT-NEXT: .seh_startepilogue
-; WINCFI-COMPAT-NEXT: hint #29
-; WINCFI-COMPAT-NEXT: .seh_pac_sign_lr
-; WINCFI-COMPAT-NEXT: .seh_endepilogue
-; WINCFI-COMPAT-NEXT: ret
-; WINCFI-COMPAT-NEXT: .seh_endfunclet
-; WINCFI-COMPAT-NEXT: .seh_endproc
-;
-; WINCFI-V83A-LABEL: leaf_sign_all_a_key_bti:
-; WINCFI-V83A: .seh_proc leaf_sign_all_a_key_bti
-; WINCFI-V83A-NEXT: // %bb.0:
-; WINCFI-V83A-NEXT: paciasp
-; WINCFI-V83A-NEXT: .seh_pac_sign_lr
-; WINCFI-V83A-NEXT: .seh_endprologue
-; WINCFI-V83A-NEXT: .seh_startepilogue
-; WINCFI-V83A-NEXT: autiasp
-; WINCFI-V83A-NEXT: .seh_pac_sign_lr
-; WINCFI-V83A-NEXT: .seh_endepilogue
-; WINCFI-V83A-NEXT: ret
-; WINCFI-V83A-NEXT: .seh_endfunclet
-; WINCFI-V83A-NEXT: .seh_endproc
ret i32 %x
}
diff --git a/llvm/test/CodeGen/AArch64/windows-pac-invalid-a-key.ll b/llvm/test/CodeGen/AArch64/windows-pac-invalid-a-key.ll
new file mode 100644
index 0000000000000..7203e10e4b200
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/windows-pac-invalid-a-key.ll
@@ -0,0 +1,11 @@
+; RUN: not llc -mtriple=aarch64-windows-msvc -filetype=null %s 2>&1 | FileCheck %s
+
+; CHECK: error:
+; CHECK-SAME: A-key return address signing is unsupported on AArch64 Windows
+
+define void @a_key() "sign-return-address"="non-leaf" "sign-return-address-key"="a_key" {
+ call void @callee()
+ ret void
+}
+
+declare void @callee()
diff --git a/llvm/test/CodeGen/AArch64/wineh-bti.ll b/llvm/test/CodeGen/AArch64/wineh-bti.ll
index 86555a7f64366..ce565bd16e880 100644
--- a/llvm/test/CodeGen/AArch64/wineh-bti.ll
+++ b/llvm/test/CodeGen/AArch64/wineh-bti.ll
@@ -1,6 +1,6 @@
; RUN: llc < %s -mtriple=aarch64-windows -aarch64-min-jump-table-entries=4 | FileCheck %s
-define dso_local i32 @func(i32 %in) "sign-return-address"="non-leaf" "sign-return-address-key"="a_key" "branch-target-enforcement" {
+define dso_local i32 @func(i32 %in) "sign-return-address"="non-leaf" "sign-return-address-key"="b_key" "branch-target-enforcement" {
entry:
call void asm sideeffect "", "~{x19}"()
switch i32 %in, label %def [
More information about the cfe-commits
mailing list