1 // RUN: %dexter --fail-lt 1.0 -w \ 2 // RUN: --builder 'clang' --debugger 'lldb' \ 3 // RUN: --cflags "-g -O2" -v -- %s 4 // RUN: %dexter --fail-lt 1.0 -w \ 5 // RUN: --builder 'clang' --debugger 'lldb' \ 6 // RUN: --cflags "-g -O0" -- %s 7 8 // REQUIRES: lldb 9 // UNSUPPORTED: system-windows 10 11 //// Check that the debugging experience with __attribute__((optnone)) at O2 12 //// matches O0. Test simple template functions performing simple arithmetic 13 //// vector operations and trivial loops. 14 15 typedef int int4 __attribute__((ext_vector_type(4))); 16 template<typename T> struct TypeTraits {}; 17 18 template<> 19 struct TypeTraits<int4> { 20 static const unsigned NumElements = 4; 21 static const unsigned UnusedField = 0xDEADBEEFU; 22 static unsigned MysteryNumber; 23 }; 24 unsigned TypeTraits<int4>::MysteryNumber = 3U; 25 26 template<typename T> 27 __attribute__((optnone)) 28 T test1(T x, T y) { 29 T tmp = x + y; // DexLabel('break_0') 30 T tmp2 = tmp + y; 31 return tmp; // DexLabel('break_1') 32 } 33 // DexLimitSteps('1', '1', from_line=ref('break_0'), to_line=ref('break_1')) 34 //// FIXME: gdb can print this but lldb cannot. Perhaps PR42920? 35 // \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::NumElements', 4, on_line=ref('break_0')) 36 // \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::UnusedField', 0xdeadbeef, on_line=ref('break_0')) 37 // DexExpectWatchValue('x[0]', 1, on_line=ref('break_0')) 38 // DexExpectWatchValue('x[1]', 2, on_line=ref('break_0')) 39 // DexExpectWatchValue('x[2]', 3, on_line=ref('break_0')) 40 // DexExpectWatchValue('x[3]', 4, on_line=ref('break_0')) 41 // DexExpectWatchValue('y[0]', 5, on_line=ref('break_0')) 42 // DexExpectWatchValue('y[1]', 6, on_line=ref('break_0')) 43 // DexExpectWatchValue('y[2]', 7, on_line=ref('break_0')) 44 // DexExpectWatchValue('y[3]', 8, on_line=ref('break_0')) 45 // DexExpectWatchValue('tmp[0]', 6, on_line=ref('break_1')) 46 // DexExpectWatchValue('tmp[1]', 8, on_line=ref('break_1')) 47 // DexExpectWatchValue('tmp[2]', 10, on_line=ref('break_1')) 48 // DexExpectWatchValue('tmp[3]', 12, on_line=ref('break_1')) 49 // DexExpectWatchValue('tmp2[0]', 11, on_line=ref('break_1')) 50 // DexExpectWatchValue('tmp2[1]', 14, on_line=ref('break_1')) 51 // DexExpectWatchValue('tmp2[2]', 17, on_line=ref('break_1')) 52 // DexExpectWatchValue('tmp2[3]', 20, on_line=ref('break_1')) 53 54 template<typename T> 55 __attribute__((optnone)) 56 T test2(T x, T y) { 57 T tmp = x; 58 int break_2 = 0; // DexLabel('break_2') 59 for (unsigned i = 0; i != TypeTraits<T>::NumElements; ++i) { 60 tmp <<= 1; // DexLabel('break_3') 61 tmp |= y; 62 } 63 64 tmp[0] >>= TypeTraits<T>::MysteryNumber; 65 return tmp; // DexLabel('break_5') 66 } 67 // DexLimitSteps('1', '1', on_line=ref('break_2')) 68 // DexExpectWatchValue('x[0]', 6, on_line=ref('break_2')) 69 // DexExpectWatchValue('x[1]', 8, on_line=ref('break_2')) 70 // DexExpectWatchValue('x[2]', 10, on_line=ref('break_2')) 71 // DexExpectWatchValue('x[3]', 12, on_line=ref('break_2')) 72 // DexExpectWatchValue('y[0]', 5, on_line=ref('break_2')) 73 // DexExpectWatchValue('y[1]', 6, on_line=ref('break_2')) 74 // DexExpectWatchValue('y[2]', 7, on_line=ref('break_2')) 75 // DexExpectWatchValue('y[3]', 8, on_line=ref('break_2')) 76 // DexExpectWatchValue('tmp[0]', 6, on_line=ref('break_2')) 77 // DexExpectWatchValue('tmp[1]', 8, on_line=ref('break_2')) 78 // DexExpectWatchValue('tmp[2]', 10, on_line=ref('break_2')) 79 // DexExpectWatchValue('tmp[3]', 12, on_line=ref('break_2')) 80 // DexLimitSteps('i', 3, on_line=ref('break_3')) 81 // DexExpectWatchValue('tmp[0]', 63, on_line=ref('break_3')) 82 // DexExpectWatchValue('tmp[1]', 94, on_line=ref('break_3')) 83 // DexExpectWatchValue('tmp[2]', 95, on_line=ref('break_3')) 84 // DexExpectWatchValue('tmp[3]', 120, on_line=ref('break_3')) 85 // DexLimitSteps('i', 3, on_line=ref('break_5')) 86 // DexExpectWatchValue('tmp[0]', 15, on_line=ref('break_5')) 87 88 template<typename T> 89 __attribute__((optnone)) 90 T test3(T InVec) { 91 T result; 92 for (unsigned i=0; i != TypeTraits<T>::NumElements; ++i) 93 result[i] = InVec[i]; // DexLabel('break_6') 94 return result; // DexLabel('break_7') 95 } 96 // DexLimitSteps('i', '3', from_line=ref('break_6'), to_line=ref('break_7')) 97 // DexExpectWatchValue('InVec[0]', 15, from_line=ref('break_6'), to_line=ref('break_7')) 98 // DexExpectWatchValue('InVec[1]', 190, from_line=ref('break_6'), to_line=ref('break_7')) 99 // DexExpectWatchValue('InVec[2]', 191, from_line=ref('break_6'), to_line=ref('break_7')) 100 // DexExpectWatchValue('InVec[3]', 248, from_line=ref('break_6'), to_line=ref('break_7')) 101 // DexExpectWatchValue('result[0]', 15, from_line=ref('break_6'), to_line=ref('break_7')) 102 // DexExpectWatchValue('result[1]', 190, from_line=ref('break_6'), to_line=ref('break_7')) 103 // DexExpectWatchValue('result[2]', 191, from_line=ref('break_6'), to_line=ref('break_7')) 104 // DexExpectWatchValue('result[3]', 248, on_line=ref('break_7')) 105 106 template<typename T> 107 __attribute__((optnone)) 108 T test4(T x, T y) { 109 for (unsigned i=0; i != TypeTraits<T>::NumElements; ++i) 110 x[i] = (x[i] > y[i])? x[i] : y[i] + TypeTraits<T>::MysteryNumber; // DexLabel('break_11') 111 return x; // DexLabel('break_12') 112 } 113 // DexLimitSteps('1', '1', from_line=ref('break_11'), to_line=ref('break_12')) 114 //// FIXME: lldb won't print this but gdb unexpectedly says it's optimized out, even at O0. 115 // \DexExpectWatchValue('TypeTraits<int __attribute__((ext_vector_type(4)))>::MysteryNumber', 3, on_line=ref('break_11')) 116 // DexExpectWatchValue('i', 0, 1, 2, 3, on_line=ref('break_11')) 117 // DexExpectWatchValue('x[0]', 1, 8, from_line=ref('break_11'), to_line=ref('break_12')) 118 // DexExpectWatchValue('x[1]', 2, 9, from_line=ref('break_11'), to_line=ref('break_12')) 119 // DexExpectWatchValue('x[2]', 3, 10, from_line=ref('break_11'), to_line=ref('break_12')) 120 // DexExpectWatchValue('x[3]', 4, 11, from_line=ref('break_11'), to_line=ref('break_12')) 121 // DexExpectWatchValue('y[0]', 5, from_line=ref('break_11'), to_line=ref('break_12')) 122 // DexExpectWatchValue('y[1]', 6, from_line=ref('break_11'), to_line=ref('break_12')) 123 // DexExpectWatchValue('y[2]', 7, from_line=ref('break_11'), to_line=ref('break_12')) 124 // DexExpectWatchValue('y[3]', 8, from_line=ref('break_11'), to_line=ref('break_12')) 125 126 int main() { 127 int4 a = (int4){1,2,3,4}; 128 int4 b = (int4){5,6,7,8}; 129 130 int4 tmp = test1(a,b); 131 tmp = test2(tmp,b); 132 tmp = test3(tmp); 133 tmp += test4(a,b); 134 return tmp[0]; 135 } 136