Files
clang-p2996/cross-project-tests/debuginfo-tests/dexter-tests/optnone-struct-and-methods.cpp
Stephen Tozer 262520a3c5 [Dexter] Remove builder from Dexter
See "discussion":
  https://discourse.llvm.org/t/rfc-dexter-feature-removals/60462

This patch removes the builder functionality from Dexter, as it is an active
maintenance burden and is no longer required since Dexter is being invoked by
other test runners that can handle the build step better, and there has been no
objection that it is still needed.

Differential Revision: https://reviews.llvm.org/D151465
2023-08-21 15:08:11 +01:00

106 lines
2.8 KiB
C++

// RUN: %clang++ -O2 -g %s -o %t
// RUN: %dexter --fail-lt 1.0 -w \
// RUN: --binary %t --debugger 'lldb' -v -- %s
// RUN: %clang++ -O0 -g %s -o %t
// RUN: %dexter --fail-lt 1.0 -w \
// RUN: --binary %t --debugger 'lldb' -- %s
// REQUIRES: lldb
// UNSUPPORTED: system-windows
//// 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;
}