@@ -755,5 +755,128 @@ 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: tbz w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]
774+ ; UNCHECKED-ELF-NEXT: %bb.1:
775+ ; UNCHECKED-ELF-NEXT: autdza x0
776+ ; UNCHECKED-ELF-NEXT: b [[BB_RETURN:[A-Za-z0-9_.]+]]
777+ ; UNCHECKED-ELF-NEXT: [[BB_ELSE]]:
778+ ; UNCHECKED-ELF-NEXT: autdzb x0
779+ ; UNCHECKED-ELF-NEXT: [[BB_RETURN]]:
780+ ; UNCHECKED-ELF-NEXT: ldr x8, [x0]
781+ ; UNCHECKED-NEXT: ldr x8, [x8]
782+ ; UNCHECKED-NEXT: ldr x8, [x8]
783+ ; UNCHECKED-NEXT: ldr x0, [x8]
784+ ; UNCHECKED-NEXT: ret
785+ ;
786+ ; CHECKED-LABEL: auth_speculation:
787+ ; CHECKED: %bb.0:
788+ ; CHECKED-DARWIN-NEXT: mov x16, x0
789+ ; CHECKED-DARWIN-NEXT: tbz w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]
790+ ; CHECKED-DARWIN-NEXT: %bb.1:
791+ ; CHECKED-DARWIN-NEXT: autdza x16
792+ ; CHECKED-DARWIN-NEXT: b [[BB_RETURN:[A-Za-z0-9_.]+]]
793+ ; CHECKED-DARWIN-NEXT: [[BB_ELSE]]:
794+ ; CHECKED-DARWIN-NEXT: autdzb x16
795+ ; CHECKED-DARWIN-NEXT: [[BB_RETURN]]:
796+ ; CHECKED-DARWIN-NEXT: ldr x8, [x16]
797+ ; CHECKED-ELF-NEXT: tbz w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]
798+ ; CHECKED-ELF-NEXT: %bb.1:
799+ ; CHECKED-ELF-NEXT: autdza x0
800+ ; CHECKED-ELF-NEXT: b [[BB_RETURN:[A-Za-z0-9_.]+]]
801+ ; CHECKED-ELF-NEXT: [[BB_ELSE]]:
802+ ; CHECKED-ELF-NEXT: autdzb x0
803+ ; CHECKED-ELF-NEXT: [[BB_RETURN]]:
804+ ; CHECKED-ELF-NEXT: ldr x8, [x0]
805+ ; CHECKED-NEXT: ldr x8, [x8]
806+ ; CHECKED-NEXT: ldr x8, [x8]
807+ ; CHECKED-NEXT: ldr x0, [x8]
808+ ; CHECKED-NEXT: ret
809+ ;
810+ ; TRAP-LABEL: auth_speculation:
811+ ; TRAP: %bb.0:
812+ ; TRAP-DARWIN-NEXT: mov x16, x0
813+ ; TRAP-DARWIN-NEXT: tbz w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]
814+ ; TRAP-DARWIN-NEXT: %bb.1:
815+ ; TRAP-DARWIN-NEXT: autdza x16
816+ ; TRAP-DARWIN-NEXT: mov x17, x16
817+ ; TRAP-DARWIN-NEXT: xpacd x17
818+ ; TRAP-DARWIN-NEXT: cmp x16, x17
819+ ; TRAP-DARWIN-NEXT: b.eq [[L]]auth_success_18
820+ ; TRAP-DARWIN-NEXT: brk #0xc472
821+ ; TRAP-DARWIN-NEXT: [[L]]auth_success_18:
822+ ; TRAP-DARWIN-NEXT: b [[BB_RETURN:[A-Za-z0-9_.]+]]
823+ ; TRAP-DARWIN-NEXT: [[BB_ELSE]]:
824+ ; TRAP-DARWIN-NEXT: autdzb x16
825+ ; TRAP-DARWIN-NEXT: mov x17, x16
826+ ; TRAP-DARWIN-NEXT: xpacd x17
827+ ; TRAP-DARWIN-NEXT: cmp x16, x17
828+ ; TRAP-DARWIN-NEXT: b.eq [[L]]auth_success_19
829+ ; TRAP-DARWIN-NEXT: brk #0xc473
830+ ; TRAP-DARWIN-NEXT: [[L]]auth_success_19:
831+ ; TRAP-DARWIN-NEXT: [[BB_RETURN]]:
832+ ; TRAP-DARWIN-NEXT: ldr x8, [x16]
833+ ; TRAP-ELF-NEXT: tbz w1, #0, [[BB_ELSE:[A-Za-z0-9_.]+]]
834+ ; TRAP-ELF-NEXT: %bb.1:
835+ ; TRAP-ELF-NEXT: autdza x0
836+ ; TRAP-ELF-NEXT: mov x8, x0
837+ ; TRAP-ELF-NEXT: xpacd x8
838+ ; TRAP-ELF-NEXT: cmp x0, x8
839+ ; TRAP-ELF-NEXT: b.eq [[L]]auth_success_18
840+ ; TRAP-ELF-NEXT: brk #0xc472
841+ ; TRAP-ELF-NEXT: [[L]]auth_success_18:
842+ ; TRAP-ELF-NEXT: b [[BB_RETURN:[A-Za-z0-9_.]+]]
843+ ; TRAP-ELF-NEXT: [[BB_ELSE]]:
844+ ; TRAP-ELF-NEXT: autdzb x0
845+ ; TRAP-ELF-NEXT: mov x8, x0
846+ ; TRAP-ELF-NEXT: xpacd x8
847+ ; TRAP-ELF-NEXT: cmp x0, x8
848+ ; TRAP-ELF-NEXT: b.eq [[L]]auth_success_19
849+ ; TRAP-ELF-NEXT: brk #0xc473
850+ ; TRAP-ELF-NEXT: [[L]]auth_success_19:
851+ ; TRAP-ELF-NEXT: [[BB_RETURN]]:
852+ ; TRAP-ELF-NEXT: ldr x8, [x0]
853+ ; TRAP-NEXT: ldr x8, [x8]
854+ ; TRAP-NEXT: ldr x8, [x8]
855+ ; TRAP-NEXT: ldr x0, [x8]
856+ ; TRAP-NEXT: ret
857+ entry:
858+ br i1 %cond , label %if.then , label %if.else
859+
860+ if.then:
861+ %auted.then = tail call i64 @llvm.ptrauth.auth (i64 %signed , i32 2 , i64 0 )
862+ br label %return
863+
864+ if.else:
865+ %auted.else = tail call i64 @llvm.ptrauth.auth (i64 %signed , i32 3 , i64 0 )
866+ br label %return
867+
868+ return:
869+ %auted = phi i64 [ %auted.then , %if.then ], [ %auted.else , %if.else ]
870+
871+ ; A sequence of instructions that is common to both "then" and "else"
872+ ; branches and is expensive to duplicate.
873+ %ptr.0 = inttoptr i64 %auted to ptr
874+ %ptr.1 = load ptr , ptr %ptr.0
875+ %ptr.2 = load ptr , ptr %ptr.1
876+ %ptr.3 = load ptr , ptr %ptr.2
877+ %ptr.4 = load ptr , ptr %ptr.3
878+ ret ptr %ptr.4
879+ }
880+
758881declare i64 @llvm.ptrauth.auth (i64 , i32 , i64 )
759882declare i64 @llvm.ptrauth.resign (i64 , i32 , i64 , i32 , i64 )
0 commit comments