80 lines · plain
1// RUN: cir-opt %s --verify-roundtrip | FileCheck %s2 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 8!rec_C = !cir.record<class "C" incomplete>9!rec_S = !cir.record<struct "S" incomplete>10!rec_U = !cir.record<union "U" incomplete>11 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 packed {!s32i, !s32i, !cir.array<!s32i x 8>}>17!rec_anon_struct1 = !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 5>}>18!rec_anon_struct2 = !cir.record<struct {!cir.ptr<!u8i>, !cir.ptr<!u8i>, !cir.ptr<!u8i>}>19!rec_S1 = !cir.record<struct "S1" {!s32i, !s32i}>20!rec_Sc = !cir.record<struct "Sc" {!u8i, !u16i, !u32i}>21 22// CHECK-DAG: !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 5>}>23// CHECK-DAG: !cir.record<struct {!cir.ptr<!u8i>, !cir.ptr<!u8i>, !cir.ptr<!u8i>}>24// CHECK-DAG: !rec_S1 = !cir.record<struct "S1" {!s32i, !s32i}>25// CHECK-DAG: !rec_Sc = !cir.record<struct "Sc" {!u8i, !u16i, !u32i}>26 27// Packed and padded structs28!rec_P1 = !cir.record<struct "P1" packed {!s32i, !s32i}>29!rec_P2 = !cir.record<struct "P2" padded {!u8i, !u16i, !u32i}>30!rec_P3 = !cir.record<struct "P3" packed padded {!u8i, !u16i, !u32i}>31 32// CHECK-DAG: !rec_P1 = !cir.record<struct "P1" packed {!s32i, !s32i}>33// CHECK-DAG: !rec_P2 = !cir.record<struct "P2" padded {!u8i, !u16i, !u32i}>34// CHECK-DAG: !rec_P3 = !cir.record<struct "P3" packed padded {!u8i, !u16i, !u32i}>35 36 37// Complete a previously incomplete record38!rec_A = !cir.record<class "A" incomplete>39!rec_Ac = !cir.record<class "A" {!u8i, !s32i}>40// CHECK-DAG: !rec_A = !cir.record<class "A" {!u8i, !s32i}>41 42// Test recursive struct parsing/printing.43!rec_Node = !cir.record<struct "Node" {!cir.ptr<!cir.record<struct "Node">>}>44// CHECK-DAG: !cir.record<struct "Node" {!cir.ptr<!cir.record<struct "Node">>}>45 46 47 48module {49 cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>50 cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>51 cir.global external @p3 = #cir.ptr<null> : !cir.ptr<!rec_C>52 cir.global external @arr = #cir.const_record<{#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.zero : !cir.array<!s32i x 8>}> : !rec_anon_struct53// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>54// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>55// CHECK: cir.global external @p3 = #cir.ptr<null> : !cir.ptr<!rec_C>56// CHECK: cir.global external @arr = #cir.const_record<{#cir.int<1> : !s32i, #cir.int<2> : !s32i, #cir.zero : !cir.array<!s32i x 8>}> : !rec_anon_struct57 58 // Dummy function to use types and force them to be printed.59 cir.func @useTypes(%arg0: !rec_Node,60 %arg1: !rec_anon_struct2,61 %arg2: !rec_anon_struct1,62 %arg3: !rec_S1,63 %arg4: !rec_Ac,64 %arg5: !rec_P1,65 %arg6: !rec_P2,66 %arg7: !rec_P3) {67 cir.return68 }69 70 cir.func @structs() {71 %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]72 %1 = cir.alloca !cir.ptr<!cir.record<union "U" incomplete>>, !cir.ptr<!cir.ptr<!cir.record<union "U" incomplete>>>, ["u", init]73 cir.return74 }75 76// CHECK: cir.func @structs() {77// CHECK: %0 = cir.alloca !cir.ptr<!rec_Sc>, !cir.ptr<!cir.ptr<!rec_Sc>>, ["sc", init]78// CHECK: %1 = cir.alloca !cir.ptr<!rec_U>, !cir.ptr<!cir.ptr<!rec_U>>, ["u", init]79}80