1; REQUIRES: x86-registered-target
2
3; * Added incorrect logical instructions for: --print=lines,instructions
4;   'bar' and 'foo' showing extra instruction from compiler generated functions:
5;   '_cxx_global_var_init' and '_GLOBAL_sub_l_suite_lexical_01.cpp'
6;
7; * Missing logical instructions for: --print=instructions
8;   Only 'foo' showing logical instructions.
9
10; pr-incorrect-instructions-dwarf-clang.cpp
11;  1 int ABCDE = 56; int XYZ = ABCDE * 65;
12;  2 int bar(int Param) {
13;  3   return Param + 999999 * Param - 66;
14;  4 }
15;  5
16;  6 int foo(int Param) {
17;  7   return Param - bar(Param) / Param * 66 + ABCDE;
18;  8 }
19;  9
20; 10 int test(int P1) {
21; 11  int Local_1 = P1 - ABCDE;
22; 12  {
23; 13    int Local_A = 0;
24; 14    Local_A = P1 + foo(Local_1);
25; 15    ++Local_1;
26; 16  }
27; 17  return Local_1;
28; 18 }
29; 19
30; 20 int main() {
31; 21  return 0;
32; 22 }
33
34; RUN: llvm-debuginfo-analyzer --attribute=level \
35; RUN:                         --print=lines,instructions \
36; RUN:                         %p/Inputs/pr-incorrect-instructions-dwarf-clang.o 2>&1 | \
37; RUN: FileCheck --strict-whitespace -check-prefix=ONE %s
38
39; ONE:      Logical View:
40; ONE-NEXT: [000]           {File} 'pr-incorrect-instructions-dwarf-clang.o'
41; ONE-EMPTY:
42; ONE-NEXT: [001]             {CompileUnit} 'pr-incorrect-instructions-dwarf-clang.cpp'
43; ONE-NEXT: [002]     2         {Function} extern not_inlined 'bar' -> 'int'
44; ONE-NEXT: [003]     2           {Line}
45; ONE-NEXT: [003]                 {Code} 'pushq	%rbp'
46; ONE-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
47; ONE-NEXT: [003]                 {Code} 'movl	%edi, -0x4(%rbp)'
48; ONE-NEXT: [003]     3           {Line}
49; ONE-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %eax'
50; ONE-NEXT: [003]     3           {Line}
51; ONE-NEXT: [003]                 {Code} 'imull	$0xf423f, -0x4(%rbp), %ecx'
52; ONE-NEXT: [003]     3           {Line}
53; ONE-NEXT: [003]                 {Code} 'addl	%ecx, %eax'
54; ONE-NEXT: [003]     3           {Line}
55; ONE-NEXT: [003]                 {Code} 'subl	$0x42, %eax'
56; ONE-NEXT: [003]     3           {Line}
57; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
58; ONE-NEXT: [003]                 {Code} 'retq'
59; ONE-NEXT: [002]     6         {Function} extern not_inlined 'foo' -> 'int'
60; ONE-NEXT: [003]     6           {Line}
61; ONE-NEXT: [003]                 {Code} 'pushq	%rbp'
62; ONE-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
63; ONE-NEXT: [003]                 {Code} 'subq	$0x10, %rsp'
64; ONE-NEXT: [003]                 {Code} 'movl	%edi, -0x4(%rbp)'
65; ONE-NEXT: [003]     7           {Line}
66; ONE-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %eax'
67; ONE-NEXT: [003]                 {Code} 'movl	%eax, -0x8(%rbp)'
68; ONE-NEXT: [003]     7           {Line}
69; ONE-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %edi'
70; ONE-NEXT: [003]     7           {Line}
71; ONE-NEXT: [003]                 {Code} 'callq	0x0'
72; ONE-NEXT: [003]     7           {Line}
73; ONE-NEXT: [003]                 {Code} 'cltd'
74; ONE-NEXT: [003]                 {Code} 'idivl	-0x4(%rbp)'
75; ONE-NEXT: [003]                 {Code} 'movl	%eax, %ecx'
76; ONE-NEXT: [003]                 {Code} 'movl	-0x8(%rbp), %eax'
77; ONE-NEXT: [003]     7           {Line}
78; ONE-NEXT: [003]                 {Code} 'imull	$0x42, %ecx, %ecx'
79; ONE-NEXT: [003]     7           {Line}
80; ONE-NEXT: [003]                 {Code} 'subl	%ecx, %eax'
81; ONE-NEXT: [003]     7           {Line}
82; ONE-NEXT: [003]                 {Code} 'addl	(%rip), %eax'
83; ONE-NEXT: [003]     7           {Line}
84; ONE-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
85; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
86; ONE-NEXT: [003]                 {Code} 'retq'
87; ONE-NEXT: [003]                 {Code} 'data16'
88; ONE-NEXT: [002]    10         {Function} extern not_inlined 'test' -> 'int'
89; ONE-NEXT: [003]                 {Block}
90; ONE-NEXT: [004]    13             {Line}
91; ONE-NEXT: [004]                   {Code} 'movl	$0x0, -0xc(%rbp)'
92; ONE-NEXT: [004]    14             {Line}
93; ONE-NEXT: [004]                   {Code} 'movl	-0x4(%rbp), %eax'
94; ONE-NEXT: [004]                   {Code} 'movl	%eax, -0x10(%rbp)'
95; ONE-NEXT: [004]    14             {Line}
96; ONE-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %edi'
97; ONE-NEXT: [004]    14             {Line}
98; ONE-NEXT: [004]                   {Code} 'callq	0x0'
99; ONE-NEXT: [004]                   {Code} 'movl	%eax, %ecx'
100; ONE-NEXT: [004]                   {Code} 'movl	-0x10(%rbp), %eax'
101; ONE-NEXT: [004]    14             {Line}
102; ONE-NEXT: [004]                   {Code} 'addl	%ecx, %eax'
103; ONE-NEXT: [004]    14             {Line}
104; ONE-NEXT: [004]                   {Code} 'movl	%eax, -0xc(%rbp)'
105; ONE-NEXT: [004]    15             {Line}
106; ONE-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %eax'
107; ONE-NEXT: [004]                   {Code} 'addl	$0x1, %eax'
108; ONE-NEXT: [004]                   {Code} 'movl	%eax, -0x8(%rbp)'
109; ONE-NEXT: [004]    17             {Line}
110; ONE-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %eax'
111; ONE-NEXT: [003]    10           {Line}
112; ONE-NEXT: [003]                 {Code} 'pushq	%rbp'
113; ONE-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
114; ONE-NEXT: [003]                 {Code} 'subq	$0x10, %rsp'
115; ONE-NEXT: [003]                 {Code} 'movl	%edi, -0x4(%rbp)'
116; ONE-NEXT: [003]    11           {Line}
117; ONE-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %eax'
118; ONE-NEXT: [003]    11           {Line}
119; ONE-NEXT: [003]                 {Code} 'subl	(%rip), %eax'
120; ONE-NEXT: [003]    11           {Line}
121; ONE-NEXT: [003]                 {Code} 'movl	%eax, -0x8(%rbp)'
122; ONE-NEXT: [003]    17           {Line}
123; ONE-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
124; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
125; ONE-NEXT: [003]                 {Code} 'retq'
126; ONE-NEXT: [002]    20         {Function} extern not_inlined 'main' -> 'int'
127; ONE-NEXT: [003]    20           {Line}
128; ONE-NEXT: [003]                 {Code} 'pushq	%rbp'
129; ONE-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
130; ONE-NEXT: [003]                 {Code} 'movl	$0x0, -0x4(%rbp)'
131; ONE-NEXT: [003]    21           {Line}
132; ONE-NEXT: [003]                 {Code} 'xorl	%eax, %eax'
133; ONE-NEXT: [003]                 {Code} 'popq	%rbp'
134; ONE-NEXT: [003]                 {Code} 'retq'
135; ONE-NEXT: [003]    21           {Line}
136
137; RUN: llvm-debuginfo-analyzer --attribute=level \
138; RUN:                         --print=instructions \
139; RUN:                         %p/Inputs/pr-incorrect-instructions-dwarf-clang.o 2>&1 | \
140; RUN: FileCheck --strict-whitespace -check-prefix=TWO %s
141
142; TWO:      Logical View:
143; TWO-NEXT: [000]           {File} 'pr-incorrect-instructions-dwarf-clang.o'
144; TWO-EMPTY:
145; TWO-NEXT: [001]             {CompileUnit} 'pr-incorrect-instructions-dwarf-clang.cpp'
146; TWO-NEXT: [002]     2         {Function} extern not_inlined 'bar' -> 'int'
147; TWO-NEXT: [003]                 {Code} 'pushq	%rbp'
148; TWO-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
149; TWO-NEXT: [003]                 {Code} 'movl	%edi, -0x4(%rbp)'
150; TWO-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %eax'
151; TWO-NEXT: [003]                 {Code} 'imull	$0xf423f, -0x4(%rbp), %ecx'
152; TWO-NEXT: [003]                 {Code} 'addl	%ecx, %eax'
153; TWO-NEXT: [003]                 {Code} 'subl	$0x42, %eax'
154; TWO-NEXT: [003]                 {Code} 'popq	%rbp'
155; TWO-NEXT: [003]                 {Code} 'retq'
156; TWO-NEXT: [002]     6         {Function} extern not_inlined 'foo' -> 'int'
157; TWO-NEXT: [003]                 {Code} 'pushq	%rbp'
158; TWO-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
159; TWO-NEXT: [003]                 {Code} 'subq	$0x10, %rsp'
160; TWO-NEXT: [003]                 {Code} 'movl	%edi, -0x4(%rbp)'
161; TWO-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %eax'
162; TWO-NEXT: [003]                 {Code} 'movl	%eax, -0x8(%rbp)'
163; TWO-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %edi'
164; TWO-NEXT: [003]                 {Code} 'callq	0x0'
165; TWO-NEXT: [003]                 {Code} 'cltd'
166; TWO-NEXT: [003]                 {Code} 'idivl	-0x4(%rbp)'
167; TWO-NEXT: [003]                 {Code} 'movl	%eax, %ecx'
168; TWO-NEXT: [003]                 {Code} 'movl	-0x8(%rbp), %eax'
169; TWO-NEXT: [003]                 {Code} 'imull	$0x42, %ecx, %ecx'
170; TWO-NEXT: [003]                 {Code} 'subl	%ecx, %eax'
171; TWO-NEXT: [003]                 {Code} 'addl	(%rip), %eax'
172; TWO-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
173; TWO-NEXT: [003]                 {Code} 'popq	%rbp'
174; TWO-NEXT: [003]                 {Code} 'retq'
175; TWO-NEXT: [003]                 {Code} 'data16'
176; TWO-NEXT: [002]    10         {Function} extern not_inlined 'test' -> 'int'
177; TWO-NEXT: [003]                 {Block}
178; TWO-NEXT: [004]                   {Code} 'movl	$0x0, -0xc(%rbp)'
179; TWO-NEXT: [004]                   {Code} 'movl	-0x4(%rbp), %eax'
180; TWO-NEXT: [004]                   {Code} 'movl	%eax, -0x10(%rbp)'
181; TWO-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %edi'
182; TWO-NEXT: [004]                   {Code} 'callq	0x0'
183; TWO-NEXT: [004]                   {Code} 'movl	%eax, %ecx'
184; TWO-NEXT: [004]                   {Code} 'movl	-0x10(%rbp), %eax'
185; TWO-NEXT: [004]                   {Code} 'addl	%ecx, %eax'
186; TWO-NEXT: [004]                   {Code} 'movl	%eax, -0xc(%rbp)'
187; TWO-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %eax'
188; TWO-NEXT: [004]                   {Code} 'addl	$0x1, %eax'
189; TWO-NEXT: [004]                   {Code} 'movl	%eax, -0x8(%rbp)'
190; TWO-NEXT: [004]                   {Code} 'movl	-0x8(%rbp), %eax'
191; TWO-NEXT: [003]                 {Code} 'pushq	%rbp'
192; TWO-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
193; TWO-NEXT: [003]                 {Code} 'subq	$0x10, %rsp'
194; TWO-NEXT: [003]                 {Code} 'movl	%edi, -0x4(%rbp)'
195; TWO-NEXT: [003]                 {Code} 'movl	-0x4(%rbp), %eax'
196; TWO-NEXT: [003]                 {Code} 'subl	(%rip), %eax'
197; TWO-NEXT: [003]                 {Code} 'movl	%eax, -0x8(%rbp)'
198; TWO-NEXT: [003]                 {Code} 'addq	$0x10, %rsp'
199; TWO-NEXT: [003]                 {Code} 'popq	%rbp'
200; TWO-NEXT: [003]                 {Code} 'retq'
201; TWO-NEXT: [002]    20         {Function} extern not_inlined 'main' -> 'int'
202; TWO-NEXT: [003]                 {Code} 'pushq	%rbp'
203; TWO-NEXT: [003]                 {Code} 'movq	%rsp, %rbp'
204; TWO-NEXT: [003]                 {Code} 'movl	$0x0, -0x4(%rbp)'
205; TWO-NEXT: [003]                 {Code} 'xorl	%eax, %eax'
206; TWO-NEXT: [003]                 {Code} 'popq	%rbp'
207; TWO-NEXT: [003]                 {Code} 'retq'
208