From 270fbad06ae96efabef3beaa60873446b8dab649 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Fri, 28 Mar 2025 15:33:03 -0700 Subject: [PATCH 1/4] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20to=20main=20this=20commit=20is=20based=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.6-beta.1 [skip ci] --- .../libcxx/gdb/gdb_pretty_printer_test.py | 2 +- llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 11 +- .../Target/AArch64/AArch64ISelDAGToDAG.cpp | 10 +- llvm/lib/Target/AArch64/AArch64InstrInfo.td | 25 +- llvm/lib/Target/AArch64/AArch64Subtarget.cpp | 23 ++ llvm/lib/Target/AArch64/AArch64Subtarget.h | 8 + .../GISel/AArch64InstructionSelector.cpp | 2 +- llvm/test/CodeGen/AArch64/ptrauth-call.ll | 53 ++-- llvm/test/CodeGen/AArch64/ptrauth-fpac.ll | 81 +++--- ...trauth-intrinsic-auth-resign-with-blend.ll | 48 ++-- .../AArch64/ptrauth-intrinsic-auth-resign.ll | 256 ++++++++++-------- 11 files changed, 307 insertions(+), 212 deletions(-) diff --git a/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.py b/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.py index 254a61a8c633e..630b90c9d77a6 100644 --- a/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.py +++ b/libcxx/test/libcxx/gdb/gdb_pretty_printer_test.py @@ -30,7 +30,7 @@ # we exit. has_run_tests = False -has_execute_mi = tuple(map(int, gdb.VERSION.split("."))) >= (14, 2) +has_execute_mi = 'execute_mi' in gdb.__dict__ class CheckResult(gdb.Command): def __init__(self): diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp index e3ad085bc5a29..8f26e9b791dff 100644 --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -69,15 +69,6 @@ using namespace llvm; -enum PtrauthCheckMode { Default, Unchecked, Poison, Trap }; -static cl::opt PtrauthAuthChecks( - "aarch64-ptrauth-auth-checks", cl::Hidden, - cl::values(clEnumValN(Unchecked, "none", "don't test for failure"), - clEnumValN(Poison, "poison", "poison on failure"), - clEnumValN(Trap, "trap", "trap on failure")), - cl::desc("Check pointer authentication auth/resign failures"), - cl::init(Default)); - #define DEBUG_TYPE "asm-printer" namespace { @@ -2866,7 +2857,7 @@ void AArch64AsmPrinter::emitInstruction(const MachineInstr *MI) { return; } - case AArch64::AUT: + case AArch64::AUTx16x17: case AArch64::AUTPAC: emitPtrauthAuthResign(MI); return; diff --git a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp index 22083460b400a..2eafb8eae2082 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp @@ -361,7 +361,7 @@ class AArch64DAGToDAGISel : public SelectionDAGISel { bool tryIndexedLoad(SDNode *N); - void SelectPtrauthAuth(SDNode *N); + void SelectPtrauthAuthX16X17(SDNode *N); void SelectPtrauthResign(SDNode *N); bool trySelectStackSlotTagP(SDNode *N); @@ -1521,7 +1521,7 @@ extractPtrauthBlendDiscriminators(SDValue Disc, SelectionDAG *DAG) { AddrDisc); } -void AArch64DAGToDAGISel::SelectPtrauthAuth(SDNode *N) { +void AArch64DAGToDAGISel::SelectPtrauthAuthX16X17(SDNode *N) { SDLoc DL(N); // IntrinsicID is operand #0 SDValue Val = N->getOperand(1); @@ -1539,7 +1539,7 @@ void AArch64DAGToDAGISel::SelectPtrauthAuth(SDNode *N) { AArch64::X16, Val, SDValue()); SDValue Ops[] = {AUTKey, AUTConstDisc, AUTAddrDisc, X16Copy.getValue(1)}; - SDNode *AUT = CurDAG->getMachineNode(AArch64::AUT, DL, MVT::i64, Ops); + SDNode *AUT = CurDAG->getMachineNode(AArch64::AUTx16x17, DL, MVT::i64, Ops); ReplaceNode(N, AUT); } @@ -5613,7 +5613,9 @@ void AArch64DAGToDAGISel::Select(SDNode *Node) { return; case Intrinsic::ptrauth_auth: - SelectPtrauthAuth(Node); + if (!Subtarget->isX16X17Safer(CurDAG->getMachineFunction())) + break; + SelectPtrauthAuthX16X17(Node); return; case Intrinsic::ptrauth_resign: diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index 6c61e3a613f6f..98a35b3840771 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -66,6 +66,14 @@ def HasLOR : Predicate<"Subtarget->hasLOR()">, def HasPAuth : Predicate<"Subtarget->hasPAuth()">, AssemblerPredicateWithAll<(all_of FeaturePAuth), "pauth">; +// On most operating systems, the x16 and x17 registers are not special, so +// there is no benefit, and only a code size cost, to constraining PAC +// instructions to only using them. This predicate may be used to guard patterns +// that allow PAC instructions to be used with any register. +let RecomputePerFunction = 1 in { + def X16X17NotSafer : Predicate<"!Subtarget->isX16X17Safer(*MF)">; +} + def HasPAuthLR : Predicate<"Subtarget->hasPAuthLR()">, AssemblerPredicateWithAll<(all_of FeaturePAuthLR), "pauth-lr">; @@ -1820,7 +1828,9 @@ let Predicates = [HasPAuth] in { } defm PAC : SignAuth<0b000, 0b010, "pac", int_ptrauth_sign>; - defm AUT : SignAuth<0b001, 0b011, "aut", null_frag>; + let Predicates = [HasPAuth, X16X17NotSafer] in { + defm AUT : SignAuth<0b001, 0b011, "aut", int_ptrauth_auth>; + } def XPACI : ClearAuth<0, "xpaci">; def : Pat<(int_ptrauth_strip GPR64:$Rd, 0), (XPACI GPR64:$Rd)>; @@ -1912,10 +1922,11 @@ let Predicates = [HasPAuth] in { defm LDRAB : AuthLoad<1, "ldrab", simm10Scaled>; // AUT pseudo. - // This directly manipulates x16/x17, which are the only registers the OS - // guarantees are safe to use for sensitive operations. - def AUT : Pseudo<(outs), (ins i32imm:$Key, i64imm:$Disc, GPR64noip:$AddrDisc), - []>, Sched<[WriteI, ReadI]> { + // This directly manipulates x16/x17, which are the only registers that + // certain OSs guarantee are safe to use for sensitive operations. + def AUTx16x17 : Pseudo<(outs), (ins i32imm:$Key, i64imm:$Disc, + GPR64noip:$AddrDisc), + []>, Sched<[WriteI, ReadI]> { let isCodeGenOnly = 1; let hasSideEffects = 1; let mayStore = 0; @@ -1926,8 +1937,8 @@ let Predicates = [HasPAuth] in { } // AUT and re-PAC a value, using different keys/data. - // This directly manipulates x16/x17, which are the only registers the OS - // guarantees are safe to use for sensitive operations. + // This directly manipulates x16/x17, which are the only registers that + // certain OSs guarantee are safe to use for sensitive operations. def AUTPAC : Pseudo<(outs), (ins i32imm:$AUTKey, i64imm:$AUTDisc, GPR64noip:$AUTAddrDisc, diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.cpp b/llvm/lib/Target/AArch64/AArch64Subtarget.cpp index 7b4ded6322098..6044e84ab6640 100644 --- a/llvm/lib/Target/AArch64/AArch64Subtarget.cpp +++ b/llvm/lib/Target/AArch64/AArch64Subtarget.cpp @@ -102,6 +102,16 @@ static cl::opt UseScalarIncVL("sve-use-scalar-inc-vl", cl::init(false), cl::Hidden, cl::desc("Prefer add+cnt over addvl/inc/dec")); +cl::opt llvm::PtrauthAuthChecks( + "aarch64-ptrauth-auth-checks", cl::Hidden, + cl::values(clEnumValN(PtrauthCheckMode::Unchecked, "none", + "don't test for failure"), + clEnumValN(PtrauthCheckMode::Poison, "poison", + "poison on failure"), + clEnumValN(PtrauthCheckMode::Trap, "trap", "trap on failure")), + cl::desc("Check pointer authentication auth/resign failures"), + cl::init(PtrauthCheckMode::Default)); + unsigned AArch64Subtarget::getVectorInsertExtractBaseCost() const { if (OverrideVectorInsertExtractBaseCost.getNumOccurrences() > 0) return OverrideVectorInsertExtractBaseCost; @@ -663,6 +673,19 @@ AArch64Subtarget::getPtrAuthBlockAddressDiscriminatorIfEnabled( (Twine(ParentFn.getName()) + " blockaddress").str()); } +bool AArch64Subtarget::isX16X17Safer(const MachineFunction &MF) const { + // The Darwin kernel implements special protections for x16 and x17 so we + // should prefer to use those registers on that platform. + if (isTargetDarwin()) + return true; + // Traps are only implemented for the pseudo instructions, but are only + // necessary if FEAT_FPAC is not implemented. + if (hasFPAC()) + return false; + return MF.getFunction().hasFnAttribute("ptrauth-auth-traps") || + PtrauthAuthChecks == PtrauthCheckMode::Trap; +} + bool AArch64Subtarget::enableMachinePipeliner() const { return getSchedModel().hasInstrSchedModel(); } diff --git a/llvm/lib/Target/AArch64/AArch64Subtarget.h b/llvm/lib/Target/AArch64/AArch64Subtarget.h index f5ffc72cae537..4e8f5f85146bd 100644 --- a/llvm/lib/Target/AArch64/AArch64Subtarget.h +++ b/llvm/lib/Target/AArch64/AArch64Subtarget.h @@ -26,6 +26,7 @@ #include "llvm/CodeGen/RegisterBankInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/DataLayout.h" +#include "llvm/Support/CommandLine.h" #define GET_SUBTARGETINFO_HEADER #include "AArch64GenSubtargetInfo.inc" @@ -35,6 +36,9 @@ class GlobalValue; class StringRef; class Triple; +enum class PtrauthCheckMode { Default, Unchecked, Poison, Trap }; +extern cl::opt PtrauthAuthChecks; + class AArch64Subtarget final : public AArch64GenSubtargetInfo { public: enum ARMProcFamilyEnum : uint8_t { @@ -318,6 +322,10 @@ class AArch64Subtarget final : public AArch64GenSubtargetInfo { } } + /// Returns whether the operating system makes it safer to store sensitive + /// values in x16 and x17 as opposed to other registers. + bool isX16X17Safer(const MachineFunction &MF) const; + /// ParseSubtargetFeatures - Parses features string setting specified /// subtarget options. Definition of function is auto generated by tblgen. void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); diff --git a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp index 67a08e39fe879..6164f6e1e7d12 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp @@ -6735,7 +6735,7 @@ bool AArch64InstructionSelector::selectIntrinsic(MachineInstr &I, MIB.buildCopy({AArch64::X16}, {ValReg}); MIB.buildInstr(TargetOpcode::IMPLICIT_DEF, {AArch64::X17}, {}); - MIB.buildInstr(AArch64::AUT) + MIB.buildInstr(AArch64::AUTx16x17) .addImm(AUTKey) .addImm(AUTConstDiscC) .addUse(AUTAddrDisc) diff --git a/llvm/test/CodeGen/AArch64/ptrauth-call.ll b/llvm/test/CodeGen/AArch64/ptrauth-call.ll index bf35cf8fecbdb..7eb4cfca40f09 100644 --- a/llvm/test/CodeGen/AArch64/ptrauth-call.ll +++ b/llvm/test/CodeGen/AArch64/ptrauth-call.ll @@ -169,13 +169,23 @@ define i32 @test_tailcall_ib_var(ptr %arg0, ptr %arg1) #0 { define void @test_tailcall_omit_mov_x16_x16(ptr %objptr) #0 { ; CHECK-LABEL: test_tailcall_omit_mov_x16_x16: -; CHECK-NEXT: ldr x16, [x0] -; CHECK-NEXT: mov x17, x0 -; CHECK-NEXT: movk x17, #6503, lsl #48 -; CHECK-NEXT: autda x16, x17 -; CHECK-NEXT: ldr x1, [x16] -; CHECK-NEXT: movk x16, #54167, lsl #48 -; CHECK-NEXT: braa x1, x16 +; DARWIN-NEXT: ldr x16, [x0] +; DARWIN-NEXT: mov x17, x0 +; DARWIN-NEXT: movk x17, #6503, lsl #48 +; DARWIN-NEXT: autda x16, x17 +; DARWIN-NEXT: ldr x1, [x16] +; DARWIN-NEXT: movk x16, #54167, lsl #48 +; DARWIN-NEXT: braa x1, x16 +; ELF-NEXT: ldr x1, [x0] +; ELF-NEXT: mov x8, x0 +; ELF-NEXT: movk x8, #6503, lsl #48 +; ELF-NEXT: autda x1, x8 +; ELF-NEXT: ldr x2, [x1] +; FIXME: Get rid of the x16/x17 constraint on non-Darwin so we can eliminate +; this mov. +; ELF-NEXT: mov x16, x1 +; ELF-NEXT: movk x16, #54167, lsl #48 +; ELF-NEXT: braa x2, x16 %vtable.signed = load ptr, ptr %objptr, align 8 %objptr.int = ptrtoint ptr %objptr to i64 %vtable.discr = tail call i64 @llvm.ptrauth.blend(i64 %objptr.int, i64 6503) @@ -191,16 +201,27 @@ define void @test_tailcall_omit_mov_x16_x16(ptr %objptr) #0 { define i32 @test_call_omit_extra_moves(ptr %objptr) #0 { ; CHECK-LABEL: test_call_omit_extra_moves: ; DARWIN-NEXT: stp x29, x30, [sp, #-16]! -; ELF-NEXT: str x30, [sp, #-16]! -; CHECK-NEXT: ldr x16, [x0] -; CHECK-NEXT: mov x17, x0 -; CHECK-NEXT: movk x17, #6503, lsl #48 -; CHECK-NEXT: autda x16, x17 -; CHECK-NEXT: ldr x8, [x16] -; CHECK-NEXT: movk x16, #34646, lsl #48 -; CHECK-NEXT: blraa x8, x16 -; CHECK-NEXT: mov w0, #42 +; DARWIN-NEXT: ldr x16, [x0] +; DARWIN-NEXT: mov x17, x0 +; DARWIN-NEXT: movk x17, #6503, lsl #48 +; DARWIN-NEXT: autda x16, x17 +; DARWIN-NEXT: ldr x8, [x16] +; DARWIN-NEXT: movk x16, #34646, lsl #48 +; DARWIN-NEXT: blraa x8, x16 +; DARWIN-NEXT: mov w0, #42 ; DARWIN-NEXT: ldp x29, x30, [sp], #16 +; ELF-NEXT: str x30, [sp, #-16]! +; ELF-NEXT: ldr x8, [x0] +; ELF-NEXT: mov x9, x0 +; ELF-NEXT: movk x9, #6503, lsl #48 +; ELF-NEXT: autda x8, x9 +; ELF-NEXT: ldr x9, [x8] +; FIXME: Get rid of the x16/x17 constraint on non-Darwin so we can eliminate +; this mov. +; ELF-NEXT: mov x17, x8 +; ELF-NEXT: movk x17, #34646, lsl #48 +; ELF-NEXT: blraa x9, x17 +; ELF-NEXT: mov w0, #42 ; ELF-NEXT: ldr x30, [sp], #16 ; CHECK-NEXT: ret %vtable.signed = load ptr, ptr %objptr diff --git a/llvm/test/CodeGen/AArch64/ptrauth-fpac.ll b/llvm/test/CodeGen/AArch64/ptrauth-fpac.ll index d5340dcebad57..41d3ffe32c31e 100644 --- a/llvm/test/CodeGen/AArch64/ptrauth-fpac.ll +++ b/llvm/test/CodeGen/AArch64/ptrauth-fpac.ll @@ -1,17 +1,18 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc < %s -mtriple arm64e-apple-darwin -verify-machineinstrs | FileCheck %s -DL="L" --check-prefixes=ALL,NOFPAC -; RUN: llc < %s -mtriple arm64e-apple-darwin -mattr=+fpac -verify-machineinstrs | FileCheck %s -DL="L" --check-prefixes=ALL,FPAC -; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -verify-machineinstrs | FileCheck %s -DL=".L" --check-prefixes=ALL,NOFPAC -; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -mattr=+fpac -verify-machineinstrs | FileCheck %s -DL=".L" --check-prefixes=ALL,FPAC +; RUN: llc < %s -mtriple arm64e-apple-darwin -verify-machineinstrs | FileCheck %s -DL="L" --check-prefixes=ALL,DARWIN,NOFPAC +; RUN: llc < %s -mtriple arm64e-apple-darwin -mattr=+fpac -verify-machineinstrs | FileCheck %s -DL="L" --check-prefixes=ALL,DARWIN,FPAC,DARWIN-FPAC +; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -verify-machineinstrs | FileCheck %s -DL=".L" --check-prefixes=ALL,ELF,NOFPAC +; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -mattr=+fpac -verify-machineinstrs | FileCheck %s -DL=".L" --check-prefixes=ALL,ELF,FPAC,ELF-FPAC target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" define i64 @test_auth_ia(i64 %arg, i64 %arg1) { ; ALL-LABEL: test_auth_ia: ; ALL: %bb.0: -; ALL-NEXT: mov x16, x0 -; ALL-NEXT: autia x16, x1 -; ALL-NEXT: mov x0, x16 +; DARWIN-NEXT: mov x16, x0 +; DARWIN-NEXT: autia x16, x1 +; DARWIN-NEXT: mov x0, x16 +; ELF-NEXT: autia x0, x1 ; ALL-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 0, i64 %arg1) ret i64 %tmp @@ -20,9 +21,10 @@ define i64 @test_auth_ia(i64 %arg, i64 %arg1) { define i64 @test_auth_ia_zero(i64 %arg) { ; ALL-LABEL: test_auth_ia_zero: ; ALL: %bb.0: -; ALL-NEXT: mov x16, x0 -; ALL-NEXT: autiza x16 -; ALL-NEXT: mov x0, x16 +; DARWIN-NEXT: mov x16, x0 +; DARWIN-NEXT: autiza x16 +; DARWIN-NEXT: mov x0, x16 +; ELF-NEXT: autiza x0 ; ALL-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 0, i64 0) ret i64 %tmp @@ -31,9 +33,10 @@ define i64 @test_auth_ia_zero(i64 %arg) { define i64 @test_auth_ib(i64 %arg, i64 %arg1) { ; ALL-LABEL: test_auth_ib: ; ALL: %bb.0: -; ALL-NEXT: mov x16, x0 -; ALL-NEXT: autib x16, x1 -; ALL-NEXT: mov x0, x16 +; DARWIN-NEXT: mov x16, x0 +; DARWIN-NEXT: autib x16, x1 +; DARWIN-NEXT: mov x0, x16 +; ELF-NEXT: autib x0, x1 ; ALL-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 1, i64 %arg1) ret i64 %tmp @@ -42,9 +45,10 @@ define i64 @test_auth_ib(i64 %arg, i64 %arg1) { define i64 @test_auth_ib_zero(i64 %arg) { ; ALL-LABEL: test_auth_ib_zero: ; ALL: %bb.0: -; ALL-NEXT: mov x16, x0 -; ALL-NEXT: autizb x16 -; ALL-NEXT: mov x0, x16 +; DARWIN-NEXT: mov x16, x0 +; DARWIN-NEXT: autizb x16 +; DARWIN-NEXT: mov x0, x16 +; ELF-NEXT: autizb x0 ; ALL-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 1, i64 0) ret i64 %tmp @@ -53,9 +57,10 @@ define i64 @test_auth_ib_zero(i64 %arg) { define i64 @test_auth_da(i64 %arg, i64 %arg1) { ; ALL-LABEL: test_auth_da: ; ALL: %bb.0: -; ALL-NEXT: mov x16, x0 -; ALL-NEXT: autda x16, x1 -; ALL-NEXT: mov x0, x16 +; DARWIN-NEXT: mov x16, x0 +; DARWIN-NEXT: autda x16, x1 +; DARWIN-NEXT: mov x0, x16 +; ELF-NEXT: autda x0, x1 ; ALL-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 2, i64 %arg1) ret i64 %tmp @@ -64,9 +69,10 @@ define i64 @test_auth_da(i64 %arg, i64 %arg1) { define i64 @test_auth_da_zero(i64 %arg) { ; ALL-LABEL: test_auth_da_zero: ; ALL: %bb.0: -; ALL-NEXT: mov x16, x0 -; ALL-NEXT: autdza x16 -; ALL-NEXT: mov x0, x16 +; DARWIN-NEXT: mov x16, x0 +; DARWIN-NEXT: autdza x16 +; DARWIN-NEXT: mov x0, x16 +; ELF-NEXT: autdza x0 ; ALL-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 2, i64 0) ret i64 %tmp @@ -75,9 +81,10 @@ define i64 @test_auth_da_zero(i64 %arg) { define i64 @test_auth_db(i64 %arg, i64 %arg1) { ; ALL-LABEL: test_auth_db: ; ALL: %bb.0: -; ALL-NEXT: mov x16, x0 -; ALL-NEXT: autdb x16, x1 -; ALL-NEXT: mov x0, x16 +; DARWIN-NEXT: mov x16, x0 +; DARWIN-NEXT: autdb x16, x1 +; DARWIN-NEXT: mov x0, x16 +; ELF-NEXT: autdb x0, x1 ; ALL-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 3, i64 %arg1) ret i64 %tmp @@ -86,9 +93,10 @@ define i64 @test_auth_db(i64 %arg, i64 %arg1) { define i64 @test_auth_db_zero(i64 %arg) { ; ALL-LABEL: test_auth_db_zero: ; ALL: %bb.0: -; ALL-NEXT: mov x16, x0 -; ALL-NEXT: autdzb x16 -; ALL-NEXT: mov x0, x16 +; DARWIN-NEXT: mov x16, x0 +; DARWIN-NEXT: autdzb x16 +; DARWIN-NEXT: mov x0, x16 +; ELF-NEXT: autdzb x0 ; ALL-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 3, i64 0) ret i64 %tmp @@ -362,12 +370,17 @@ define i64 @test_auth_trap_attribute(i64 %arg, i64 %arg1) "ptrauth-auth-traps" { ; NOFPAC-NEXT: mov x0, x16 ; NOFPAC-NEXT: ret ; -; FPAC-LABEL: test_auth_trap_attribute: -; FPAC: %bb.0: -; FPAC-NEXT: mov x16, x0 -; FPAC-NEXT: autia x16, x1 -; FPAC-NEXT: mov x0, x16 -; FPAC-NEXT: ret +; DARWIN-FPAC-LABEL: test_auth_trap_attribute: +; DARWIN-FPAC: %bb.0: +; DARWIN-FPAC-NEXT: mov x16, x0 +; DARWIN-FPAC-NEXT: autia x16, x1 +; DARWIN-FPAC-NEXT: mov x0, x16 +; DARWIN-FPAC-NEXT: ret +; +; ELF-FPAC-LABEL: test_auth_trap_attribute: +; ELF-FPAC: %bb.0: +; ELF-FPAC-NEXT: autia x0, x1 +; ELF-FPAC-NEXT: ret %tmp = call i64 @llvm.ptrauth.auth(i64 %arg, i32 0, i64 %arg1) ret i64 %tmp } diff --git a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll index 74d2370c74c54..ab8ce04b4816d 100644 --- a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll +++ b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll @@ -33,21 +33,27 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" define i64 @test_auth_blend(i64 %arg, i64 %arg1) { ; UNCHECKED-LABEL: test_auth_blend: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: mov x17, x1 -; UNCHECKED-NEXT: movk x17, #65535, lsl #48 -; UNCHECKED-NEXT: autda x16, x17 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: mov x17, x1 +; UNCHECKED-DARWIN-NEXT: movk x17, #65535, lsl #48 +; UNCHECKED-DARWIN-NEXT: autda x16, x17 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: mov x8, x1 +; UNCHECKED-ELF-NEXT: movk x8, #65535, lsl #48 +; UNCHECKED-ELF-NEXT: autda x0, x8 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_blend: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: mov x17, x1 -; CHECKED-NEXT: movk x17, #65535, lsl #48 -; CHECKED-NEXT: autda x16, x17 -; CHECKED-NEXT: mov x0, x16 +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: mov x17, x1 +; CHECKED-DARWIN-NEXT: movk x17, #65535, lsl #48 +; CHECKED-DARWIN-NEXT: autda x16, x17 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: mov x8, x1 +; CHECKED-ELF-NEXT: movk x8, #65535, lsl #48 +; CHECKED-ELF-NEXT: autda x0, x8 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_blend: @@ -146,10 +152,10 @@ define i64 @test_resign_blend_and_const(i64 %arg, i64 %arg1) { ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 -; CHECKED-NEXT: b.eq [[L]]auth_success_1 +; CHECKED-NEXT: b.eq [[L]]auth_success_[[N2:[0-9]]] ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_1 -; CHECKED-NEXT: Lauth_success_1: +; CHECKED-NEXT: Lauth_success_[[N2]]: ; CHECKED-NEXT: mov x17, #56789 ; CHECKED-NEXT: pacdb x16, x17 ; CHECKED-NEXT: Lresign_end_1: @@ -232,10 +238,10 @@ define i64 @test_auth_too_large_discriminator(i64 %arg, i64 %arg1) { ; UNCHECKED-NEXT: mov w8, #65536 ; UNCHECKED-DARWIN-NEXT: bfi x1, x8, #48, #16 ; UNCHECKED-DARWIN-NEXT: mov x16, x0 -; UNCHECKED-ELF-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autda x16, x1 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 ; UNCHECKED-ELF-NEXT: bfi x1, x8, #48, #16 -; UNCHECKED-NEXT: autda x16, x1 -; UNCHECKED-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autda x0, x1 ; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_too_large_discriminator: @@ -243,10 +249,10 @@ define i64 @test_auth_too_large_discriminator(i64 %arg, i64 %arg1) { ; CHECKED-NEXT: mov w8, #65536 ; CHECKED-DARWIN-NEXT: bfi x1, x8, #48, #16 ; CHECKED-DARWIN-NEXT: mov x16, x0 -; CHECKED-ELF-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autda x16, x1 +; CHECKED-DARWIN-NEXT: mov x0, x16 ; CHECKED-ELF-NEXT: bfi x1, x8, #48, #16 -; CHECKED-NEXT: autda x16, x1 -; CHECKED-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autda x0, x1 ; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_too_large_discriminator: diff --git a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll index fdd5ae29f35ea..a034c586073b3 100644 --- a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll +++ b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll @@ -1,13 +1,13 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0 -verify-machineinstrs \ -; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL="L" --check-prefix=UNCHECKED +; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL="L" --check-prefixes=UNCHECKED,UNCHECKED-DARWIN ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel -global-isel-abort=1 -verify-machineinstrs \ -; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL="L" --check-prefix=UNCHECKED +; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL="L" --check-prefixes=UNCHECKED,UNCHECKED-DARWIN ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0 -verify-machineinstrs \ -; RUN: | FileCheck %s -DL="L" --check-prefix=CHECKED +; RUN: | FileCheck %s -DL="L" --check-prefixes=CHECKED,CHECKED-DARWIN ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel -global-isel-abort=1 -verify-machineinstrs \ -; RUN: | FileCheck %s -DL="L" --check-prefix=CHECKED +; RUN: | FileCheck %s -DL="L" --check-prefixes=CHECKED,CHECKED-DARWIN ; RUN: llc < %s -mtriple arm64e-apple-darwin -global-isel=0 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL="L" --check-prefix=TRAP @@ -15,14 +15,14 @@ ; RUN: -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL="L" --check-prefix=TRAP ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0 -verify-machineinstrs \ -; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL=".L" --check-prefix=UNCHECKED +; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL=".L" --check-prefixes=UNCHECKED,UNCHECKED-ELF ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel -global-isel-abort=1 -verify-machineinstrs \ -; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL=".L" --check-prefix=UNCHECKED +; RUN: -aarch64-ptrauth-auth-checks=none | FileCheck %s -DL=".L" --check-prefixes=UNCHECKED,UNCHECKED-ELF ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0 -verify-machineinstrs \ -; RUN: | FileCheck %s -DL=".L" --check-prefix=CHECKED +; RUN: | FileCheck %s -DL=".L" --check-prefixes=CHECKED,CHECKED-ELF ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel -global-isel-abort=1 -verify-machineinstrs \ -; RUN: | FileCheck %s -DL=".L" --check-prefix=CHECKED +; RUN: | FileCheck %s -DL=".L" --check-prefixes=CHECKED,CHECKED-ELF ; RUN: llc < %s -mtriple aarch64-linux-gnu -mattr=+pauth -global-isel=0 -verify-machineinstrs \ ; RUN: -aarch64-ptrauth-auth-checks=trap | FileCheck %s -DL=".L" --check-prefix=TRAP @@ -33,18 +33,20 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" define i64 @test_auth_ia(i64 %arg, i64 %arg1) { ; UNCHECKED-LABEL: test_auth_ia: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autia x16, x1 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autia x16, x1 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autia x0, x1 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_ia: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autia x16, x1 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autia x16, x1 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autia x0, x1 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_ia: ; TRAP: %bb.0: @@ -64,18 +66,20 @@ define i64 @test_auth_ia(i64 %arg, i64 %arg1) { define i64 @test_auth_ia_zero(i64 %arg) { ; UNCHECKED-LABEL: test_auth_ia_zero: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autiza x16 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autiza x16 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autiza x0 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_ia_zero: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autiza x16 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autiza x16 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autiza x0 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_ia_zero: ; TRAP: %bb.0: @@ -95,18 +99,20 @@ define i64 @test_auth_ia_zero(i64 %arg) { define i64 @test_auth_ib(i64 %arg, i64 %arg1) { ; UNCHECKED-LABEL: test_auth_ib: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autib x16, x1 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autib x16, x1 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autib x0, x1 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_ib: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autib x16, x1 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autib x16, x1 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autib x0, x1 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_ib: ; TRAP: %bb.0: @@ -126,18 +132,20 @@ define i64 @test_auth_ib(i64 %arg, i64 %arg1) { define i64 @test_auth_ib_zero(i64 %arg) { ; UNCHECKED-LABEL: test_auth_ib_zero: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autizb x16 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autizb x16 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autizb x0 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_ib_zero: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autizb x16 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autizb x16 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autizb x0 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_ib_zero: ; TRAP: %bb.0: @@ -157,18 +165,20 @@ define i64 @test_auth_ib_zero(i64 %arg) { define i64 @test_auth_da(i64 %arg, i64 %arg1) { ; UNCHECKED-LABEL: test_auth_da: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autda x16, x1 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autda x16, x1 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autda x0, x1 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_da: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autda x16, x1 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autda x16, x1 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autda x0, x1 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_da: ; TRAP: %bb.0: @@ -188,18 +198,20 @@ define i64 @test_auth_da(i64 %arg, i64 %arg1) { define i64 @test_auth_da_zero(i64 %arg) { ; UNCHECKED-LABEL: test_auth_da_zero: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autdza x16 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autdza x16 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autdza x0 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_da_zero: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autdza x16 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autdza x16 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autdza x0 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_da_zero: ; TRAP: %bb.0: @@ -219,18 +231,20 @@ define i64 @test_auth_da_zero(i64 %arg) { define i64 @test_auth_db(i64 %arg, i64 %arg1) { ; UNCHECKED-LABEL: test_auth_db: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autdb x16, x1 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autdb x16, x1 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autdb x0, x1 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_db: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autdb x16, x1 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autdb x16, x1 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autdb x0, x1 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_db: ; TRAP: %bb.0: @@ -250,18 +264,20 @@ define i64 @test_auth_db(i64 %arg, i64 %arg1) { define i64 @test_auth_db_zero(i64 %arg) { ; UNCHECKED-LABEL: test_auth_db_zero: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autdzb x16 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: autdzb x16 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: autdzb x0 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_db_zero: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autdzb x16 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: autdzb x16 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: autdzb x0 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_db_zero: ; TRAP: %bb.0: @@ -535,24 +551,24 @@ define i64 @test_resign_da_dzb(i64 %arg, i64 %arg1, i64 %arg2) { define i64 @test_auth_trap_attribute(i64 %arg, i64 %arg1) "ptrauth-auth-traps" { ; UNCHECKED-LABEL: test_auth_trap_attribute: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: autia x16, x1 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-NEXT: mov x16, x0 +; UNCHECKED-NEXT: autia x16, x1 +; UNCHECKED-NEXT: mov x0, x16 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_trap_attribute: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: autia x16, x1 -; CHECKED-NEXT: mov x17, x16 -; CHECKED-NEXT: xpaci x17 -; CHECKED-NEXT: cmp x16, x17 -; CHECKED-NEXT: b.eq [[L]]auth_success_6 -; CHECKED-NEXT: brk #0xc470 -; CHECKED-NEXT: Lauth_success_6: -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-NEXT: mov x16, x0 +; CHECKED-NEXT: autia x16, x1 +; CHECKED-NEXT: mov x17, x16 +; CHECKED-NEXT: xpaci x17 +; CHECKED-NEXT: cmp x16, x17 +; CHECKED-NEXT: b.eq [[L]]auth_success_6 +; CHECKED-NEXT: brk #0xc470 +; CHECKED-NEXT: Lauth_success_6: +; CHECKED-NEXT: mov x0, x16 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_trap_attribute: ; TRAP: %bb.0: @@ -572,20 +588,24 @@ define i64 @test_auth_trap_attribute(i64 %arg, i64 %arg1) "ptrauth-auth-traps" { define i64 @test_auth_ia_constdisc(i64 %arg) { ; UNCHECKED-LABEL: test_auth_ia_constdisc: -; UNCHECKED: %bb.0: -; UNCHECKED-NEXT: mov x16, x0 -; UNCHECKED-NEXT: mov x17, #256 -; UNCHECKED-NEXT: autia x16, x17 -; UNCHECKED-NEXT: mov x0, x16 -; UNCHECKED-NEXT: ret +; UNCHECKED: %bb.0: +; UNCHECKED-DARWIN-NEXT: mov x16, x0 +; UNCHECKED-DARWIN-NEXT: mov x17, #256 +; UNCHECKED-DARWIN-NEXT: autia x16, x17 +; UNCHECKED-DARWIN-NEXT: mov x0, x16 +; UNCHECKED-ELF-NEXT: mov w8, #256 +; UNCHECKED-ELF-NEXT: autia x0, x8 +; UNCHECKED-NEXT: ret ; ; CHECKED-LABEL: test_auth_ia_constdisc: -; CHECKED: %bb.0: -; CHECKED-NEXT: mov x16, x0 -; CHECKED-NEXT: mov x17, #256 -; CHECKED-NEXT: autia x16, x17 -; CHECKED-NEXT: mov x0, x16 -; CHECKED-NEXT: ret +; CHECKED: %bb.0: +; CHECKED-DARWIN-NEXT: mov x16, x0 +; CHECKED-DARWIN-NEXT: mov x17, #256 +; CHECKED-DARWIN-NEXT: autia x16, x17 +; CHECKED-DARWIN-NEXT: mov x0, x16 +; CHECKED-ELF-NEXT: mov w8, #256 +; CHECKED-ELF-NEXT: autia x0, x8 +; CHECKED-NEXT: ret ; ; TRAP-LABEL: test_auth_ia_constdisc: ; TRAP: %bb.0: @@ -621,10 +641,10 @@ define i64 @test_resign_da_constdisc(i64 %arg, i64 %arg1) { ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 -; CHECKED-NEXT: b.eq [[L]]auth_success_7 +; CHECKED-NEXT: b.eq [[L]]auth_success_[[N1:[0-9]]] ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_6 -; CHECKED-NEXT: Lauth_success_7: +; CHECKED-NEXT: Lauth_success_[[N1]]: ; CHECKED-NEXT: mov x17, #256 ; CHECKED-NEXT: pacda x16, x17 ; CHECKED-NEXT: Lresign_end_6: From f2e0ad9c6c60da547b91f170520a2b97cfd967a9 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Wed, 2 Apr 2025 21:34:10 -0700 Subject: [PATCH 2/4] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20introduced=20through=20rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.6-beta.1 [skip ci] --- llvm/lib/Support/CMakeLists.txt | 5 + llvm/lib/Support/SipHash.cpp | 131 +------------- .../gn/secondary/llvm/lib/Support/BUILD.gn | 1 + third-party/siphash/include/siphash/SipHash.h | 161 ++++++++++++++++++ 4 files changed, 168 insertions(+), 130 deletions(-) create mode 100644 third-party/siphash/include/siphash/SipHash.h diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index 2754c97fce6c1..1b18eb7c6346b 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -368,3 +368,8 @@ if(LLVM_WITH_Z3) ${Z3_INCLUDE_DIR} ) endif() + +target_include_directories(LLVMSupport SYSTEM + PRIVATE + ${LLVM_THIRD_PARTY_DIR}/siphash/include + ) diff --git a/llvm/lib/Support/SipHash.cpp b/llvm/lib/Support/SipHash.cpp index 68545913a4f59..682e9231c776f 100644 --- a/llvm/lib/Support/SipHash.cpp +++ b/llvm/lib/Support/SipHash.cpp @@ -15,9 +15,9 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" -#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Endian.h" +#include "siphash/SipHash.h" #include using namespace llvm; @@ -25,135 +25,6 @@ using namespace support; #define DEBUG_TYPE "llvm-siphash" -// Lightly adapted from the SipHash reference C implementation: -// https://github.com/veorq/SipHash -// by Jean-Philippe Aumasson and Daniel J. Bernstein - -#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b)))) - -#define SIPROUND \ - do { \ - v0 += v1; \ - v1 = ROTL(v1, 13); \ - v1 ^= v0; \ - v0 = ROTL(v0, 32); \ - v2 += v3; \ - v3 = ROTL(v3, 16); \ - v3 ^= v2; \ - v0 += v3; \ - v3 = ROTL(v3, 21); \ - v3 ^= v0; \ - v2 += v1; \ - v1 = ROTL(v1, 17); \ - v1 ^= v2; \ - v2 = ROTL(v2, 32); \ - } while (0) - -namespace { - -/// Computes a SipHash value -/// -/// \param in: pointer to input data (read-only) -/// \param inlen: input data length in bytes (any size_t value) -/// \param k: reference to the key data 16-byte array (read-only) -/// \returns output data, must be 8 or 16 bytes -/// -template -void siphash(const unsigned char *in, uint64_t inlen, - const unsigned char (&k)[16], unsigned char (&out)[outlen]) { - - const unsigned char *ni = (const unsigned char *)in; - const unsigned char *kk = (const unsigned char *)k; - - static_assert(outlen == 8 || outlen == 16, "result should be 8 or 16 bytes"); - - uint64_t v0 = UINT64_C(0x736f6d6570736575); - uint64_t v1 = UINT64_C(0x646f72616e646f6d); - uint64_t v2 = UINT64_C(0x6c7967656e657261); - uint64_t v3 = UINT64_C(0x7465646279746573); - uint64_t k0 = endian::read64le(kk); - uint64_t k1 = endian::read64le(kk + 8); - uint64_t m; - int i; - const unsigned char *end = ni + inlen - (inlen % sizeof(uint64_t)); - const int left = inlen & 7; - uint64_t b = ((uint64_t)inlen) << 56; - v3 ^= k1; - v2 ^= k0; - v1 ^= k1; - v0 ^= k0; - - if (outlen == 16) - v1 ^= 0xee; - - for (; ni != end; ni += 8) { - m = endian::read64le(ni); - v3 ^= m; - - for (i = 0; i < cROUNDS; ++i) - SIPROUND; - - v0 ^= m; - } - - switch (left) { - case 7: - b |= ((uint64_t)ni[6]) << 48; - LLVM_FALLTHROUGH; - case 6: - b |= ((uint64_t)ni[5]) << 40; - LLVM_FALLTHROUGH; - case 5: - b |= ((uint64_t)ni[4]) << 32; - LLVM_FALLTHROUGH; - case 4: - b |= ((uint64_t)ni[3]) << 24; - LLVM_FALLTHROUGH; - case 3: - b |= ((uint64_t)ni[2]) << 16; - LLVM_FALLTHROUGH; - case 2: - b |= ((uint64_t)ni[1]) << 8; - LLVM_FALLTHROUGH; - case 1: - b |= ((uint64_t)ni[0]); - break; - case 0: - break; - } - - v3 ^= b; - - for (i = 0; i < cROUNDS; ++i) - SIPROUND; - - v0 ^= b; - - if (outlen == 16) - v2 ^= 0xee; - else - v2 ^= 0xff; - - for (i = 0; i < dROUNDS; ++i) - SIPROUND; - - b = v0 ^ v1 ^ v2 ^ v3; - endian::write64le(out, b); - - if (outlen == 8) - return; - - v1 ^= 0xdd; - - for (i = 0; i < dROUNDS; ++i) - SIPROUND; - - b = v0 ^ v1 ^ v2 ^ v3; - endian::write64le(out + 8, b); -} - -} // end anonymous namespace - void llvm::getSipHash_2_4_64(ArrayRef In, const uint8_t (&K)[16], uint8_t (&Out)[8]) { siphash<2, 4>(In.data(), In.size(), K, Out); diff --git a/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn b/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn index fe7ff6ef68f99..5461ed5246b85 100644 --- a/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn +++ b/llvm/utils/gn/secondary/llvm/lib/Support/BUILD.gn @@ -31,6 +31,7 @@ static_library("Support") { include_dirs = [ "Unix", "Windows", + "//third-party/siphash/include", ] sources = [ "AArch64AttributeParser.cpp", diff --git a/third-party/siphash/include/siphash/SipHash.h b/third-party/siphash/include/siphash/SipHash.h new file mode 100644 index 0000000000000..9653e9428b123 --- /dev/null +++ b/third-party/siphash/include/siphash/SipHash.h @@ -0,0 +1,161 @@ +//===--- SipHash.h - An implementation of SipHash -------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This is a header-only implementation of SipHash. It lacks library +// dependencies so it can be used from LLVM and compiler-rt. +// +//===----------------------------------------------------------------------===// + +#include +#include + +// Lightly adapted from the SipHash reference C implementation: +// https://github.com/veorq/SipHash +// by Jean-Philippe Aumasson and Daniel J. Bernstein + +#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b)))) + +#define U32TO8_LE(p, v) \ + (p)[0] = (uint8_t)((v)); \ + (p)[1] = (uint8_t)((v) >> 8); \ + (p)[2] = (uint8_t)((v) >> 16); \ + (p)[3] = (uint8_t)((v) >> 24); + +#define U64TO8_LE(p, v) \ + U32TO8_LE((p), (uint32_t)((v))); \ + U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); + +#define U8TO64_LE(p) \ + (((uint64_t)((p)[0])) | ((uint64_t)((p)[1]) << 8) | \ + ((uint64_t)((p)[2]) << 16) | ((uint64_t)((p)[3]) << 24) | \ + ((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) | \ + ((uint64_t)((p)[6]) << 48) | ((uint64_t)((p)[7]) << 56)) + +#define SIPROUND \ + do { \ + v0 += v1; \ + v1 = ROTL(v1, 13); \ + v1 ^= v0; \ + v0 = ROTL(v0, 32); \ + v2 += v3; \ + v3 = ROTL(v3, 16); \ + v3 ^= v2; \ + v0 += v3; \ + v3 = ROTL(v3, 21); \ + v3 ^= v0; \ + v2 += v1; \ + v1 = ROTL(v1, 17); \ + v1 ^= v2; \ + v2 = ROTL(v2, 32); \ + } while (0) + +namespace { + +/// Computes a SipHash value +/// +/// \param in: pointer to input data (read-only) +/// \param inlen: input data length in bytes (any size_t value) +/// \param k: reference to the key data 16-byte array (read-only) +/// \returns output data, must be 8 or 16 bytes +/// +template +void siphash(const unsigned char *in, uint64_t inlen, + const unsigned char (&k)[16], unsigned char (&out)[outlen]) { + + const unsigned char *ni = (const unsigned char *)in; + const unsigned char *kk = (const unsigned char *)k; + + static_assert(outlen == 8 || outlen == 16, "result should be 8 or 16 bytes"); + + uint64_t v0 = UINT64_C(0x736f6d6570736575); + uint64_t v1 = UINT64_C(0x646f72616e646f6d); + uint64_t v2 = UINT64_C(0x6c7967656e657261); + uint64_t v3 = UINT64_C(0x7465646279746573); + uint64_t k0 = U8TO64_LE(kk); + uint64_t k1 = U8TO64_LE(kk + 8); + uint64_t m; + int i; + const unsigned char *end = ni + inlen - (inlen % sizeof(uint64_t)); + const int left = inlen & 7; + uint64_t b = ((uint64_t)inlen) << 56; + v3 ^= k1; + v2 ^= k0; + v1 ^= k1; + v0 ^= k0; + + if (outlen == 16) + v1 ^= 0xee; + + for (; ni != end; ni += 8) { + m = U8TO64_LE(ni); + v3 ^= m; + + for (i = 0; i < cROUNDS; ++i) + SIPROUND; + + v0 ^= m; + } + + switch (left) { + case 7: + b |= ((uint64_t)ni[6]) << 48; + /* FALLTHRU */ + case 6: + b |= ((uint64_t)ni[5]) << 40; + /* FALLTHRU */ + case 5: + b |= ((uint64_t)ni[4]) << 32; + /* FALLTHRU */ + case 4: + b |= ((uint64_t)ni[3]) << 24; + /* FALLTHRU */ + case 3: + b |= ((uint64_t)ni[2]) << 16; + /* FALLTHRU */ + case 2: + b |= ((uint64_t)ni[1]) << 8; + /* FALLTHRU */ + case 1: + b |= ((uint64_t)ni[0]); + /* FALLTHRU */ + break; + case 0: + break; + } + + v3 ^= b; + + for (i = 0; i < cROUNDS; ++i) + SIPROUND; + + v0 ^= b; + + if (outlen == 16) + v2 ^= 0xee; + else + v2 ^= 0xff; + + for (i = 0; i < dROUNDS; ++i) + SIPROUND; + + b = v0 ^ v1 ^ v2 ^ v3; + U64TO8_LE(out, b); + + if (outlen == 8) + return; + + v1 ^= 0xdd; + + for (i = 0; i < dROUNDS; ++i) + SIPROUND; + + b = v0 ^ v1 ^ v2 ^ v3; + U64TO8_LE(out + 8, b); +} + +} // end anonymous namespace From b37a44fff650b06eda249060277d0c007226cad2 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 3 Apr 2025 21:51:44 -0700 Subject: [PATCH 3/4] Fix CMake build Created using spr 1.3.6-beta.1 --- compiler-rt/cmake/Modules/AddCompilerRT.cmake | 8 +++++++- compiler-rt/cmake/builtin-config-ix.cmake | 1 + compiler-rt/lib/builtins/CMakeLists.txt | 8 ++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/compiler-rt/cmake/Modules/AddCompilerRT.cmake b/compiler-rt/cmake/Modules/AddCompilerRT.cmake index c3e734f72392f..2f6fd4ba1e4c9 100644 --- a/compiler-rt/cmake/Modules/AddCompilerRT.cmake +++ b/compiler-rt/cmake/Modules/AddCompilerRT.cmake @@ -172,7 +172,7 @@ function(add_compiler_rt_runtime name type) cmake_parse_arguments(LIB "" "PARENT_TARGET" - "OS;ARCHS;SOURCES;CFLAGS;LINK_FLAGS;DEFS;DEPS;LINK_LIBS;OBJECT_LIBS;ADDITIONAL_HEADERS;EXTENSIONS" + "OS;ARCHS;SOURCES;CFLAGS;LINK_FLAGS;DEFS;DEPS;LINK_LIBS;OBJECT_LIBS;ADDITIONAL_HEADERS;EXTENSIONS;C_STANDARD;CXX_STANDARD" ${ARGN}) set(libnames) # Until we support this some other way, build compiler-rt runtime without LTO @@ -360,6 +360,12 @@ function(add_compiler_rt_runtime name type) set_target_link_flags(${libname} ${extra_link_flags_${libname}}) set_property(TARGET ${libname} APPEND PROPERTY COMPILE_DEFINITIONS ${LIB_DEFS}) + if(LIB_C_STANDARD) + set_property(TARGET ${libname} PROPERTY C_STANDARD ${LIB_C_STANDARD}) + endif() + if(LIB_CXX_STANDARD) + set_property(TARGET ${libname} PROPERTY CXX_STANDARD ${LIB_CXX_STANDARD}) + endif() set_target_output_directories(${libname} ${output_dir_${libname}}) install(TARGETS ${libname} ARCHIVE DESTINATION ${install_dir_${libname}} diff --git a/compiler-rt/cmake/builtin-config-ix.cmake b/compiler-rt/cmake/builtin-config-ix.cmake index 7bd3269bd999d..7bdd30ee67f3d 100644 --- a/compiler-rt/cmake/builtin-config-ix.cmake +++ b/compiler-rt/cmake/builtin-config-ix.cmake @@ -26,6 +26,7 @@ builtin_check_c_compiler_flag("-Xclang -mcode-object-version=none" COMPILER_RT_H builtin_check_c_compiler_flag(-Wbuiltin-declaration-mismatch COMPILER_RT_HAS_WBUILTIN_DECLARATION_MISMATCH_FLAG) builtin_check_c_compiler_flag(/Zl COMPILER_RT_HAS_ZL_FLAG) builtin_check_c_compiler_flag(-fcf-protection=full COMPILER_RT_HAS_FCF_PROTECTION_FLAG) +builtin_check_c_compiler_flag(-nostdinc++ COMPILER_RT_HAS_NOSTDINCXX_FLAG) builtin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD " diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt index e6c3273eb2859..ca5cc7d218223 100644 --- a/compiler-rt/lib/builtins/CMakeLists.txt +++ b/compiler-rt/lib/builtins/CMakeLists.txt @@ -6,7 +6,7 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) cmake_minimum_required(VERSION 3.20.0) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) - project(CompilerRTBuiltins C ASM) + project(CompilerRTBuiltins C CXX ASM) set(COMPILER_RT_STANDALONE_BUILD TRUE) set(COMPILER_RT_BUILTINS_STANDALONE_BUILD TRUE) @@ -64,6 +64,8 @@ include(CMakePushCheckState) option(COMPILER_RT_BUILTINS_HIDE_SYMBOLS "Do not export any symbols from the static library." ON) +include_directories(../../../third-party/siphash/include) + # TODO: Need to add a mechanism for logging errors when builtin source files are # added to a sub-directory and not this CMakeLists file. set(GENERIC_SOURCES @@ -803,7 +805,7 @@ else () append_list_if(COMPILER_RT_ENABLE_CET -fcf-protection=full BUILTIN_CFLAGS) endif() - append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 BUILTIN_CFLAGS) + append_list_if(COMPILER_RT_HAS_NOSTDINCXX_FLAG -nostdinc++ BUILTIN_CFLAGS) append_list_if(COMPILER_RT_HAS_WBUILTIN_DECLARATION_MISMATCH_FLAG -Werror=builtin-declaration-mismatch BUILTIN_CFLAGS) # Don't embed directives for picking any specific CRT @@ -918,6 +920,8 @@ else () SOURCES ${${arch}_SOURCES} DEFS ${BUILTIN_DEFS} CFLAGS ${BUILTIN_CFLAGS_${arch}} + C_STANDARD 11 + CXX_STANDARD 17 PARENT_TARGET builtins) cmake_pop_check_state() endif () From 9fe55fe9fab6968632a54e746ae155d72783ccf8 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 5 Jun 2025 22:16:12 -0700 Subject: [PATCH 4/4] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20ch?= =?UTF-8?q?anges=20introduced=20through=20rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created using spr 1.3.6-beta.1 [skip ci] --- llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp | 6 ++++-- llvm/lib/Target/AArch64/AArch64InstrInfo.td | 3 +-- .../AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll | 4 ++-- llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp index 80924c4858ccc..716cae5395ebc 100644 --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -173,7 +173,7 @@ class AArch64AsmPrinter : public AsmPrinter { const MachineOperand *AUTAddrDisc, Register Scratch, std::optional PACKey, - uint64_t PACDisc, unsigned PACAddrDisc); + uint64_t PACDisc, Register PACAddrDisc); // Emit the sequence to compute the discriminator. // @@ -1871,6 +1871,8 @@ Register AArch64AsmPrinter::emitPtrauthDiscriminator(uint16_t Disc, Register AddrDisc, Register ScratchReg, bool MayUseAddrAsScratch) { + assert(ScratchReg == AArch64::X16 || ScratchReg == AArch64::X17 || + !STI->isX16X17Safer()); // So far we've used NoRegister in pseudos. Now we need real encodings. if (AddrDisc == AArch64::NoRegister) AddrDisc = AArch64::XZR; @@ -2073,7 +2075,7 @@ void AArch64AsmPrinter::emitPtrauthAuthResign( Register AUTVal, AArch64PACKey::ID AUTKey, uint64_t AUTDisc, const MachineOperand *AUTAddrDisc, Register Scratch, std::optional PACKey, uint64_t PACDisc, - unsigned PACAddrDisc) { + Register PACAddrDisc) { const bool IsAUTPAC = PACKey.has_value(); // We expand AUT/AUTPAC into a sequence of the form diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index 37acdc3e9f7cc..caa247c3c2ce4 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -1955,8 +1955,7 @@ let Predicates = [HasPAuth] in { def AUTxMxN : Pseudo<(outs GPR64:$AuthVal, GPR64common:$Scratch), (ins GPR64:$Val, i32imm:$Key, i64imm:$Disc, GPR64:$AddrDisc), - []>, Sched<[WriteI, ReadI]> { - let Constraints = "$AuthVal = $Val"; + [], "$AuthVal = $Val">, Sched<[WriteI, ReadI]> { let isCodeGenOnly = 1; let hasSideEffects = 0; let mayStore = 0; diff --git a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll index e6651c83af8af..e2aea6df78250 100644 --- a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll +++ b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign-with-blend.ll @@ -165,10 +165,10 @@ define i64 @test_resign_blend_and_const(i64 %arg, i64 %arg1) { ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 -; CHECKED-NEXT: b.eq [[L]]auth_success_[[N2:[0-9]+]] +; CHECKED-NEXT: b.eq [[L]]auth_success_1 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_1 -; CHECKED-NEXT: Lauth_success_[[N2]]: +; CHECKED-NEXT: Lauth_success_1: ; CHECKED-NEXT: mov x17, #56789 ; CHECKED-NEXT: pacdb x16, x17 ; CHECKED-NEXT: Lresign_end_1: diff --git a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll index 47fa3f8e88c41..f95dc5600aec8 100644 --- a/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll +++ b/llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll @@ -687,10 +687,10 @@ define i64 @test_resign_da_constdisc(i64 %arg, i64 %arg1) { ; CHECKED-NEXT: mov x17, x16 ; CHECKED-NEXT: xpacd x17 ; CHECKED-NEXT: cmp x16, x17 -; CHECKED-NEXT: b.eq [[L]]auth_success_[[N1:[0-9]+]] +; CHECKED-NEXT: b.eq [[L]]auth_success_7 ; CHECKED-NEXT: mov x16, x17 ; CHECKED-NEXT: b [[L]]resign_end_6 -; CHECKED-NEXT: Lauth_success_[[N1]]: +; CHECKED-NEXT: Lauth_success_7: ; CHECKED-NEXT: mov x17, #256 ; CHECKED-NEXT: pacda x16, x17 ; CHECKED-NEXT: Lresign_end_6: