blob: 85f475f643ee5d48715d10c742c2bf8def56d0ee [file] [log] [blame]
// RUN: cir-opt %s | FileCheck %s
!u8i = !cir.int<u, 8>
!u16i = !cir.int<u, 16>
!s32i = !cir.int<s, 32>
!u32i = !cir.int<u, 32>
!rec_C = !cir.record<class "C" incomplete>
!rec_S = !cir.record<struct "S" incomplete>
!rec_U = !cir.record<union "U" incomplete>
// CHECK-DAG: !rec_C = !cir.record<class "C" incomplete>
// CHECK-DAG: !rec_S = !cir.record<struct "S" incomplete>
// CHECK-DAG: !rec_U = !cir.record<union "U" incomplete>
!rec_anon_struct = !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 5>}>
!rec_anon_struct1 = !cir.record<struct {!cir.ptr<!u8i>, !cir.ptr<!u8i>, !cir.ptr<!u8i>}>
!rec_S1 = !cir.record<struct "S1" {!s32i, !s32i}>
!rec_Sc = !cir.record<struct "Sc" {!u8i, !u16i, !u32i}>
// CHECK-DAG: !cir.record<struct {!cir.array<!cir.ptr<!u8i> x 5>}>
// CHECK-DAG: !cir.record<struct {!cir.ptr<!u8i>, !cir.ptr<!u8i>, !cir.ptr<!u8i>}>
// CHECK-DAG: !rec_S1 = !cir.record<struct "S1" {!s32i, !s32i}>
// CHECK-DAG: !rec_Sc = !cir.record<struct "Sc" {!u8i, !u16i, !u32i}>
// Packed and padded structs
!rec_P1 = !cir.record<struct "P1" packed {!s32i, !s32i}>
!rec_P2 = !cir.record<struct "P2" padded {!u8i, !u16i, !u32i}>
!rec_P3 = !cir.record<struct "P3" packed padded {!u8i, !u16i, !u32i}>
// CHECK-DAG: !rec_P1 = !cir.record<struct "P1" packed {!s32i, !s32i}>
// CHECK-DAG: !rec_P2 = !cir.record<struct "P2" padded {!u8i, !u16i, !u32i}>
// CHECK-DAG: !rec_P3 = !cir.record<struct "P3" packed padded {!u8i, !u16i, !u32i}>
// Complete a previously incomplete record
!rec_A = !cir.record<class "A" incomplete>
!rec_Ac = !cir.record<class "A" {!u8i, !s32i}>
// CHECK-DAG: !rec_A = !cir.record<class "A" {!u8i, !s32i}>
// Test recursive struct parsing/printing.
!rec_Node = !cir.record<struct "Node" {!cir.ptr<!cir.record<struct "Node">>}>
// CHECK-DAG: !cir.record<struct "Node" {!cir.ptr<!cir.record<struct "Node">>}>
module {
cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>
cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>
cir.global external @p3 = #cir.ptr<null> : !cir.ptr<!rec_C>
// CHECK: cir.global external @p1 = #cir.ptr<null> : !cir.ptr<!rec_S>
// CHECK: cir.global external @p2 = #cir.ptr<null> : !cir.ptr<!rec_U>
// CHECK: cir.global external @p3 = #cir.ptr<null> : !cir.ptr<!rec_C>
// Dummy function to use types and force them to be printed.
cir.func @useTypes(%arg0: !rec_Node,
%arg1: !rec_anon_struct1,
%arg2: !rec_anon_struct,
%arg3: !rec_S1,
%arg4: !rec_Ac,
%arg5: !rec_P1,
%arg6: !rec_P2,
%arg7: !rec_P3) {
cir.return
}
cir.func @structs() {
%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]
%1 = cir.alloca !cir.ptr<!cir.record<union "U" incomplete>>, !cir.ptr<!cir.ptr<!cir.record<union "U" incomplete>>>, ["u", init]
cir.return
}
// CHECK: cir.func @structs() {
// CHECK: %0 = cir.alloca !cir.ptr<!rec_Sc>, !cir.ptr<!cir.ptr<!rec_Sc>>, ["sc", init]
// CHECK: %1 = cir.alloca !cir.ptr<!rec_U>, !cir.ptr<!cir.ptr<!rec_U>>, ["u", init]
}