107 lines · cpp
1// RUN: %clang++ -std=gnu++11 -O2 -g %s -o %t2// RUN: %dexter --fail-lt 1.0 -w \3// RUN: --binary %t %dexter_lldb_args -v -- %s4// RUN: %clang++ -std=gnu++11 -O0 -g %s -o %t5// RUN: %dexter --fail-lt 1.0 -w \6// RUN: --binary %t %dexter_lldb_args -- %s7 8// REQUIRES: lldb9// Currently getting intermittent failures on darwin.10// UNSUPPORTED: system-windows, system-darwin11 12//// Check that the debugging experience with __attribute__((optnone)) at O213//// matches O0. Test simple structs and methods.14 15long a_global_ptr[] = { 0xCAFEBABEL, 0xFEEDBEEFL };16 17namespace {18 19struct A {20 int a;21 float b;22 23 enum B {24 A_VALUE = 0x1,25 B_VALUE = 0x226 };27 28 struct some_data {29 enum B other_b;30 enum B other_other_b;31 };32 33 struct other_data {34 union {35 void *raw_ptr;36 long *long_ptr;37 float *float_ptr;38 } a;39 struct some_data b;40 struct some_data c;41 };42private:43 struct other_data _data;44 45public:46 struct other_data *getOtherData() { return &_data; }47 48 __attribute__((always_inline,nodebug))49 void setSomeData1(A::B value, A::B other_value) {50 struct other_data *data = getOtherData();51 data->b.other_b = value;52 data->b.other_other_b = other_value;53 }54 55 __attribute__((always_inline))56 void setSomeData2(A::B value, A::B other_value) {57 struct other_data *data = getOtherData();58 data->c.other_b = value;59 data->c.other_other_b = other_value;60 }61 62 void setOtherData() {63 setSomeData2(A_VALUE, B_VALUE);64 getOtherData()->a.long_ptr = &a_global_ptr[0];65 }66 67 __attribute__((optnone))68 A() {69 __builtin_memset(this, 0xFF, sizeof(*this));70 } //DexLabel('break_0')71 // DexExpectWatchValue('a', '-1', on_line=ref('break_0'))72 //// Check b is NaN by comparing it to itself.73 // DexExpectWatchValue('this->b == this->b', 'false', on_line=ref('break_0'))74 // DexExpectWatchValue('_data.a.raw_ptr == -1', 'true', on_line=ref('break_0'))75 // DexExpectWatchValue('_data.a.float_ptr == -1', 'true', on_line=ref('break_0'))76 // DexExpectWatchValue('_data.a.float_ptr == -1', 'true', on_line=ref('break_0'))77 // DexExpectWatchValue('a_global_ptr[0]', 0xcafebabe, on_line=ref('break_0'))78 // DexExpectWatchValue('a_global_ptr[1]', 0xfeedbeef, on_line=ref('break_0'))79 80 __attribute__((optnone))81 ~A() {82 *getOtherData()->a.long_ptr = 0xADDF00DL;83 } //DexLabel('break_1')84 // DexExpectWatchValue('_data.a.raw_ptr == a_global_ptr', 'true', on_line=ref('break_1'))85 // DexExpectWatchValue('a_global_ptr[0]', 0xaddf00d, on_line=ref('break_1'))86 87 __attribute__((optnone))88 long getData() {89 setSomeData1(B_VALUE, A_VALUE);90 setOtherData();91 return getOtherData()->a.long_ptr[1]; //DexLabel('break_2')92 }93 // DexExpectWatchValue('_data.b.other_b', 'B_VALUE', on_line=ref('break_2'))94 // DexExpectWatchValue('_data.b.other_other_b', 'A_VALUE', on_line=ref('break_2'))95};96 97} // anonymous namespace98 99int main() {100 int result = 0;101 {102 A a;103 result = a.getData();104 }105 return result;106}107