xref: /llvm-project/lldb/test/Shell/SymbolFile/NativePDB/class_layout.cpp (revision cf3464bbb796d492bcd4e764ada945304e0c874f)
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