// RUN: %clang++ -std=gnu++11 -O2 -g %s -o %t // RUN: %dexter --fail-lt 1.0 -w \ // RUN: --binary %t --debugger 'lldb' -v -- %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 // 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 structs and methods. long a_global_ptr[] = { 0xCAFEBABEL, 0xFEEDBEEFL }; namespace { struct A { int a; float b; enum B { A_VALUE = 0x1, B_VALUE = 0x2 }; struct some_data { enum B other_b; enum B other_other_b; }; struct other_data { union { void *raw_ptr; long *long_ptr; float *float_ptr; } a; struct some_data b; struct some_data c; }; private: struct other_data _data; public: struct other_data *getOtherData() { return &_data; } __attribute__((always_inline,nodebug)) void setSomeData1(A::B value, A::B other_value) { struct other_data *data = getOtherData(); data->b.other_b = value; data->b.other_other_b = other_value; } __attribute__((always_inline)) void setSomeData2(A::B value, A::B other_value) { struct other_data *data = getOtherData(); data->c.other_b = value; data->c.other_other_b = other_value; } void setOtherData() { setSomeData2(A_VALUE, B_VALUE); getOtherData()->a.long_ptr = &a_global_ptr[0]; } __attribute__((optnone)) A() { __builtin_memset(this, 0xFF, sizeof(*this)); } //DexLabel('break_0') // DexExpectWatchValue('a', '-1', on_line=ref('break_0')) //// Check b is NaN by comparing it to itself. // DexExpectWatchValue('this->b == this->b', 'false', on_line=ref('break_0')) // DexExpectWatchValue('_data.a.raw_ptr == -1', 'true', on_line=ref('break_0')) // DexExpectWatchValue('_data.a.float_ptr == -1', 'true', on_line=ref('break_0')) // DexExpectWatchValue('_data.a.float_ptr == -1', 'true', on_line=ref('break_0')) // DexExpectWatchValue('a_global_ptr[0]', 0xcafebabe, on_line=ref('break_0')) // DexExpectWatchValue('a_global_ptr[1]', 0xfeedbeef, on_line=ref('break_0')) __attribute__((optnone)) ~A() { *getOtherData()->a.long_ptr = 0xADDF00DL; } //DexLabel('break_1') // DexExpectWatchValue('_data.a.raw_ptr == a_global_ptr', 'true', on_line=ref('break_1')) // DexExpectWatchValue('a_global_ptr[0]', 0xaddf00d, on_line=ref('break_1')) __attribute__((optnone)) long getData() { setSomeData1(B_VALUE, A_VALUE); setOtherData(); return getOtherData()->a.long_ptr[1]; //DexLabel('break_2') } // DexExpectWatchValue('_data.b.other_b', 'B_VALUE', on_line=ref('break_2')) // DexExpectWatchValue('_data.b.other_other_b', 'A_VALUE', on_line=ref('break_2')) }; } // anonymous namespace int main() { int result = 0; { A a; result = a.getData(); } return result; }