123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- // NOTE: Please read this before adding or changing anything in this file.
- //
- // This file doesn't contain any actual tests. It only contains structs.
- // Tests are automatically generated from all structs in this file,
- // which test:
- // - the size of the struct
- // - the offsets of each field
- //
- // When a struct contains a pointer, the test needs to use
- // OverrideOn32BitNative so that wasm tests can compare with the correct
- // values when testing 32-bit wasm on a 64-bit host platform.
- // While it would be possible to use Roslyn to calculate these
- // values automatically, for simplicity we use a couple of
- // generator-specific attributes to set these manually:
- // - [TestGeneratorOverride32BitSize(20)] should be set on a struct
- // - [TestGeneratorOverride32BitOffset(12)] should be set on a field
- // See the file below for examples.
- //
- // The test generation code lives in Burst.Compiler.IL.Tests.CodeGen.
- // After making changes to this file, please run that project.
- //
- // The generated tests are in 050-TestStructsLayout.Generated.cs.
-
- using System;
- using System.Runtime.InteropServices;
- using Unity.Burst.Intrinsics;
-
- namespace Burst.Compiler.IL.Tests
- {
- partial class TestStructsLayout
- {
- [StructLayout(LayoutKind.Explicit, Size = 8)]
- private unsafe struct CheckHoleInner
- {
- [FieldOffset(0)]
- public byte* m_Ptr;
- }
-
- [TestGeneratorOverride32BitSize(20)]
- private struct CheckHoleOuter
- {
- public CheckHoleInner a;
- public int b;
- [TestGeneratorOverride32BitOffset(12)]
- public CheckHoleInner c;
- }
-
- [StructLayout(LayoutKind.Explicit)]
- private struct ExplicitStructWithoutSize2
- {
- [FieldOffset(0)] public long a;
- [FieldOffset(8)] public sbyte b;
- [FieldOffset(9)] public int c;
- }
-
- [StructLayout(LayoutKind.Explicit)]
- private struct ExplicitStructWithoutSize
- {
- [FieldOffset(0)] public int a;
- [FieldOffset(4)] public sbyte b;
- [FieldOffset(5)] public int c;
- }
-
- [StructLayout(LayoutKind.Sequential, Size = 12)]
- private struct SequentialStructWithSize3
- {
- public int a;
- public int b;
- public sbyte c;
- }
-
- [StructLayout(LayoutKind.Sequential)]
- private struct SequentialStructWithoutSize
- {
- public int a;
- public int b;
- public sbyte c;
- }
-
- private struct SequentialStructEmptyNoAttributes { }
-
- [StructLayout(LayoutKind.Explicit)]
- private struct ExplicitStructWithEmptySequentialFields
- {
- [FieldOffset(0)] public SequentialStructEmptyNoAttributes FieldA;
- [FieldOffset(0)] public SequentialStructEmptyNoAttributes FieldB;
- }
-
- [StructLayout(LayoutKind.Explicit)]
- private struct ExplicitStrictWithEmptyAndNonEmptySequentialFields
- {
- [FieldOffset(0)] public SequentialStructEmptyNoAttributes FieldA;
- [FieldOffset(0)] public SequentialStructWithoutSize FieldB;
- }
-
- [StructLayout(LayoutKind.Sequential, Pack = 8)]
- private struct StructWithPack8
- {
- public int FieldA;
- public int FieldB;
- }
-
- [StructLayout(LayoutKind.Sequential, Pack = 2)]
- private struct StructPack2WithBytesAndInt
- {
- public byte FieldA;
- public byte FieldB;
- public int FieldC;
- }
-
- [StructLayout(LayoutKind.Sequential, Pack = 2)]
- private struct StructPack2WithBytesAndInts
- {
- public byte FieldA;
- public byte FieldB;
- public int FieldC;
- public int FieldD;
- }
-
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- private struct StructPack1WithBytesAndInt
- {
- public byte FieldA;
- public byte FieldB;
- public int FieldC;
- }
-
- [StructLayout(LayoutKind.Sequential, Pack = 1)]
- private struct StructPack1WithByteAndInt
- {
- public byte FieldA;
- public int FieldB;
- }
-
- private struct StructPack1WithByteAndIntWrapper
- {
- public StructPack1WithByteAndInt FieldA;
- public StructPack1WithByteAndInt FieldB;
- }
-
- private struct StructPack1WithByteAndIntWrapper2
- {
- public StructPack1WithByteAndIntWrapper FieldA;
- public StructPack1WithByteAndIntWrapper FieldB;
- }
-
- [StructLayout(LayoutKind.Sequential, Size = 12, Pack = 1)]
- private struct StructWithSizeAndPack
- {
- public double FieldA;
- public int FieldB;
- }
-
- private struct StructWithSizeAndPackWrapper
- {
- public byte FieldA;
- public StructWithSizeAndPack FieldB;
- }
-
- [StructLayout(LayoutKind.Explicit, Size = 12, Pack = 4)]
- private struct StructWithSizeAndPack4
- {
- [FieldOffset(0)]
- public double FieldA;
- [FieldOffset(8)]
- public int FieldB;
- }
-
- private struct StructWithSizeAndPack4Wrapper
- {
- public byte FieldA;
- public StructWithSizeAndPack4 FieldB;
- }
-
- [StructLayout(LayoutKind.Explicit, Pack = 1)]
- private struct StructExplicitPack1WithByteAndInt
- {
- [FieldOffset(0)]
- public byte FieldA;
-
- [FieldOffset(1)]
- public int FieldB;
- }
-
- private struct StructExplicitPack1WithByteAndIntWrapper
- {
- public StructExplicitPack1WithByteAndInt FieldA;
- public StructExplicitPack1WithByteAndInt FieldB;
- }
-
- private struct StructExplicitPack1WithByteAndIntWrapper2
- {
- public StructExplicitPack1WithByteAndIntWrapper FieldA;
- public StructExplicitPack1WithByteAndIntWrapper FieldB;
- }
-
- [StructLayout(LayoutKind.Explicit, Size = 12, Pack = 1)]
- private struct StructExplicitWithSizeAndPack
- {
- [FieldOffset(0)]
- public double FieldA;
- [FieldOffset(8)]
- public int FieldB;
- }
-
- private struct StructExplicitWithSizeAndPackWrapper
- {
- public byte FieldA;
- public StructExplicitWithSizeAndPack FieldB;
- }
-
- [StructLayout(LayoutKind.Explicit, Size = 12, Pack = 4)]
- private struct StructExplicitWithSizeAndPack4
- {
- [FieldOffset(0)]
- public double FieldA;
- [FieldOffset(8)]
- public int FieldB;
- }
-
- private struct StructExplicitWithSizeAndPack4Wrapper
- {
- public byte FieldA;
- public StructExplicitWithSizeAndPack4 FieldB;
- }
-
- private struct Vector64Container
- {
- public byte Byte;
- public v64 Vector;
- }
-
- private struct Vector128Container
- {
- public byte Byte;
- public v128 Vector;
- }
-
- private struct Vector256Container
- {
- public byte Byte;
- public v256 Vector;
- }
- }
-
- [AttributeUsage(AttributeTargets.Struct)]
- internal sealed class TestGeneratorOverride32BitSizeAttribute : Attribute
- {
- public readonly int Size;
-
- public TestGeneratorOverride32BitSizeAttribute(int size)
- {
- Size = size;
- }
- }
-
- [AttributeUsage(AttributeTargets.Field)]
- internal sealed class TestGeneratorOverride32BitOffsetAttribute : Attribute
- {
- public readonly int Offset;
-
- public TestGeneratorOverride32BitOffsetAttribute(int offset)
- {
- Offset = offset;
- }
- }
- }
|