Skip to content

Commit 13191c2

Browse files
Merge pull request #263 from tannergooding/main
Revert the handling for struct packing as it regresses more scenarios than it fixed
2 parents 700c805 + 9ecf2e7 commit 13191c2

File tree

17 files changed

+124
-80
lines changed

17 files changed

+124
-80
lines changed

sources/ClangSharp.PInvokeGenerator/PInvokeGenerator.VisitDecl.cs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,8 +1113,7 @@ private void VisitRecordDecl(RecordDecl recordDecl)
11131113
long alignment32 = -1;
11141114
long alignment64 = -1;
11151115

1116-
GetTypeSize(recordDecl, recordDecl.TypeForDecl, ref alignment32, ref alignment64, out var size32,
1117-
out var size64);
1116+
GetTypeSize(recordDecl, recordDecl.TypeForDecl, ref alignment32, ref alignment64, out var size32, out var size64);
11181117

11191118
string nativeNameWithExtras = null, nativeInheritance = null;
11201119
if ((cxxRecordDecl != null) && cxxRecordDecl.Bases.Any())
@@ -1151,7 +1150,7 @@ private void VisitRecordDecl(RecordDecl recordDecl)
11511150
Alignment64 = alignment64,
11521151
Size32 = size32,
11531152
Size64 = size64,
1154-
Pack = recordDecl.HasAttrs && recordDecl.Attrs.Any((attr) => attr.Kind == CX_AttrKind.CX_AttrKind_MaxFieldAlignment) && ((alignment != alignment32) || (alignment != alignment64)) ? alignment : 0,
1153+
Pack = alignment < maxAlignm ? alignment : 0,
11551154
MaxFieldAlignment = maxAlignm,
11561155
Kind = layoutKind
11571156
},
@@ -2183,8 +2182,7 @@ void VisitConstantArrayFieldDecl(RecordDecl recordDecl, FieldDecl constantArray)
21832182
long alignment32 = -1;
21842183
long alignment64 = -1;
21852184

2186-
GetTypeSize(constantArray, constantArray.Type, ref alignment32, ref alignment64, out var size32,
2187-
out var size64);
2185+
GetTypeSize(constantArray, constantArray.Type, ref alignment32, ref alignment64, out var size32, out var size64);
21882186

21892187
if ((size32 == 0 || size64 == 0) && _testOutputBuilder != null)
21902188
{
@@ -2201,7 +2199,7 @@ void VisitConstantArrayFieldDecl(RecordDecl recordDecl, FieldDecl constantArray)
22012199
Alignment64 = alignment64,
22022200
Size32 = size32,
22032201
Size64 = size64,
2204-
Pack = recordDecl.HasAttrs && recordDecl.Attrs.Any((attr) => attr.Kind == CX_AttrKind.CX_AttrKind_MaxFieldAlignment) && ((alignment != alignment32) || (alignment != alignment64)) ? alignment : 0,
2202+
Pack = alignment < maxAlignm ? alignment : 0,
22052203
MaxFieldAlignment = maxAlignm,
22062204
Kind = LayoutKind.Sequential
22072205
},
@@ -3136,8 +3134,7 @@ private bool IsConstant(Expr initExpr)
31363134
long alignment32 = -1;
31373135
long alignment64 = -1;
31383136

3139-
GetTypeSize(unaryExprOrTypeTraitExpr, argumentType, ref alignment32, ref alignment64, out var size32,
3140-
out var size64);
3137+
GetTypeSize(unaryExprOrTypeTraitExpr, argumentType, ref alignment32, ref alignment64, out var size32, out var size64);
31413138

