# RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu \ # RUN: -start-before aarch64-sls-hardening -o - %s \ # RUN: -mattr=+pauth,+harden-sls-retbr \ # RUN: | FileCheck %s --check-prefixes=CHECK,ISBDSB # RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu \ # RUN: -start-before aarch64-sls-hardening -o - %s \ # RUN: -mattr=+pauth,+harden-sls-retbr -mattr=+sb \ # RUN: | FileCheck %s --check-prefixes=CHECK,SB # Check that the SLS hardening pass also protects BRA* indirect branches that # llvm currently does not generate. --- | @ptr_aa = private unnamed_addr constant [2 x i8*] [i8* blockaddress(@br_aa, %return), i8* blockaddress(@br_aa, %l2)], align 8 @ptr_aaz = private unnamed_addr constant [2 x i8*] [i8* blockaddress(@br_aaz, %return), i8* blockaddress(@br_aaz, %l2)], align 8 @ptr_ab = private unnamed_addr constant [2 x i8*] [i8* blockaddress(@br_ab, %return), i8* blockaddress(@br_ab, %l2)], align 8 @ptr_abz = private unnamed_addr constant [2 x i8*] [i8* blockaddress(@br_abz, %return), i8* blockaddress(@br_abz, %l2)], align 8 define dso_local i32 @br_aa(i32 %a, i32 %b, i32 %i) { entry: br label %l2 l2: br label %return return: ret i32 undef } define dso_local i32 @br_aaz(i32 %a, i32 %b, i32 %i) { entry: br label %l2 l2: br label %return return: ret i32 undef } define dso_local i32 @br_ab(i32 %a, i32 %b, i32 %i) { entry: br label %l2 l2: br label %return return: ret i32 undef } define dso_local i32 @br_abz(i32 %a, i32 %b, i32 %i) { entry: br label %l2 l2: br label %return return: ret i32 undef } ... --- name: br_aa tracksRegLiveness: true body: | ; CHECK-LABEL: br_aa: bb.0.entry: successors: %bb.2, %bb.1 liveins: $w2 $x8 = ADRP target-flags(aarch64-page) @ptr_aa renamable $x8 = ADDXri $x8, target-flags(aarch64-pageoff, aarch64-nc) @ptr_aa, 0 renamable $x8 = LDRXroW killed renamable $x8, killed renamable $w2, 1, 1 BRAA killed renamable $x8, $sp ; CHECK: braa x8, sp ; ISBDSB-NEXT: dsb sy ; ISBDSB-NEXT: isb ; SB-NEXT: {{ sb$}} bb.1.l2 (address-taken): renamable $w0 = MOVZWi 1, 0 RET undef $lr, implicit $w0 bb.2.return (address-taken): $w0 = ORRWrs $wzr, $wzr, 0 RET undef $lr, implicit $w0 ... --- name: br_aaz tracksRegLiveness: true body: | ; CHECK-LABEL: br_aaz: bb.0.entry: successors: %bb.2, %bb.1 liveins: $w2 $x8 = ADRP target-flags(aarch64-page) @ptr_aaz renamable $x8 = ADDXri $x8, target-flags(aarch64-pageoff, aarch64-nc) @ptr_aaz, 0 renamable $x8 = LDRXroW killed renamable $x8, killed renamable $w2, 1, 1 BRAAZ killed renamable $x8 ; CHECK: braaz x8 ; ISBDSB-NEXT: dsb sy ; ISBDSB-NEXT: isb ; SB-NEXT: {{ sb$}} bb.1.l2 (address-taken): renamable $w0 = MOVZWi 1, 0 RET undef $lr, implicit $w0 bb.2.return (address-taken): $w0 = ORRWrs $wzr, $wzr, 0 RET undef $lr, implicit $w0 ... --- name: br_ab tracksRegLiveness: true body: | ; CHECK-LABEL: br_ab: bb.0.entry: successors: %bb.2, %bb.1 liveins: $w2 $x8 = ADRP target-flags(aarch64-page) @ptr_ab renamable $x8 = ADDXri $x8, target-flags(aarch64-pageoff, aarch64-nc) @ptr_ab, 0 renamable $x8 = LDRXroW killed renamable $x8, killed renamable $w2, 1, 1 BRAA killed renamable $x8, $sp ; CHECK: braa x8, sp ; ISBDSB-NEXT: dsb sy ; ISBDSB-NEXT: isb ; SB-NEXT: {{ sb$}} bb.1.l2 (address-taken): renamable $w0 = MOVZWi 1, 0 RET undef $lr, implicit $w0 bb.2.return (address-taken): $w0 = ORRWrs $wzr, $wzr, 0 RET undef $lr, implicit $w0 ... --- name: br_abz tracksRegLiveness: true body: | ; CHECK-LABEL: br_abz: bb.0.entry: successors: %bb.2, %bb.1 liveins: $w2 $x8 = ADRP target-flags(aarch64-page) @ptr_abz renamable $x8 = ADDXri $x8, target-flags(aarch64-pageoff, aarch64-nc) @ptr_abz, 0 renamable $x8 = LDRXroW killed renamable $x8, killed renamable $w2, 1, 1 BRAAZ killed renamable $x8 ; CHECK: braaz x8 ; ISBDSB-NEXT: dsb sy ; ISBDSB-NEXT: isb ; SB-NEXT: {{ sb$}} bb.1.l2 (address-taken): renamable $w0 = MOVZWi 1, 0 RET undef $lr, implicit $w0 bb.2.return (address-taken): $w0 = ORRWrs $wzr, $wzr, 0 RET undef $lr, implicit $w0 ...