xref: /llvm-project/llvm/test/CodeGen/AArch64/stack-guard-vaarg.ll (revision e018cbf7208b3d34f18997ddee84c66cee32fb1b)
1; RUN: llc --frame-pointer=all -mtriple=aarch64-- < %s | FileCheck %s
2
3; PR25610: -fstack-protector places the canary in the wrong place on arm64 with
4;          va_args
5
6%struct.__va_list = type { ptr, ptr, ptr, i32, i32 }
7
8; CHECK-LABEL: test
9; CHECK: ldr [[GUARD:x[0-9]+]]{{.*}}:lo12:__stack_chk_guard]
10; Make sure the canary is placed relative to the frame pointer, not
11; the stack pointer.
12; CHECK: stur [[GUARD]], [x29, #-8]
13define void @test(ptr %i, ...) #0 {
14entry:
15  %buf = alloca [10 x i8], align 1
16  %ap = alloca %struct.__va_list, align 8
17  %tmp = alloca %struct.__va_list, align 8
18  call void @llvm.lifetime.start(i64 10, ptr %buf)
19  call void @llvm.lifetime.start(i64 32, ptr %ap)
20  call void @llvm.va_start(ptr %ap)
21  call void @llvm.memcpy.p0.p0.i64(ptr %tmp, ptr %ap, i64 32, i32 8, i1 false)
22  call void @baz(ptr %i, ptr nonnull %tmp)
23  call void @bar(ptr %buf)
24  call void @llvm.va_end(ptr %ap)
25  call void @llvm.lifetime.end(i64 32, ptr %ap)
26  call void @llvm.lifetime.end(i64 10, ptr %buf)
27  ret void
28}
29
30declare void @llvm.lifetime.start(i64, ptr nocapture)
31declare void @llvm.va_start(ptr)
32declare void @baz(ptr, ptr)
33declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture readonly, i64, i32, i1)
34declare void @bar(ptr)
35declare void @llvm.va_end(ptr)
36declare void @llvm.lifetime.end(i64, ptr nocapture)
37
38attributes #0 = { noinline nounwind optnone ssp }
39
40!llvm.module.flags = !{!0}
41!0 = !{i32 7, !"direct-access-external-data", i32 1}
42