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