1 // RUN: %clang++ -std=gnu++11 -O2 -g %s -o %t
2 // RUN: %dexter --fail-lt 1.0 -w \
3 // RUN:     --binary %t --debugger 'lldb' -v -- %s
4 // RUN: %clang++ -std=gnu++11 -O0 -g %s -o %t
5 // RUN: %dexter --fail-lt 1.0 -w \
6 // RUN:     --binary %t --debugger 'lldb' -- %s
7 
8 // REQUIRES: lldb
9 // Currently getting intermittent failures on darwin.
10 // UNSUPPORTED: system-windows, system-darwin
11 
12 //// Check that the debugging experience with __attribute__((optnone)) at O2
13 //// matches O0. Test simple structs and methods.
14 
15 long a_global_ptr[] = { 0xCAFEBABEL, 0xFEEDBEEFL };
16 
17 namespace {
18 
19 struct A {
20   int a;
21   float b;
22 
23   enum B {
24     A_VALUE = 0x1,
25     B_VALUE = 0x2
26   };
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   };
42 private:
43   struct other_data _data;
44 
45 public:
getOtherData__anone12a1d630111::A46   struct other_data *getOtherData() { return &_data; }
47 
48   __attribute__((always_inline,nodebug))
setSomeData1__anone12a1d630111::A49   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))
setSomeData2__anone12a1d630111::A56   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 
setOtherData__anone12a1d630111::A62   void setOtherData() {
63     setSomeData2(A_VALUE, B_VALUE);
64     getOtherData()->a.long_ptr = &a_global_ptr[0];
65   }
66 
67   __attribute__((optnone))
A__anone12a1d630111::A68   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))
~A__anone12a1d630111::A81   ~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))
getData__anone12a1d630111::A88   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 namespace
98 
main()99 int main() {
100   int result = 0;
101   {
102     A a;
103     result = a.getData();
104   }
105   return result;
106 }
107