31423139
switch (unaryExprOrTypeTraitExpr.Kind)
31433140
{

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpCompatibleUnix/StructDeclarationTest.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,36 +1323,42 @@ struct MyStruct2 {
13231323
};
13241324
";
13251325

1326-
const string ExpectedOutputContents = @"using System.Runtime.InteropServices;
1326+
var usingStatement = "using System.Runtime.InteropServices;\n\n";
1327+
var packing = " [StructLayout(LayoutKind.Sequential, Pack = 4)]\n";
13271328

1328-
namespace ClangSharp.Test
1329-
{
1329+
if (!Environment.Is64BitProcess)
1330+
{
1331+
usingStatement = string.Empty;
1332+
packing = string.Empty;
1333+
}
1334+
1335+
var expectedOutputContents = $@"{usingStatement}namespace ClangSharp.Test
1336+
{{
13301337
public unsafe partial struct MyStruct1
1331-
{
1338+
{{
13321339
[NativeTypeName(""unsigned int"")]
13331340
public uint Field1;
13341341
13351342
public void* Field2;
13361343
13371344
[NativeTypeName(""unsigned int"")]
13381345
public uint Field3;
1339-
}
1346+
}}
13401347
1341-
[StructLayout(LayoutKind.Sequential, Pack = 4)]
1342-
public unsafe partial struct MyStruct2
1343-
{
1348+
{packing} public unsafe partial struct MyStruct2
1349+
{{
13441350
[NativeTypeName(""unsigned int"")]
13451351
public uint Field1;
13461352
13471353
public void* Field2;
13481354
13491355
[NativeTypeName(""unsigned int"")]
13501356
public uint Field3;
1351-
}
1352-
}
1357+
}}
1358+
}}
13531359
";
13541360

1355-
return ValidateGeneratedCSharpCompatibleUnixBindingsAsync(InputContents, ExpectedOutputContents);
1361+
return ValidateGeneratedCSharpCompatibleUnixBindingsAsync(InputContents, expectedOutputContents);
13561362
}
13571363

13581364
public override Task PointerToSelfTest()

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpCompatibleUnix/UnionDeclarationTest.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,13 @@ union MyUnion3
133133
unsigned int o0_b1_1 : 1;
134134
};
135135
";
136+
var expectedPack = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ", Pack = 1" : "";
136137

137138
var expectedOutputContents = $@"using System.Runtime.InteropServices;
138139
139140
namespace ClangSharp.Test
140141
{{
141-
[StructLayout(LayoutKind.Explicit)]
142+
[StructLayout(LayoutKind.Explicit{expectedPack})]
142143
public partial struct MyUnion1
143144
{{
144145
[FieldOffset(0)]
@@ -287,7 +288,7 @@ public uint o8_b0_1
287288
}}
288289
}}
289290
290-
[StructLayout(LayoutKind.Explicit)]
291+
[StructLayout(LayoutKind.Explicit{expectedPack})]
291292
public partial struct MyUnion3
292293
{{
293294
[FieldOffset(0)]

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpCompatibleWindows/StructDeclarationTest.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,36 +1327,42 @@ struct MyStruct2 {
13271327
};
13281328
";
13291329

1330-
const string ExpectedOutputContents = @"using System.Runtime.InteropServices;
1330+
var usingStatement = "using System.Runtime.InteropServices;\n\n";
1331+
var packing = " [StructLayout(LayoutKind.Sequential, Pack = 4)]\n";
13311332

1332-
namespace ClangSharp.Test
1333-
{
1333+
if (!Environment.Is64BitProcess)
1334+
{
1335+
usingStatement = string.Empty;
1336+
packing = string.Empty;
1337+
}
1338+
1339+
var expectedOutputContents = $@"{usingStatement}namespace ClangSharp.Test
1340+
{{
13341341
public unsafe partial struct MyStruct1
1335-
{
1342+
{{
13361343
[NativeTypeName(""unsigned int"")]
13371344
public uint Field1;
13381345
13391346
public void* Field2;
13401347
13411348
[NativeTypeName(""unsigned int"")]
13421349
public uint Field3;
1343-
}
1350+
}}
13441351
1345-
[StructLayout(LayoutKind.Sequential, Pack = 4)]
1346-
public unsafe partial struct MyStruct2
1347-
{
1352+
{packing} public unsafe partial struct MyStruct2
1353+
{{
13481354
[NativeTypeName(""unsigned int"")]
13491355
public uint Field1;
13501356
13511357
public void* Field2;
13521358
13531359
[NativeTypeName(""unsigned int"")]
13541360
public uint Field3;
1355-
}
1356-
}
1361+
}}
1362+
}}
13571363
";
13581364

1359-
return ValidateGeneratedCSharpCompatibleWindowsBindingsAsync(InputContents, ExpectedOutputContents);
1365+
return ValidateGeneratedCSharpCompatibleWindowsBindingsAsync(InputContents, expectedOutputContents);
13601366
}
13611367

13621368
public override Task PointerToSelfTest()

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpCompatibleWindows/UnionDeclarationTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,13 @@ union MyUnion3
134134
};
135135
";
136136

