File: struct.cir

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.6-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,245,028 kB
  • sloc: cpp: 7,619,726; ansic: 1,434,018; asm: 1,058,748; python: 252,740; f90: 94,671; objc: 70,685; lisp: 42,813; pascal: 18,401; sh: 8,601; ml: 5,111; perl: 4,720; makefile: 3,675; awk: 3,523; javascript: 2,409; xml: 892; fortran: 770
file content (74 lines) | stat: -rw-r--r-- 3,192 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// 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]
}