1; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7                             | FileCheck %s
2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 -fast-isel -fast-isel-abort=1 | FileCheck %s
3
4; CHECK-LABEL:  .section  __LLVM_STACKMAPS,__llvm_stackmaps
5; CHECK-NEXT:  __LLVM_StackMaps:
6; Header
7; CHECK-NEXT:   .byte 2
8; CHECK-NEXT:   .byte 0
9; CHECK-NEXT:   .short 0
10; Num Functions
11; CHECK-NEXT:   .long 4
12; Num LargeConstants
13; CHECK-NEXT:   .long 3
14; Num Callsites
15; CHECK-NEXT:   .long 7
16
17; Functions and stack size
18; CHECK-NEXT:   .quad _constantargs
19; CHECK-NEXT:   .quad 8
20; CHECK-NEXT:   .quad 1
21; CHECK-NEXT:   .quad _liveConstant
22; CHECK-NEXT:   .quad 8
23; CHECK-NEXT:   .quad 1
24; CHECK-NEXT:   .quad _directFrameIdx
25; CHECK-NEXT:   .quad 40
26; CHECK-NEXT:   .quad 1
27; CHECK-NEXT:   .quad _longid
28; CHECK-NEXT:   .quad 8
29; CHECK-NEXT:   .quad 4
30
31; Large Constants
32; CHECK-NEXT:   .quad   2147483648
33; CHECK-NEXT:   .quad   4294967295
34; CHECK-NEXT:   .quad   4294967296
35
36; Callsites
37; Constant arguments
38;
39; CHECK-NEXT:   .quad   1
40; CHECK-NEXT:   .long   L{{.*}}-_constantargs
41; CHECK-NEXT:   .short  0
42; CHECK-NEXT:   .short  12
43; SmallConstant
44; CHECK-NEXT:   .byte   4
45; CHECK-NEXT:   .byte   8
46; CHECK-NEXT:   .short  0
47; CHECK-NEXT:   .long   -1
48; SmallConstant
49; CHECK-NEXT:   .byte   4
50; CHECK-NEXT:   .byte   8
51; CHECK-NEXT:   .short  0
52; CHECK-NEXT:   .long   -1
53; SmallConstant
54; CHECK-NEXT:   .byte   4
55; CHECK-NEXT:   .byte   8
56; CHECK-NEXT:   .short  0
57; CHECK-NEXT:   .long   65536
58; SmallConstant
59; CHECK-NEXT:   .byte   4
60; CHECK-NEXT:   .byte   8
61; CHECK-NEXT:   .short  0
62; CHECK-NEXT:   .long   2000000000
63; SmallConstant
64; CHECK-NEXT:   .byte   4
65; CHECK-NEXT:   .byte   8
66; CHECK-NEXT:   .short  0
67; CHECK-NEXT:   .long   2147483647
68; SmallConstant
69; CHECK-NEXT:   .byte   4
70; CHECK-NEXT:   .byte   8
71; CHECK-NEXT:   .short  0
72; CHECK-NEXT:   .long   -1
73; SmallConstant
74; CHECK-NEXT:   .byte   4
75; CHECK-NEXT:   .byte   8
76; CHECK-NEXT:   .short  0
77; CHECK-NEXT:   .long   -1
78; SmallConstant
79; CHECK-NEXT:   .byte   4
80; CHECK-NEXT:   .byte   8
81; CHECK-NEXT:   .short  0
82; CHECK-NEXT:   .long   0
83; LargeConstant at index 0
84; CHECK-NEXT:   .byte   5
85; CHECK-NEXT:   .byte   8
86; CHECK-NEXT:   .short  0
87; CHECK-NEXT:   .long   0
88; LargeConstant at index 1
89; CHECK-NEXT:   .byte   5
90; CHECK-NEXT:   .byte   8
91; CHECK-NEXT:   .short  0
92; CHECK-NEXT:   .long   1
93; LargeConstant at index 2
94; CHECK-NEXT:   .byte   5
95; CHECK-NEXT:   .byte   8
96; CHECK-NEXT:   .short  0
97; CHECK-NEXT:   .long   2
98; SmallConstant
99; CHECK-NEXT:   .byte   4
100; CHECK-NEXT:   .byte   8
101; CHECK-NEXT:   .short  0
102; CHECK-NEXT:   .long   -1
103
104define void @constantargs() {
105entry:
106  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 1, i32 15, i16 65535, i16 -1, i32 65536, i32 2000000000, i32 2147483647, i32 -1, i32 4294967295, i32 4294967296, i64 2147483648, i64 4294967295, i64 4294967296, i64 -1)
107  ret void
108}
109
110; Map a constant value.
111;
112; CHECK-LABEL:  .long L{{.*}}-_liveConstant
113; CHECK-NEXT:   .short 0
114; 1 location
115; CHECK-NEXT:   .short 1
116; Loc 0: SmallConstant
117; CHECK-NEXT:   .byte   4
118; CHECK-NEXT:   .byte   8
119; CHECK-NEXT:   .short  0
120; CHECK-NEXT:   .long   33
121
122define void @liveConstant() {
123  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 15, i32 5, i32 33)
124  ret void
125}
126
127; Directly map an alloca's address.
128;
129; Callsite 16
130; CHECK-LABEL:  .long L{{.*}}-_directFrameIdx
131; CHECK-NEXT:   .short 0
132; 1 location
133; CHECK-NEXT:   .short	1
134; Loc 0: Direct RBP - ofs
135; CHECK-NEXT:   .byte	2
136; CHECK-NEXT:   .byte	8
137; CHECK-NEXT:   .short	6
138; CHECK-NEXT:   .long
139
140define void @directFrameIdx() {
141entry:
142  %metadata1 = alloca i64, i32 3, align 8
143  store i64 11, i64* %metadata1
144  store i64 12, i64* %metadata1
145  store i64 13, i64* %metadata1
146  call void (i64, i32, ...) @llvm.experimental.stackmap(i64 16, i32 0, i64* %metadata1)
147  ret void
148}
149
150; Test a 64-bit ID.
151;
152; CHECK:        .quad 4294967295
153; CHECK-LABEL:  .long L{{.*}}-_longid
154; CHECK:        .quad 4294967296
155; CHECK-LABEL:  .long L{{.*}}-_longid
156; CHECK:        .quad 9223372036854775807
157; CHECK-LABEL:  .long L{{.*}}-_longid
158; CHECK:        .quad -1
159; CHECK-LABEL:  .long L{{.*}}-_longid
160define void @longid() {
161entry:
162  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 4294967295, i32 0)
163  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 4294967296, i32 0)
164  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 9223372036854775807, i32 0)
165  tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 -1, i32 0)
166  ret void
167}
168
169declare void @llvm.experimental.stackmap(i64, i32, ...)
170