137+
var expectedPack = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ", Pack = 1" : "";
138+
137139
var expectedOutputContents = $@"using System.Runtime.InteropServices;
138140
139141
namespace ClangSharp.Test
140142
{{
141-
[StructLayout(LayoutKind.Explicit)]
143+
[StructLayout(LayoutKind.Explicit{expectedPack})]
142144
public partial struct MyUnion1
143145
{{
144146
[FieldOffset(0)]
@@ -293,7 +295,7 @@ public uint o8_b0_1
293295
}}
294296
}}
295297
296-
[StructLayout(LayoutKind.Explicit)]
298+
[StructLayout(LayoutKind.Explicit{expectedPack})]
297299
public partial struct MyUnion3
298300
{{
299301
[FieldOffset(0)]

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpLatestUnix/StructDeclarationTest.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,36 +1302,42 @@ struct MyStruct2 {
13021302
};
13031303
";
13041304

1305-
const string ExpectedOutputContents = @"using System.Runtime.InteropServices;
1305+
var usingStatement = "using System.Runtime.InteropServices;\n\n";
1306+
var packing = " [StructLayout(LayoutKind.Sequential, Pack = 4)]\n";
13061307

1307-
namespace ClangSharp.Test
1308-
{
1308+
if (!Environment.Is64BitProcess)
1309+
{
1310+
usingStatement = string.Empty;
1311+
packing = string.Empty;
1312+
}
1313+
1314+
var expectedOutputContents = $@"{usingStatement}namespace ClangSharp.Test
1315+
{{
13091316
public unsafe partial struct MyStruct1
1310-
{
1317+
{{
13111318
[NativeTypeName(""unsigned int"")]
13121319
public uint Field1;
13131320
13141321
public void* Field2;
13151322
13161323
[NativeTypeName(""unsigned int"")]
13171324
public uint Field3;
1318-
}
1325+
}}
13191326
1320-
[StructLayout(LayoutKind.Sequential, Pack = 4)]
1321-
public unsafe partial struct MyStruct2
1322-
{
1327+
{packing} public unsafe partial struct MyStruct2
1328+
{{
13231329
[NativeTypeName(""unsigned int"")]
13241330
public uint Field1;
13251331
13261332
public void* Field2;
13271333
13281334
[NativeTypeName(""unsigned int"")]
13291335
public uint Field3;
1330-
}
1331-
}
1336+
}}
1337+
}}
13321338
";
13331339

1334-
return ValidateGeneratedCSharpLatestUnixBindingsAsync(InputContents, ExpectedOutputContents);
1340+
return ValidateGeneratedCSharpLatestUnixBindingsAsync(InputContents, expectedOutputContents);
13351341
}
13361342

13371343
public override Task PointerToSelfTest()

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpLatestUnix/UnionDeclarationTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,13 @@ union MyUnion3
134134
};
135135
";
136136

