aboutsummaryrefslogtreecommitdiff
path: root/clang/test/CodeGen/aapcs64-align.cpp
blob: 53fc53c2f7296c8bfbec8d8e3f11fd6ae5595a6b (plain)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// REQUIRES: arm-registered-target
// RUN: %clang_cc1 -triple aarch64-none-elf \
// RUN:   -O2 \
// RUN:   -emit-llvm -fexperimental-max-bitint-width=1024 -o - %s | FileCheck %s

extern "C" {

// CHECK: @sizeof_OverSizedBitfield ={{.*}} global i32 8
// CHECK: @alignof_OverSizedBitfield ={{.*}} global i32 8
// CHECK: @sizeof_VeryOverSizedBitfield ={{.*}} global i32 16
// CHECK: @alignof_VeryOverSizedBitfield ={{.*}} global i32 16
// CHECK: @sizeof_RidiculouslyOverSizedBitfield ={{.*}} global i32 32
// CHECK: @alignof_RidiculouslyOverSizedBitfield ={{.*}} global i32 16

//BitInt alignment
struct BITINT129 {
    char ch;
    unsigned _BitInt(129) v;
};

int test_bitint129(){
  return __builtin_offsetof(struct BITINT129, v);
}
// CHECK:  ret i32 16 

struct BITINT127 {
    char ch;
    _BitInt(127) v;
};

int test_bitint127(){
  return __builtin_offsetof(struct BITINT127, v);
}
// CHECK:  ret i32 16 

struct BITINT63 {
    char ch;
    _BitInt(63) v;
};

int test_bitint63(){
  return __builtin_offsetof(struct BITINT63, v);
}
// CHECK:  ret i32 8 

struct BITINT32 {
    char ch;
    unsigned _BitInt(32) v;
};

int test_bitint32(){
  return __builtin_offsetof(struct BITINT32, v);
}
// CHECK:  ret i32 4

struct BITINT9 {
    char ch;
    unsigned _BitInt(9) v;
};

int test_bitint9(){
  return __builtin_offsetof(struct BITINT9, v);
}
// CHECK:  ret i32 2

struct BITINT8 {
    char ch;
    unsigned _BitInt(8) v;
};

int test_bitint8(){
  return __builtin_offsetof(struct BITINT8, v);
}
// CHECK:  ret i32 1

// Over-sized bitfield, which results in a 64-bit container type, so 64-bit
// alignment.
struct OverSizedBitfield {
  int x : 64;
};

unsigned sizeof_OverSizedBitfield = sizeof(OverSizedBitfield);
unsigned alignof_OverSizedBitfield = alignof(OverSizedBitfield);

// CHECK: define{{.*}} void @g7
// CHECK: call void @f7(i32 noundef 1, i64 42)
// CHECK: declare void @f7(i32 noundef, i64)
void f7(int a, OverSizedBitfield b);
void g7() {
  OverSizedBitfield s = {42};
  f7(1, s);
}

// AAPCS64 does have a 128-bit integer fundamental data type, so this gets a
// 128-bit container with 128-bit alignment. This is just within the limit of
// what can be passed directly.
struct VeryOverSizedBitfield {
  int x : 128;
};

unsigned sizeof_VeryOverSizedBitfield = sizeof(VeryOverSizedBitfield);
unsigned alignof_VeryOverSizedBitfield = alignof(VeryOverSizedBitfield);

// CHECK: define{{.*}} void @g8
// CHECK: call void @f8(i32 noundef 1, i128 42)
// CHECK: declare void @f8(i32 noundef, i128)
void f8(int a, VeryOverSizedBitfield b);
void g8() {
  VeryOverSizedBitfield s = {42};
  f8(1, s);
}

// There are no bigger fundamental data types, so this gets a 128-bit container
// and 128 bits of padding, giving the struct a size of 32 bytes, and an
// alignment of 16 bytes. This is over the PCS size limit of 16 bytes, so it
// will be passed indirectly.
struct RidiculouslyOverSizedBitfield {
  int x : 256;
};

unsigned sizeof_RidiculouslyOverSizedBitfield = sizeof(RidiculouslyOverSizedBitfield);
unsigned alignof_RidiculouslyOverSizedBitfield = alignof(RidiculouslyOverSizedBitfield);

// CHECK: define{{.*}} void @g9
// CHECK: call void @f9(i32 noundef 1, ptr dead_on_return noundef nonnull %agg.tmp)
// CHECK: declare void @f9(i32 noundef, ptr dead_on_return noundef)
void f9(int a, RidiculouslyOverSizedBitfield b);
void g9() {
  RidiculouslyOverSizedBitfield s = {42};
  f9(1, s);
}

}