|
1 | 1 | // RUN: cir-opt %s | FileCheck %s
|
2 | 2 |
|
| 3 | +!u8i = !cir.int<u, 8> |
| 4 | +!u16i = !cir.int<u, 16> |
| 5 | +!s32i = !cir.int<s, 32> |
| 6 | +!u32i = !cir.int<u, 32> |
| 7 | + |
3 | 8 | !rec_C = !cir.record<class "C" incomplete>
|
4 | 9 | !rec_S = !cir.record<struct "S" incomplete>
|
5 | 10 | !rec_U = !cir.record<union "U" incomplete>
|
6 | 11 |
|
7 |
| -// CHECK: !rec_C = !cir.record<class "C" incomplete> |
8 |
| -// CHECK: !rec_S = !cir.record<struct "S" incomplete> |
9 |
| -// CHECK: !rec_U = !cir.record<union "U" incomplete> |
| 12 | +// CHECK-DAG: !rec_C = !cir.record<class "C" incomplete> |
| 13 | +// CHECK-DAG: !rec_S = !cir.record<struct "S" incomplete> |
| 14 | +// CHECK-DAG: !rec_U = !cir.record<union "U" incomplete> |
| 15 | + |
| 16 | +!rec_anon_struct = !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 5>}> |
| 17 | +!rec_anon_struct1 = !cir.record<struct {!cir.ptr<!u8i>, !cir.ptr<!u8i>, !cir.ptr<!u8i>}> |
| 18 | +!rec_S1 = !cir.record<struct "S1" {!s32i, !s32i}> |
| 19 | +!rec_Sc = !cir.record<struct "Sc" {!u8i, !u16i, !u32i}> |
| 20 | + |
| 21 | +// CHECK-DAG: !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 5>}> |
| 22 | +// CHECK-DAG: !cir.record<struct {!cir.ptr<!u8i>, !cir.ptr<!u8i>, !cir.ptr<!u8i>}> |
| 23 | +// CHECK-DAG: !rec_S1 = !cir.record<struct "S1" {!s32i, !s32i}> |
| 24 | +// CHECK-DAG: !rec_Sc = !cir.record<struct "Sc" {!u8i, !u16i, !u32i}> |
| 25 | + |
| 26 | +// Packed and padded structs |
| 27 | +!rec_P1 = !cir.record<struct "P1" packed {!s32i, !s32i}> |
| 28 | +!rec_P2 = !cir.record<struct "P2" padded {!u8i, !u16i, !u32i}> |
| 29 | +!rec_P3 = !cir.record<struct "P3" packed padded {!u8i, !u16i, !u32i}> |
| 30 | + |
| 31 | +// CHECK-DAG: !rec_P1 = !cir.record<struct "P1" packed {!s32i, !s32i}> |
| 32 | +// CHECK-DAG: !rec_P2 = !cir.record<struct "P2" padded {!u8i, !u16i, !u32i}> |
| 33 | +// CHECK-DAG: !rec_P3 = !cir.record<struct "P3" packed padded {!u8i, !u16i, !u32i}> |
10 | 34 |
|
11 |
| -module { |
12 |
| - cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S> |
13 |
| - cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U> |
14 |
| - cir.global external @p3 = #cir.ptr<null> : !cir.ptr<!rec_C> |
15 |
| -} |
16 | 35 |
|
| 36 | +// Complete a previously incomplete record |
| 37 | +!rec_A = !cir.record<class "A" incomplete> |
| 38 | +!rec_Ac = !cir.record<class "A" {!u8i, !s32i}> |
| 39 | +// CHECK-DAG: !rec_A = !cir.record<class "A" {!u8i, !s32i}> |
| 40 | + |
| 41 | +// Test recursive struct parsing/printing. |
| 42 | +!rec_Node = !cir.record<struct "Node" {!cir.ptr<!cir.record<struct "Node">>}> |
| 43 | +// CHECK-DAG: !cir.record<struct "Node" {!cir.ptr<!cir.record<struct "Node">>}> |
| 44 | + |
| 45 | +module { |
| 46 | + cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S> |
| 47 | + cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U> |
| 48 | + cir.global external @p3 = #cir.ptr<null> : !cir.ptr<!rec_C> |
17 | 49 | // CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>
|
18 | 50 | // CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>
|
19 | 51 | // CHECK: cir.global external @p3 = #cir.ptr<null> : !cir.ptr<!rec_C>
|
| 52 | + |
| 53 | + // Dummy function to use types and force them to be printed. |
| 54 | + cir.func @useTypes(%arg0: !rec_Node, |
| 55 | + %arg1: !rec_anon_struct1, |
| 56 | + %arg2: !rec_anon_struct, |
| 57 | + %arg3: !rec_S1, |
| 58 | + %arg4: !rec_Ac, |
| 59 | + %arg5: !rec_P1, |
| 60 | + %arg6: !rec_P2, |
| 61 | + %arg7: !rec_P3) { |
| 62 | + cir.return |
| 63 | + } |
| 64 | + |
| 65 | + cir.func @structs() { |
| 66 | + %0 = cir.alloca !cir.ptr<!cir.record<struct "Sc" {!u8i, !u16i, !u32i}>>, !cir.ptr<!cir.ptr<!cir.record<struct "Sc" {!u8i, !u16i, !u32i}>>>, ["sc", init] |
| 67 | + %1 = cir.alloca !cir.ptr<!cir.record<union "U" incomplete>>, !cir.ptr<!cir.ptr<!cir.record<union "U" incomplete>>>, ["u", init] |
| 68 | + cir.return |
| 69 | + } |
| 70 | + |
| 71 | +// CHECK: cir.func @structs() { |
| 72 | +// CHECK: %0 = cir.alloca !cir.ptr<!rec_Sc>, !cir.ptr<!cir.ptr<!rec_Sc>>, ["sc", init] |
| 73 | +// CHECK: %1 = cir.alloca !cir.ptr<!rec_U>, !cir.ptr<!cir.ptr<!rec_U>>, ["u", init] |
| 74 | +} |
0 commit comments