@@ -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+
758875declare i64 @llvm.ptrauth.auth (i64 , i32 , i64 )
759876declare i64 @llvm.ptrauth.resign (i64 , i32 , i64 , i32 , i64 )
0 commit comments