151 lines
4.3 KiB
Plaintext
151 lines
4.3 KiB
Plaintext
|
# RUN: llc -verify-machineinstrs -mtriple=aarch64-none-linux-gnu \
|
||
|
# RUN: -start-before aarch64-sls-hardening -o - %s \
|
||
|
# RUN: -mattr=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=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
|
||
|
...
|