File: optnone-simple-functions.cpp

package info (click to toggle)
llvm-toolchain-18 1%3A18.1.8-18
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,908,340 kB
  • sloc: cpp: 6,667,937; ansic: 1,440,452; asm: 883,619; python: 230,549; objc: 76,880; f90: 74,238; lisp: 35,989; pascal: 16,571; sh: 10,229; perl: 7,459; ml: 5,047; awk: 3,523; makefile: 2,987; javascript: 2,149; xml: 892; fortran: 649; cs: 573
file content (106 lines) | stat: -rw-r--r-- 4,351 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// RUN: %clang++ -std=gnu++11 -O2 -g %s -o %t
// RUN: %dexter --fail-lt 1.0 -w \
// RUN:     --binary %t --debugger 'lldb' -- %s
// RUN: %clang++ -std=gnu++11 -O0 -g %s -o %t
// RUN: %dexter --fail-lt 1.0 -w \
// RUN:     --binary %t --debugger 'lldb' -- %s

// REQUIRES: lldb, D136396
// Currently getting intermittent failures on darwin.
// UNSUPPORTED: system-windows, system-darwin

//// Check that the debugging experience with __attribute__((optnone)) at O2
//// matches O0. Test simple functions performing simple arithmetic
//// operations and small loops.

__attribute__((optnone))
int test1(int test1_a, int test1_b) {
  int test1_result = 0;
  // DexLabel('test1_start')
  test1_result = test1_a + test1_b; // DexExpectStepOrder(1)
  return test1_result; // DexExpectStepOrder(2)
  // DexLabel('test1_end')
}
// DexExpectWatchValue('test1_a', 3, from_line=ref('test1_start'), to_line=ref('test1_end'))
// DexExpectWatchValue('test1_b', 4, from_line=ref('test1_start'), to_line=ref('test1_end'))
// DexExpectWatchValue('test1_result', 0, 7, from_line=ref('test1_start'), to_line=ref('test1_end'))

__attribute__((optnone))
int test2(int test2_a, int test2_b) {
  int test2_result = test2_a + test2_a + test2_a + test2_a;  // DexExpectStepOrder(3)
  // DexLabel('test2_start')
  return test2_a << 2;   // DexExpectStepOrder(4)
  // DexLabel('test2_end')
}
// DexExpectWatchValue('test2_a', 1, from_line=ref('test2_start'), to_line=ref('test2_end'))
// DexExpectWatchValue('test2_b', 2, from_line=ref('test2_start'), to_line=ref('test2_end'))
// DexExpectWatchValue('test2_result', 4, from_line=ref('test2_start'), to_line=ref('test2_end'))

__attribute__((optnone))
int test3(int test3_a, int test3_b) {
  int test3_temp1 = 0, test3_temp2 = 0;
  // DexLabel('test3_start')
  test3_temp1 = test3_a + 5;   // DexExpectStepOrder(5)
  test3_temp2 = test3_b + 5;   // DexExpectStepOrder(6)
  if (test3_temp1 > test3_temp2) { // DexExpectStepOrder(7)
    test3_temp1 *= test3_temp2;    // DexUnreachable()
  }
  return test3_temp1; // DexExpectStepOrder(8)
  // DexLabel('test3_end')
}
// DexExpectWatchValue('test3_a', 5, from_line=ref('test3_start'), to_line=ref('test3_end'))
// DexExpectWatchValue('test3_b', 6, from_line=ref('test3_start'), to_line=ref('test3_end'))
// DexExpectWatchValue('test3_temp1', 0, 10, from_line=ref('test3_start'), to_line=ref('test3_end'))
// DexExpectWatchValue('test3_temp2', 0, 11, from_line=ref('test3_start'), to_line=ref('test3_end'))

unsigned num_iterations = 4;

__attribute__((optnone))
int test4(int test4_a, int test4_b) {
  int val1 = 0, val2 = 0;
  // DexLabel('test4_start')

  val1 = (test4_a > test4_b) ? test4_a : test4_b; // DexExpectStepOrder(9)
  val2 = val1;
  val2 += val1; // DexExpectStepOrder(10)

  for (unsigned i=0; i != num_iterations; ++i) { // DexExpectStepOrder(11, 13, 15, 17, 19)
    val1--;
    val2 += i;
    if (val2 % 2 == 0) // DexExpectStepOrder(12, 14, 16, 18)
      val2 /= 2;
  }

  return (val1 > val2) ? val2 : val1; // DexExpectStepOrder(20)
  // DexLabel('test4_end')
}
// DexExpectWatchValue('test4_a', 1, from_line=ref('test4_start'), to_line=ref('test4_end'))
// DexExpectWatchValue('test4_b', 9, from_line=ref('test4_start'), to_line=ref('test4_end'))
// DexExpectWatchValue('val1', 0, 9, 8, 7, 6, 5, from_line=ref('test4_start'), to_line=ref('test4_end'))
// DexExpectWatchValue('val2', 0, 9, 18, 9, 10, 5, 7, 10, 5, 9, from_line=ref('test4_start'), to_line=ref('test4_end'))

__attribute__((optnone))
int test5(int test5_val) {
  int c = 1;      // DexExpectStepOrder(21)
  // DexLabel('test5_start')
  if (test5_val)  // DexExpectStepOrder(22)
    c = 5;        // DexExpectStepOrder(23)
  return c ? test5_val : test5_val; // DexExpectStepOrder(24)
  // DexLabel('test5_end')
}
// DexExpectWatchValue('test5_val', 7, from_line=ref('test5_start'), to_line=ref('test5_end'))
// DexExpectWatchValue('c', 1, 5, from_line=ref('test5_start'), to_line=ref('test5_end'))

__attribute__((optnone))
int main() {
  int main_result = 0;
  // DexLabel('main_start')
  main_result = test1(3,4);
  main_result += test2(1,2);
  main_result += test3(5,6);
  main_result += test4(1,9);
  main_result += test5(7);
  return main_result;
  // DexLabel('main_end')
}
// DexExpectWatchValue('main_result', 0, 7, 11, 21, 26, 33, from_line=ref('main_start'), to_line=ref('main_end'))