1; RUN: split-file %s %t
2; RUN: cat %t/main.ll %t/a.ll > %t/a2.ll
3; RUN: cat %t/main.ll %t/b.ll > %t/b2.ll
4; RUN: cat %t/main.ll %t/c.ll > %t/c2.ll
5; RUN: cat %t/main.ll %t/d.ll > %t/d2.ll
6; RUN: cat %t/main.ll %t/e.ll > %t/e2.ll
7; RUN: cat %t/main.ll %t/f.ll > %t/f2.ll
8; RUN: cat %t/main.ll %t/g.ll > %t/g2.ll
9; RUN: cat %t/main.ll %t/h.ll > %t/h2.ll
10; RUN: cat %t/existedGV.ll %t/main.ll %t/h.ll > %t/i2.ll
11; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/a2.ll | FileCheck --check-prefix=CHECK-TLS-FS-40 %s
12; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/b2.ll | FileCheck --check-prefix=CHECK-TLS-FS-40 %s
13; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/c2.ll | FileCheck --check-prefix=CHECK-GLOBAL %s
14; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/d2.ll | FileCheck --check-prefix=CHECK-TLS-FS-40 %s
15; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/e2.ll | FileCheck --check-prefix=CHECK-GS %s
16; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/f2.ll | FileCheck --check-prefix=CHECK-OFFSET %s
17; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/g2.ll | FileCheck --check-prefix=CHECK-NEGATIVE-OFFSET %s
18; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/h2.ll | FileCheck --check-prefix=CHECK-SYM %s
19; RUN: llc -mtriple=x86_64-pc-linux-gnu -o - < %t/i2.ll | FileCheck --check-prefix=CHECK-SYMGV %s
20
21; CHECK-TLS-FS-40:       movq    %fs:40, %rax
22; CHECK-TLS-FS-40:       movq    %fs:40, %rax
23; CHECK-TLS-FS-40-NEXT:  cmpq    16(%rsp), %rax
24; CHECK-TLS-FS-40-NEXT:  jne     .LBB0_2
25; CHECK-TLS-FS-40:       .LBB0_2:
26; CHECK-TLS-FS-40-NEXT:  .cfi_def_cfa_offset 32
27; CHECK-TLS-FS-40-NEXT:  callq   __stack_chk_fail
28
29; CHECK-GS:       movq    %gs:40, %rax
30; CHECK-GS:       movq    %gs:40, %rax
31; CHECK-GS-NEXT:  cmpq    16(%rsp), %rax
32; CHECK-GS-NEXT:  jne     .LBB0_2
33; CHECK-GS:       .LBB0_2:
34; CHECK-GS-NEXT:  .cfi_def_cfa_offset 32
35; CHECK-GS-NEXT:  callq   __stack_chk_fail
36
37; CHECK-OFFSET:       movq    %fs:20, %rax
38; CHECK-OFFSET:       movq    %fs:20, %rax
39; CHECK-OFFSET-NEXT:  cmpq    16(%rsp), %rax
40; CHECK-OFFSET-NEXT:  jne     .LBB0_2
41; CHECK-OFFSET:       .LBB0_2:
42; CHECK-OFFSET-NEXT:  .cfi_def_cfa_offset 32
43; CHECK-OFFSET-NEXT:  callq   __stack_chk_fail
44
45; CHECK-NEGATIVE-OFFSET:       movl    $4294967276, %eax               # imm = 0xFFFFFFEC
46; CHECK-NEGATIVE-OFFSET:       movq    %fs:(%rax), %rcx
47; CHECK-NEGATIVE-OFFSET:       movq    %fs:(%rax), %rax
48; CHECK-NEGATIVE-OFFSET-NEXT:  cmpq    16(%rsp), %rax
49; CHECK-NEGATIVE-OFFSET-NEXT:  jne     .LBB0_2
50; CHECK-NEGATIVE-OFFSET:       .LBB0_2:
51; CHECK-NEGATIVE-OFFSET-NEXT:  .cfi_def_cfa_offset 32
52; CHECK-NEGATIVE-OFFSET-NEXT:  callq   __stack_chk_fail
53
54; CHECK-GLOBAL:       movq    __stack_chk_guard(%rip), %rax
55; CHECK-GLOBAL:       movq    __stack_chk_guard(%rip), %rax
56; CHECK-GLOBAL-NEXT:  cmpq    16(%rsp), %rax
57; CHECK-GLOBAL-NEXT:  jne     .LBB0_2
58; CHECK-GLOBAL:       .LBB0_2:
59; CHECK-GLOBAL-NEXT:  .cfi_def_cfa_offset 32
60; CHECK-GLOBAL-NEXT:  callq   __stack_chk_fail
61
62; CHECK-SYM:         movq    __woof@GOTPCREL(%rip), %rax
63; CHECK-SYM-NEXT:    movq    %fs:(%rax), %rcx
64; CHECK-SYM-NEXT:    movq    %rcx, 16(%rsp)
65; CHECK-SYM:         movq    %fs:(%rax), %rax
66; CHECK-SYM-NEXT:    cmpq    16(%rsp), %rax
67; CHECK-SYM-NEXT:    jne     .LBB0_2
68; CHECK-SYM:         .LBB0_2:
69; CHECK-SYM-NEXT:    .cfi_def_cfa_offset 32
70; CHECK-SYM-NEXT:    callq   __stack_chk_fai
71
72; CHECK-SYMGV:       movq    __woof(%rip), %rax
73; CHECK-SYMGV-NEXT:  movq    %rax, 16(%rsp)
74; CHECK-SYMGV:       cmpq    16(%rsp), %rax
75; CHECK-SYMGV-NEXT:  jne     .LBB0_2
76; CHECK-SYMGV:       .LBB0_2:
77; CHECK-SYMGV-NEXT:  .cfi_def_cfa_offset 32
78; CHECK-SYMGV-NEXT:  callq   __stack_chk_fail
79
80; ModuleID = 't.c'
81;--- existedGV.ll
82
83@__woof = dso_local local_unnamed_addr global ptr null, align 8
84
85;--- main.ll
86
87@.str = private unnamed_addr constant [14 x i8] c"stackoverflow\00", align 1
88@a = dso_local local_unnamed_addr global ptr null, align 8
89
90; Function Attrs: nounwind sspreq uwtable writeonly
91define dso_local i32 @main() local_unnamed_addr #0 {
92entry:
93  %array = alloca [5 x i8], align 1
94  call void @llvm.lifetime.start.p0(i64 5, ptr nonnull %array) #2
95  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 dereferenceable(14) %array, ptr nonnull align 1 dereferenceable(14) @.str, i64 14, i1 false) #2
96  store ptr %array, ptr @a, align 8
97  call void @llvm.lifetime.end.p0(i64 5, ptr nonnull %array) #2
98  ret i32 0
99}
100
101; Function Attrs: argmemonly nounwind willreturn
102declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1
103
104; Function Attrs: argmemonly nounwind willreturn
105declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1
106
107; Function Attrs: argmemonly nounwind willreturn
108declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #1
109
110attributes #0 = { nounwind sspreq uwtable writeonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="none" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" "unsafe-fp-math"="false" "use-soft-float"="false" }
111attributes #1 = { argmemonly nounwind willreturn }
112attributes #2 = { nounwind }
113
114;--- a.ll
115;--- b.ll
116!llvm.module.flags = !{!1}
117!1 = !{i32 2, !"stack-protector-guard", !"tls"}
118;--- c.ll
119!llvm.module.flags = !{!1}
120!1 = !{i32 2, !"stack-protector-guard", !"global"}
121;--- d.ll
122!llvm.module.flags = !{!1}
123!1 = !{i32 2, !"stack-protector-guard-reg", !"fs"}
124;--- e.ll
125!llvm.module.flags = !{!1}
126!1 = !{i32 2, !"stack-protector-guard-reg", !"gs"}
127;--- f.ll
128!llvm.module.flags = !{!1}
129!1 = !{i32 2, !"stack-protector-guard-offset", i32 20}
130;--- g.ll
131!llvm.module.flags = !{!1}
132!1 = !{i32 2, !"stack-protector-guard-offset", i32 -20}
133;--- h.ll
134!llvm.module.flags = !{!1}
135!1 = !{i32 2, !"stack-protector-guard-symbol", !"__woof"}
136