173 lines · plain
1; RUN: split-file %s %t2; RUN: cat %t/main.ll %t/a.ll > %t/a2.ll3; RUN: cat %t/main.ll %t/b.ll > %t/b2.ll4; RUN: cat %t/main.ll %t/c.ll > %t/c2.ll5; RUN: cat %t/main.ll %t/d.ll > %t/d2.ll6; RUN: cat %t/main.ll %t/e.ll > %t/e2.ll7; RUN: cat %t/main.ll %t/f.ll > %t/f2.ll8; RUN: cat %t/main.ll %t/g.ll > %t/g2.ll9; RUN: cat %t/main.ll %t/h.ll > %t/h2.ll10; RUN: cat %t/main.ll %t/i.ll > %t/i2.ll11; RUN: cat %t/main.ll %t/j.ll > %t/j2.ll12; RUN: llc %t/a2.ll -verify-machineinstrs -o - | \13; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-NO-OFFSET %s14; RUN: llc %t/b2.ll -verify-machineinstrs -o - | \15; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-POSITIVE-OFFSET %s16; RUN: llc %t/c2.ll -verify-machineinstrs -o - | \17; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-NEGATIVE-OFFSET %s18; RUN: llc %t/d2.ll -verify-machineinstrs -o - | \19; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-NPOT-OFFSET %s20; RUN: llc %t/e2.ll -verify-machineinstrs -o - | \21; RUN: FileCheck --check-prefix=CHECK --check-prefix=CHECK-NPOT-NEG-OFFSET %s22; RUN: llc %t/f2.ll -verify-machineinstrs -o - | \23; RUN: FileCheck --check-prefix=CHECK-ADD --check-prefix=CHECK-257-OFFSET %s24; RUN: llc %t/g2.ll -verify-machineinstrs -o - | \25; RUN: FileCheck --check-prefix=CHECK-ADD --check-prefix=CHECK-MINUS-257-OFFSET %s26 27; XFAIL28; RUN: not --crash llc %t/h2.ll -o - 2>&1 | \29; RUN: FileCheck --check-prefix=CHECK-BAD-OFFSET %s30; RUN: not --crash llc %t/i2.ll -o - 2>&1 | \31; RUN: FileCheck --check-prefix=CHECK-BAD-OFFSET %s32; RUN: not --crash llc %t/j2.ll -o - 2>&1 | \33; RUN: FileCheck --check-prefix=CHECK-BAD-OFFSET %s34 35;--- main.ll36 37target triple = "aarch64-unknown-linux-gnu"38 39; Verify that we `mrs` from `SP_EL0` twice, rather than load from40; __stack_chk_guard.41define dso_local void @foo(i64 %t) local_unnamed_addr #0 {42; CHECK-LABEL: foo: // @foo43; CHECK: .cfi_startproc44; CHECK: // %bb.0: // %entry45; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill46; CHECK-NEXT: .cfi_def_cfa_offset 1647; CHECK-NEXT: mov x29, sp48; CHECK-NEXT: .cfi_def_cfa w29, 1649; CHECK-NEXT: .cfi_offset w30, -850; CHECK-NEXT: .cfi_offset w29, -1651; CHECK-NEXT: .cfi_remember_state52; CHECK-NEXT: sub sp, sp, #1653; CHECK-NEXT: mrs x8, SP_EL054; CHECK-NEXT: lsl x9, x0, #255; CHECK-NO-OFFSET: ldr x8, [x8]56; CHECK-POSITIVE-OFFSET: ldr x8, [x8, #8]57; CHECK-NEGATIVE-OFFSET: ldur x8, [x8, #-8]58; CHECK-NPOT-OFFSET: ldur x8, [x8, #1]59; CHECK-NPOT-NEG-OFFSET: ldur x8, [x8, #-1]60; CHECK-NEXT: add x9, x9, #1561; CHECK-NEXT: stur x8, [x29, #-8]62; CHECK-NEXT mov x8, sp63; CHECK-NEXT and x9, x9, #0xfffffffffffffff064; CHECK-NEXT sub x0, x8, x965; CHECK-NEXT mov sp, x066; CHECK-NEXT bl baz67; CHECK-NEXT mrs x8, SP_EL068; CHECK-NO-OFFSET: ldr x8, [x8]69; CHECK-POSITIVE-OFFSET: ldr x8, [x8, #8]70; CHECK-NEGATIVE-OFFSET: ldur x8, [x8, #-8]71; CHECK-NPOT-OFFSET: ldur x8, [x8, #1]72; CHECK-NPOT-NEG-OFFSET: ldur x8, [x8, #-1]73; CHECK-NEXT: ldur x9, [x29, #-8]74; CHECK-NEXT: cmp x8, x975; CHECK-NEXT: b.ne .LBB0_276; CHECK-NEXT: // %bb.1: // %entry77; CHECK-NEXT: mov sp, x2978; CHECK-NEXT: .cfi_def_cfa wsp, 1679; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload80; CHECK-NEXT: .cfi_def_cfa_offset 081; CHECK-NEXT: .cfi_restore w3082; CHECK-NEXT: .cfi_restore w2983; CHECK-NEXT: ret84; CHECK-NEXT: .LBB0_2: // %entry85; CHECK-NEXT: .cfi_restore_state86; CHECK-NEXT: bl __stack_chk_fail87; CHECK-NEXT: .Lfunc_end0:88; CHECK-NEXT: .size foo, .Lfunc_end0-foo89; CHECK-NEXT: .cfi_endproc90; CHECK-NEXT: // -- End function91; CHECK-NEXT: .section ".note.GNU-stack","",@progbits92 93 94; CHECK-ADD: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill95; CHECK-ADD-NEXT: .cfi_def_cfa_offset 1696; CHECK-ADD-NEXT: mov x29, sp97; CHECK-ADD-NEXT: .cfi_def_cfa w29, 1698; CHECK-ADD-NEXT: .cfi_offset w30, -899; CHECK-ADD-NEXT: .cfi_offset w29, -16100; CHECK-ADD-NEXT: .cfi_remember_state101; CHECK-ADD-NEXT: sub sp, sp, #16102; CHECK-ADD-NEXT: mrs x8, SP_EL0103; CHECK-ADD-NEXT: lsl x9, x0, #2104; CHECK-MINUS-257-OFFSET: sub x8, x8, #257105; CHECK-257-OFFSET: add x8, x8, #257106; CHECK-ADD-NEXT: ldr x8, [x8]107; CHECK-ADD-NEXT: add x9, x9, #15108; CHECK-ADD-NEXT: and x9, x9, #0xfffffffffffffff0109; CHECK-ADD-NEXT: stur x8, [x29, #-8]110; CHECK-ADD-NEXT: mov x8, sp111; CHECK-ADD-NEXT: sub x0, x8, x9112; CHECK-ADD-NEXT: mov sp, x0113; CHECK-ADD-NEXT: bl baz114; CHECK-ADD-NEXT: mrs x8, SP_EL0115; CHECK-257-OFFSET: add x8, x8, #257116; CHECK-MINUS-257-OFFSET: sub x8, x8, #257117; CHECK-ADD-NEXT: ldr x8, [x8]118; CHECK-ADD-NEXT: ldur x9, [x29, #-8]119; CHECK-ADD-NEXT: cmp x8, x9120; CHECK-ADD-NEXT: b.ne .LBB0_2121; CHECK-ADD-NEXT: // %bb.1: // %entry122; CHECK-ADD-NEXT: mov sp, x29123; CHECK-ADD-NEXT: .cfi_def_cfa wsp, 16124; CHECK-ADD-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload125; CHECK-ADD-NEXT: .cfi_def_cfa_offset 0126; CHECK-ADD-NEXT: .cfi_restore w30127; CHECK-ADD-NEXT: .cfi_restore w29128; CHECK-ADD-NEXT: ret129; CHECK-ADD-NEXT: .LBB0_2: // %entry130; CHECK-ADD-NEXT: .cfi_restore_state131; CHECK-ADD-NEXT: bl __stack_chk_fail132; CHECK-ADD-NEXT: .Lfunc_end0:133; CHECK-ADD-NEXT: .size foo, .Lfunc_end0-foo134; CHECK-ADD-NEXT: .cfi_endproc135; CHECK-ADD-NEXT: // -- End function136; CHECK-ADD-NEXT: .section ".note.GNU-stack","",@progbits137entry:138 %vla = alloca i32, i64 %t, align 4139 call void @baz(ptr nonnull %vla)140 ret void141}142 143declare void @baz(ptr)144 145; CHECK-BAD-OFFSET: LLVM ERROR: Unable to encode Stack Protector Guard Offset146 147attributes #0 = { sspstrong uwtable }148!llvm.module.flags = !{!1, !2, !3}149 150!1 = !{i32 2, !"stack-protector-guard", !"sysreg"}151!2 = !{i32 2, !"stack-protector-guard-reg", !"sp_el0"}152 153;--- a.ll154!3 = !{i32 2, !"stack-protector-guard-offset", i32 0}155;--- b.ll156!3 = !{i32 2, !"stack-protector-guard-offset", i32 8}157;--- c.ll158!3 = !{i32 2, !"stack-protector-guard-offset", i32 -8}159;--- d.ll160!3 = !{i32 2, !"stack-protector-guard-offset", i32 1}161;--- e.ll162!3 = !{i32 2, !"stack-protector-guard-offset", i32 -1}163;--- f.ll164!3 = !{i32 2, !"stack-protector-guard-offset", i32 257}165;--- g.ll166!3 = !{i32 2, !"stack-protector-guard-offset", i32 -257}167;--- h.ll168!3 = !{i32 2, !"stack-protector-guard-offset", i32 32761}169;--- i.ll170!3 = !{i32 2, !"stack-protector-guard-offset", i32 -4096}171;--- j.ll172!3 = !{i32 2, !"stack-protector-guard-offset", i32 4097}173