1 ; REQUIRES: x86-registered-target
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'
7 ; * Missing logical instructions for: --print=instructions
8 ; Only 'foo' showing logical instructions.
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;
16 ; 6 int foo(int Param) {
17 ; 7 return Param - bar(Param) / Param * 66 + ABCDE;
20 ; 10 int test(int P1) {
21 ; 11 int Local_1 = P1 - ABCDE;
24 ; 14 Local_A = P1 + foo(Local_1);
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
40 ; ONE-NEXT: [000] {File} 'pr-incorrect-instructions-dwarf-clang.o'
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}
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
143 ; TWO-NEXT: [000] {File} 'pr-incorrect-instructions-dwarf-clang.o'
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'