@@ -77,12 +77,73 @@ class UnitSpec : XCTestCase {
77
77
] )
78
78
}
79
79
80
+ func testStructLayoutOnMachine( ) {
81
+ let mod = Module ( name: " StructLayout " )
82
+ let aarch64 = try ! TargetMachine ( triple: " aarch64-- " , cpu: " " , features: " " ,
83
+ optLevel: . none, relocMode: . default, codeModel: . default)
84
+ mod. dataLayout = aarch64. dataLayout
85
+ XCTAssertEqual ( mod. dataLayoutString, " e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128 " )
86
+
87
+ let packedStruct = StructType ( elementTypes: [
88
+ IntType . int1,
89
+ IntType . int8,
90
+ IntType . int1,
91
+ PointerType ( pointee: IntType . int8) ,
92
+ ] , isPacked: true , in: Context . global)
93
+ let unpackedStruct = StructType ( elementTypes: [
94
+ IntType . int1,
95
+ IntType . int8,
96
+ IntType . int1,
97
+ PointerType ( pointee: IntType . int8) ,
98
+ ] , isPacked: false , in: Context . global)
99
+
100
+ let packedLayout64 = mod. dataLayout. layout ( of: packedStruct)
101
+ XCTAssertEqual ( packedLayout64. alignment, Alignment . one)
102
+ XCTAssertEqual ( packedLayout64. size, Size ( 11 ) )
103
+ XCTAssertEqual ( packedLayout64. elementCount, 4 )
104
+ XCTAssertFalse ( packedLayout64. isPadded)
105
+ XCTAssertEqual ( packedLayout64. memberOffsets, [
106
+ Size ( 0 ) , Size ( 1 ) , Size ( 2 ) , Size ( 3 ) ,
107
+ ] )
108
+ let unpackedLayout64 = mod. dataLayout. layout ( of: unpackedStruct)
109
+ XCTAssertEqual ( unpackedLayout64. alignment, Alignment ( 8 ) )
110
+ XCTAssertEqual ( unpackedLayout64. size, Size ( 16 ) )
111
+ XCTAssertEqual ( unpackedLayout64. elementCount, 4 )
112
+ XCTAssertTrue ( unpackedLayout64. isPadded)
113
+ XCTAssertEqual ( unpackedLayout64. memberOffsets, [
114
+ Size ( 0 ) , Size ( 1 ) , Size ( 2 ) , Size ( 8 ) ,
115
+ ] )
116
+
117
+ let aarch32 = try ! TargetMachine ( triple: " arm-- " , cpu: " " , features: " " ,
118
+ optLevel: . none, relocMode: . default, codeModel: . default)
119
+ mod. dataLayout = aarch32. dataLayout
120
+ XCTAssertEqual ( mod. dataLayoutString, " e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64 " )
121
+
122
+ let packedLayout32 = mod. dataLayout. layout ( of: packedStruct)
123
+ XCTAssertEqual ( packedLayout32. alignment, Alignment . one)
124
+ XCTAssertEqual ( packedLayout32. size, Size ( 7 ) )
125
+ XCTAssertEqual ( packedLayout32. elementCount, 4 )
126
+ XCTAssertFalse ( packedLayout32. isPadded)
127
+ XCTAssertEqual ( packedLayout32. memberOffsets, [
128
+ Size ( 0 ) , Size ( 1 ) , Size ( 2 ) , Size ( 3 ) ,
129
+ ] )
130
+ let unpackedLayout32 = mod. dataLayout. layout ( of: unpackedStruct)
131
+ XCTAssertEqual ( unpackedLayout32. alignment, Alignment ( 4 ) )
132
+ XCTAssertEqual ( unpackedLayout32. size, Size ( 8 ) )
133
+ XCTAssertEqual ( unpackedLayout32. elementCount, 4 )
134
+ XCTAssertTrue ( unpackedLayout32. isPadded)
135
+ XCTAssertEqual ( unpackedLayout32. memberOffsets, [
136
+ Size ( 0 ) , Size ( 1 ) , Size ( 2 ) , Size ( 4 ) ,
137
+ ] )
138
+ }
139
+
80
140
81
141
#if !os(macOS)
82
142
static var allTests = testCase ( [
83
143
( " testAlign " , testAlign) ,
84
144
( " testEmptyStructLayout " , testEmptyStructLayout) ,
85
145
( " testStructLayout " , testStructLayout) ,
146
+ ( " testStructLayoutOnMachine " , testStructLayoutOnMachine) ,
86
147
] )
87
148
#endif
88
149
}
0 commit comments