1d3492ed0SZequan Wu // clang-format off 2d3492ed0SZequan Wu // REQUIRES: lld, x86 3d3492ed0SZequan Wu 4d3492ed0SZequan Wu // Make sure class layout is correct. 5d3492ed0SZequan Wu // RUN: %clang_cl --target=x86_64-windows-msvc -Od -Z7 -c /Fo%t.obj -- %s 6d3492ed0SZequan Wu // RUN: lld-link -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb 7*cf3464bbSJonas Devlieghere // RUN: %lldb -f %t.exe -s \ 8d3492ed0SZequan Wu // RUN: %p/Inputs/class_layout.lldbinit 2>&1 | FileCheck %s 9d3492ed0SZequan Wu 10d3492ed0SZequan Wu // CHECK: (lldb) expr a 11d3492ed0SZequan Wu // CHECK-NEXT: (A) $0 = (d1 = 'a', d2 = 1, d3 = 2, d4 = 'b') 12d3492ed0SZequan Wu // CHECK-NEXT: (lldb) expr b.c 13d3492ed0SZequan Wu // CHECK-NEXT: (char) $1 = 'a' 14d3492ed0SZequan Wu // CHECK-NEXT: (lldb) expr b.u.c 15d3492ed0SZequan Wu // CHECK-NEXT: (char[2]) $2 = "b" 16d3492ed0SZequan Wu // CHECK-NEXT: (lldb) expr b.u.i 17d3492ed0SZequan Wu // CHECK-NEXT: (int) $3 = 98 18d3492ed0SZequan Wu // CHECK-NEXT: (lldb) expr c 19d3492ed0SZequan Wu // CHECK-NEXT: (C) $4 = { 20d3492ed0SZequan Wu // CHECK-NEXT: c = 'a' 21d3492ed0SZequan Wu // CHECK-NEXT: x = 65 22d3492ed0SZequan Wu // CHECK-NEXT: = { 23d3492ed0SZequan Wu // CHECK-NEXT: = { 24d3492ed0SZequan Wu // CHECK-NEXT: c1 = 'b' 25d3492ed0SZequan Wu // CHECK-NEXT: = { 26d3492ed0SZequan Wu // CHECK-NEXT: = { 27d3492ed0SZequan Wu // CHECK-NEXT: s3 = { 28d3492ed0SZequan Wu // CHECK-NEXT: x = ([0] = 66, [1] = 67, [2] = 68) 29d3492ed0SZequan Wu // CHECK-NEXT: } 30d3492ed0SZequan Wu // CHECK-NEXT: c3 = 'c' 31d3492ed0SZequan Wu // CHECK-NEXT: } 32d3492ed0SZequan Wu // CHECK-NEXT: = { 33d3492ed0SZequan Wu // CHECK-NEXT: c4 = 'B' 34d3492ed0SZequan Wu // CHECK-NEXT: s4 = { 35d3492ed0SZequan Wu // CHECK-NEXT: x = ([0] = 67, [1] = 68, [2] = 99) 36d3492ed0SZequan Wu // CHECK-NEXT: } 37d3492ed0SZequan Wu // CHECK-NEXT: s1 = { 38d3492ed0SZequan Wu // CHECK-NEXT: x = ([0] = 69, [1] = 70, [2] = 71) 39d3492ed0SZequan Wu // CHECK-NEXT: } 40d3492ed0SZequan Wu // CHECK-NEXT: } 41d3492ed0SZequan Wu // CHECK-NEXT: } 42d3492ed0SZequan Wu // CHECK-NEXT: } 43d3492ed0SZequan Wu // CHECK-NEXT: = { 44d3492ed0SZequan Wu // CHECK-NEXT: s2 = { 45d3492ed0SZequan Wu // CHECK-NEXT: x = ([0] = 98, [1] = 66, [2] = 67) 46d3492ed0SZequan Wu // CHECK-NEXT: } 47d3492ed0SZequan Wu // CHECK-NEXT: c2 = 'D' 48d3492ed0SZequan Wu // CHECK-NEXT: } 49d3492ed0SZequan Wu // CHECK-NEXT: } 50d3492ed0SZequan Wu // CHECK-NEXT: } 51d3492ed0SZequan Wu // CHECK-NEXT: (lldb) type lookup C 52d3492ed0SZequan Wu // CHECK-NEXT: struct C { 53d3492ed0SZequan Wu // CHECK-NEXT: char c; 54d3492ed0SZequan Wu // CHECK-NEXT: int x; 55d3492ed0SZequan Wu // CHECK-NEXT: union { 56d3492ed0SZequan Wu // CHECK-NEXT: struct { 57d3492ed0SZequan Wu // CHECK-NEXT: char c1; 58d3492ed0SZequan Wu // CHECK-NEXT: union { 59d3492ed0SZequan Wu // CHECK-NEXT: struct { 60d3492ed0SZequan Wu // CHECK-NEXT: S3 s3; 61d3492ed0SZequan Wu // CHECK-NEXT: char c3; 62d3492ed0SZequan Wu // CHECK-NEXT: }; 63d3492ed0SZequan Wu // CHECK-NEXT: struct { 64d3492ed0SZequan Wu // CHECK-NEXT: char c4; 65d3492ed0SZequan Wu // CHECK-NEXT: S3 s4; 66d3492ed0SZequan Wu // CHECK-NEXT: S3 s1; 67d3492ed0SZequan Wu // CHECK-NEXT: }; 68d3492ed0SZequan Wu // CHECK-NEXT: }; 69d3492ed0SZequan Wu // CHECK-NEXT: }; 70d3492ed0SZequan Wu // CHECK-NEXT: struct { 71d3492ed0SZequan Wu // CHECK-NEXT: S3 s2; 72d3492ed0SZequan Wu // CHECK-NEXT: char c2; 73d3492ed0SZequan Wu // CHECK-NEXT: }; 74d3492ed0SZequan Wu // CHECK-NEXT: }; 75d3492ed0SZequan Wu // CHECK-NEXT: } 76d3492ed0SZequan Wu 77d3492ed0SZequan Wu 78d3492ed0SZequan Wu 79d3492ed0SZequan Wu // Test packed stuct layout. 80d3492ed0SZequan Wu struct __attribute__((packed, aligned(1))) A { 81d3492ed0SZequan Wu char d1; 82d3492ed0SZequan Wu int d2; 83d3492ed0SZequan Wu int d3; 84d3492ed0SZequan Wu char d4; 85d3492ed0SZequan Wu }; 86d3492ed0SZequan Wu 87d3492ed0SZequan Wu struct __attribute__((packed, aligned(1))) B { 88d3492ed0SZequan Wu char c; 89d3492ed0SZequan Wu union { 90d3492ed0SZequan Wu char c[2]; 91d3492ed0SZequan Wu int i; 92d3492ed0SZequan Wu } u; 93d3492ed0SZequan Wu }; 94d3492ed0SZequan Wu 95d3492ed0SZequan Wu // Test struct layout with anonymous union/struct. 96d3492ed0SZequan Wu struct S3 { 97d3492ed0SZequan Wu short x[3]; 98d3492ed0SZequan Wu }; 99d3492ed0SZequan Wu 100d3492ed0SZequan Wu struct C { 101d3492ed0SZequan Wu char c; 102d3492ed0SZequan Wu int x; 103d3492ed0SZequan Wu union { 104d3492ed0SZequan Wu struct { 105d3492ed0SZequan Wu char c1; 106d3492ed0SZequan Wu union { 107d3492ed0SZequan Wu struct { 108d3492ed0SZequan Wu S3 s3; 109d3492ed0SZequan Wu char c3; 110d3492ed0SZequan Wu }; 111d3492ed0SZequan Wu struct { 112d3492ed0SZequan Wu char c4; 113d3492ed0SZequan Wu S3 s4; 114d3492ed0SZequan Wu }; 115d3492ed0SZequan Wu }; 116d3492ed0SZequan Wu S3 s1; 117d3492ed0SZequan Wu }; 118d3492ed0SZequan Wu struct { 119d3492ed0SZequan Wu S3 s2; 120d3492ed0SZequan Wu char c2; 121d3492ed0SZequan Wu }; 122d3492ed0SZequan Wu }; 123d3492ed0SZequan Wu }; 124d3492ed0SZequan Wu 125d3492ed0SZequan Wu A a = {'a', 1, 2, 'b'}; 126d3492ed0SZequan Wu B b = {'a', {"b"}}; 127d3492ed0SZequan Wu C c = {.c = 'a', .x = 65, .c1 = 'b', .s3 = {66, 67, 68}, .c3 = 'c', .s1={69, 70, 71}}; 128d3492ed0SZequan Wu 129d3492ed0SZequan Wu int main() { 130d3492ed0SZequan Wu return 0; 131d3492ed0SZequan Wu } 132