Skip to content

Commit 7512ab1

Browse files
committed
[AArch64][PAC] Precommit test case on speculatively exetuting AUTxMxN
1 parent 5886a27 commit 7512ab1

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed

llvm/test/CodeGen/AArch64/ptrauth-intrinsic-auth-resign.ll

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,5 +755,122 @@ define i64 @test_auth_ia_swapped(i64 %arg, i64 %arg1) {
755755
ret i64 %tmp
756756
}
757757

758+
; Authentications should not be speculated, as they crash on failure and it is
759+
; perfectly correct to dynamically choose the signing schema or whether to
760+
; perform authentication at all.
761+
define ptr @auth_speculation(i64 %signed, i1 %cond) {
762+
; UNCHECKED-LABEL: auth_speculation:
763+
; UNCHECKED: %bb.0:
764+
; UNCHECKED-DARWIN-NEXT: mov x16, x0
765+
; UNCHECKED-DARWIN-NEXT: tbz w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]
766+
; UNCHECKED-DARWIN-NEXT: %bb.1:
767+
; UNCHECKED-DARWIN-NEXT: autdza x16
768+
; UNCHECKED-DARWIN-NEXT: b [[BB_RETURN:[A-Za-z0-9_.]+]]
769+
; UNCHECKED-DARWIN-NEXT: [[BB_ELSE]]:
770+
; UNCHECKED-DARWIN-NEXT: autdzb x16
771+
; UNCHECKED-DARWIN-NEXT: [[BB_RETURN]]:
772+
; UNCHECKED-DARWIN-NEXT: ldr x8, [x16]
773+
; UNCHECKED-ELF-NEXT: mov x8, x0
774+
; UNCHECKED-ELF-NEXT: autdza x0
775+
; UNCHECKED-ELF-NEXT: autdzb x8
776+
; UNCHECKED-ELF-NEXT: tst w1, #0x1
777+
; UNCHECKED-ELF-NEXT: csel x8, x8, x0, eq
778+
; UNCHECKED-ELF-NEXT: ldr x8, [x8]
779+
; UNCHECKED-NEXT: ldr x8, [x8]
780+
; UNCHECKED-NEXT: ldr x8, [x8]
781+
; UNCHECKED-NEXT: ldr x0, [x8]
782+
; UNCHECKED-NEXT: ret
783+
;
784+
; CHECKED-LABEL: auth_speculation:
785+
; CHECKED: %bb.0:
786+
; CHECKED-DARWIN-NEXT: mov x16, x0
787+
; CHECKED-DARWIN-NEXT: tbz w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]
788+
; CHECKED-DARWIN-NEXT: %bb.1:
789+
; CHECKED-DARWIN-NEXT: autdza x16
790+
; CHECKED-DARWIN-NEXT: b [[BB_RETURN:[A-Za-z0-9_.]+]]
791+
; CHECKED-DARWIN-NEXT: [[BB_ELSE]]:
792+
; CHECKED-DARWIN-NEXT: autdzb x16
793+
; CHECKED-DARWIN-NEXT: [[BB_RETURN]]:
794+
; CHECKED-DARWIN-NEXT: ldr x8, [x16]
795+
; CHECKED-ELF-NEXT: mov x8, x0
796+
; CHECKED-ELF-NEXT: autdza x0
797+
; CHECKED-ELF-NEXT: autdzb x8
798+
; CHECKED-ELF-NEXT: tst w1, #0x1
799+
; CHECKED-ELF-NEXT: csel x8, x8, x0, eq
800+
; CHECKED-ELF-NEXT: ldr x8, [x8]
801+
; CHECKED-NEXT: ldr x8, [x8]
802+
; CHECKED-NEXT: ldr x8, [x8]
803+
; CHECKED-NEXT: ldr x0, [x8]
804+
; CHECKED-NEXT: ret
805+
;
806+
; TRAP-LABEL: auth_speculation:
807+
; TRAP: %bb.0:
808+
; TRAP-DARWIN-NEXT: mov x16, x0
809+
; TRAP-DARWIN-NEXT: tbz w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]
810+
; TRAP-DARWIN-NEXT: %bb.1:
811+
; TRAP-DARWIN-NEXT: autdza x16
812+
; TRAP-DARWIN-NEXT: mov x17, x16
813+
; TRAP-DARWIN-NEXT: xpacd x17
814+
; TRAP-DARWIN-NEXT: cmp x16, x17
815+
; TRAP-DARWIN-NEXT: b.eq [[L]]auth_success_18
816+
; TRAP-DARWIN-NEXT: brk #0xc472
817+
; TRAP-DARWIN-NEXT: [[L]]auth_success_18:
818+
; TRAP-DARWIN-NEXT: b [[BB_RETURN:[A-Za-z0-9_.]+]]
819+
; TRAP-DARWIN-NEXT: [[BB_ELSE]]:
820+
; TRAP-DARWIN-NEXT: autdzb x16
821+
; TRAP-DARWIN-NEXT: mov x17, x16
822+
; TRAP-DARWIN-NEXT: xpacd x17
823+
; TRAP-DARWIN-NEXT: cmp x16, x17
824+
; TRAP-DARWIN-NEXT: b.eq [[L]]auth_success_19
825+
; TRAP-DARWIN-NEXT: brk #0xc473
826+
; TRAP-DARWIN-NEXT: [[L]]auth_success_19:
827+
; TRAP-DARWIN-NEXT: [[BB_RETURN]]:
828+
; TRAP-DARWIN-NEXT: ldr x8, [x16]
829+
; TRAP-ELF-NEXT: mov x8, x0
830+
; TRAP-ELF-NEXT: autdza x0
831+
; TRAP-ELF-NEXT: mov x9, x0
832+
; TRAP-ELF-NEXT: xpacd x9
833+
; TRAP-ELF-NEXT: cmp x0, x9
834+
; TRAP-ELF-NEXT: b.eq [[L]]auth_success_18
835+
; TRAP-ELF-NEXT: brk #0xc472
836+
; TRAP-ELF-NEXT: [[L]]auth_success_18:
837+
; TRAP-ELF-NEXT: autdzb x8
838+
; TRAP-ELF-NEXT: mov x9, x8
839+
; TRAP-ELF-NEXT: xpacd x9
840+
; TRAP-ELF-NEXT: cmp x8, x9
841+
; TRAP-ELF-NEXT: b.eq [[L]]auth_success_19
842+
; TRAP-ELF-NEXT: brk #0xc473
843+
; TRAP-ELF-NEXT: [[L]]auth_success_19:
844+
; TRAP-ELF-NEXT: tst w1, #0x1
845+
; TRAP-ELF-NEXT: csel x8, x8, x0, eq
846+
; TRAP-ELF-NEXT: ldr x8, [x8]
847+
; TRAP-NEXT: ldr x8, [x8]
848+
; TRAP-NEXT: ldr x8, [x8]
849+
; TRAP-NEXT: ldr x0, [x8]
850+
; TRAP-NEXT: ret
851+
entry:
852+
br i1 %cond, label %if.then, label %if.else
853+
854+
if.then:
855+
%auted.then = tail call i64 @llvm.ptrauth.auth(i64 %signed, i32 2, i64 0)
856+
br label %return
857+
858+
if.else:
859+
%auted.else = tail call i64 @llvm.ptrauth.auth(i64 %signed, i32 3, i64 0)
860+
br label %return
861+
862+
return:
863+
%auted = phi i64 [ %auted.then, %if.then ], [ %auted.else, %if.else ]
864+
865+
; A sequence of instructions that is common to both "then" and "else"
866+
; branches and is expensive to duplicate.
867+
%ptr.0 = inttoptr i64 %auted to ptr
868+
%ptr.1 = load ptr, ptr %ptr.0
869+
%ptr.2 = load ptr, ptr %ptr.1
870+
%ptr.3 = load ptr, ptr %ptr.2
871+
%ptr.4 = load ptr, ptr %ptr.3
872+
ret ptr %ptr.4
873+
}
874+
758875
declare i64 @llvm.ptrauth.auth(i64, i32, i64)
759876
declare i64 @llvm.ptrauth.resign(i64, i32, i64, i32, i64)

0 commit comments

Comments
 (0)