137+
var expectedPack = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ", Pack = 1" : "";
138+
137139
var expectedOutputContents = $@"using System.Runtime.InteropServices;
138140
139141
namespace ClangSharp.Test
140142
{{
141-
[StructLayout(LayoutKind.Explicit)]
143+
[StructLayout(LayoutKind.Explicit{expectedPack})]
142144
public partial struct MyUnion1
143145
{{
144146
[FieldOffset(0)]
@@ -287,7 +289,7 @@ public uint o8_b0_1
287289
}}
288290
}}
289291
290-
[StructLayout(LayoutKind.Explicit)]
292+
[StructLayout(LayoutKind.Explicit{expectedPack})]
291293
public partial struct MyUnion3
292294
{{
293295
[FieldOffset(0)]

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpLatestWindows/StructDeclarationTest.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,36 +1306,42 @@ struct MyStruct2 {
13061306
};
13071307
";
13081308

1309-
const string ExpectedOutputContents = @"using System.Runtime.InteropServices;
1309+
var usingStatement = "using System.Runtime.InteropServices;\n\n";
1310+
var packing = " [StructLayout(LayoutKind.Sequential, Pack = 4)]\n";
13101311

1311-
namespace ClangSharp.Test
1312-
{
1312+
if (!Environment.Is64BitProcess)
1313+
{
1314+
usingStatement = string.Empty;
1315+
packing = string.Empty;
1316+
}
1317+
1318+
var expectedOutputContents = $@"{usingStatement}namespace ClangSharp.Test
1319+
{{
13131320
public unsafe partial struct MyStruct1
1314-
{
1321+
{{
13151322
[NativeTypeName(""unsigned int"")]
13161323
public uint Field1;
13171324
13181325
public void* Field2;
13191326
13201327
[NativeTypeName(""unsigned int"")]
13211328
public uint Field3;
1322-
}
1329+
}}
13231330
1324-
[StructLayout(LayoutKind.Sequential, Pack = 4)]
1325-
public unsafe partial struct MyStruct2
1326-
{
1331+
{packing} public unsafe partial struct MyStruct2
1332+
{{
13271333
[NativeTypeName(""unsigned int"")]
13281334
public uint Field1;
13291335
13301336
public void* Field2;
13311337
13321338
[NativeTypeName(""unsigned int"")]
13331339
public uint Field3;
1334-
}
1335-
}
1340+
}}
1341+
}}
13361342
";
13371343

1338-
return ValidateGeneratedCSharpLatestWindowsBindingsAsync(InputContents, ExpectedOutputContents);
1344+
return ValidateGeneratedCSharpLatestWindowsBindingsAsync(InputContents, expectedOutputContents);
13391345
}
13401346

13411347
public override Task PointerToSelfTest()

tests/ClangSharp.PInvokeGenerator.UnitTests/CSharpLatestWindows/UnionDeclarationTest.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,13 @@ union MyUnion3
134134
};
135135
";
136136

137+
var expectedPack = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ", Pack = 1" : "";
138+
137139
var expectedOutputContents = $@"using System.Runtime.InteropServices;
138140
139141
namespace ClangSharp.Test
140142
{{
141-
[StructLayout(LayoutKind.Explicit)]
143+
[StructLayout(LayoutKind.Explicit{expectedPack})]
142144
public partial struct MyUnion1
143145
{{
144146
[FieldOffset(0)]
@@ -293,7 +295,7 @@ public uint o8_b0_1
293295
}}
294296
}}
295297
296-
[StructLayout(LayoutKind.Explicit)]
298+
[StructLayout(LayoutKind.Explicit{expectedPack})]
297299
public partial struct MyUnion3
298300
{{
299301
[FieldOffset(0)]

tests/ClangSharp.PInvokeGenerator.UnitTests/XmlCompatibleUnix/StructDeclarationTest.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,7 +1302,9 @@ struct MyStruct2 {
13021302
};
13031303
";
13041304

1305-
const string ExpectedOutputContents = @"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>
1305+
var packing = Environment.Is64BitProcess ? " layout=\"Sequential\" pack=\"4\"" : string.Empty;
1306+
1307+
var expectedOutputContents = $@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes"" ?>
13061308
<bindings>
13071309
<namespace name=""ClangSharp.Test"">
13081310
<struct name=""MyStruct1"" access=""public"" unsafe=""true"">
@@ -1316,7 +1318,7 @@ struct MyStruct2 {
13161318
<type native=""unsigned int"">uint</type>
13171319
</field>
13181320
</struct>
1319-
<struct name=""MyStruct2"" access=""public"" unsafe=""true"" layout=""Sequential"" pack=""4"">
1321+
<struct name=""MyStruct2"" access=""public"" unsafe=""true""{packing}>
13201322
<field name=""Field1"" access=""public"">
13211323
<type native=""unsigned int"">uint</type>
13221324
</field>
@@ -1331,7 +1333,7 @@ struct MyStruct2 {
13311333
</bindings>
13321334
";
13331335

1334-
return ValidateGeneratedXmlCompatibleUnixBindingsAsync(InputContents, ExpectedOutputContents);
1336+
return ValidateGeneratedXmlCompatibleUnixBindingsAsync(InputContents, expectedOutputContents);
13351337
}
13361338

13371339
public override Task PointerToSelfTest()

0 commit comments

Comments
 (0)