1*e84751a2SVladimir Makaev #![feature(repr128)]
2*e84751a2SVladimir Makaev #![feature(rustc_attrs)]
3*e84751a2SVladimir Makaev #![feature(const_option)]
4*e84751a2SVladimir Makaev
5*e84751a2SVladimir Makaev use core::num::{NonZeroI128, NonZeroU32};
6*e84751a2SVladimir Makaev
7*e84751a2SVladimir Makaev /// This file was manually compiled with rustc as object file
8*e84751a2SVladimir Makaev /// obj2yaml tool was used to convert this to main.yaml
9*e84751a2SVladimir Makaev /// This is done in order to make the test portable since LLVM codebase tests don't have setup to compile Rust programs
10*e84751a2SVladimir Makaev /// no_std , no_main is used in order to make the object file as small as possible eliminating extra symbols from standard library
11*e84751a2SVladimir Makaev /// static global variables are used because they can be inspected on object file without starting the process
12*e84751a2SVladimir Makaev
13*e84751a2SVladimir Makaev /// Command:
14*e84751a2SVladimir Makaev /// rustc -g --emit=obj --crate-type=bin -C panic=abort -C link-arg=-nostdlib main.rs && obj2yaml main.o -o main.yaml
15*e84751a2SVladimir Makaev use core::ptr::NonNull;
16*e84751a2SVladimir Makaev
17*e84751a2SVladimir Makaev pub enum CLikeEnumDefault {
18*e84751a2SVladimir Makaev A = 2,
19*e84751a2SVladimir Makaev B = 10,
20*e84751a2SVladimir Makaev }
21*e84751a2SVladimir Makaev
22*e84751a2SVladimir Makaev #[repr(u8)]
23*e84751a2SVladimir Makaev pub enum CLikeEnumReprU8 {
24*e84751a2SVladimir Makaev VariantA,
25*e84751a2SVladimir Makaev VariantB,
26*e84751a2SVladimir Makaev VariantC,
27*e84751a2SVladimir Makaev }
28*e84751a2SVladimir Makaev
29*e84751a2SVladimir Makaev #[repr(u32)]
30*e84751a2SVladimir Makaev pub enum CLikeEnumReprU32 {
31*e84751a2SVladimir Makaev VariantA = 1,
32*e84751a2SVladimir Makaev VariantB = 2,
33*e84751a2SVladimir Makaev VariantC = 3,
34*e84751a2SVladimir Makaev }
35*e84751a2SVladimir Makaev
36*e84751a2SVladimir Makaev pub enum EnumWithTuples {
37*e84751a2SVladimir Makaev A(u8),
38*e84751a2SVladimir Makaev B(u16),
39*e84751a2SVladimir Makaev C(u32),
40*e84751a2SVladimir Makaev D(usize),
41*e84751a2SVladimir Makaev AA(u8, u8),
42*e84751a2SVladimir Makaev BB(u16, u16),
43*e84751a2SVladimir Makaev BC(u16, u32),
44*e84751a2SVladimir Makaev CC(u32, u32),
45*e84751a2SVladimir Makaev // no DD on purpose to have D = CC in size
46*e84751a2SVladimir Makaev }
47*e84751a2SVladimir Makaev
48*e84751a2SVladimir Makaev pub enum EnumWithStructs {
49*e84751a2SVladimir Makaev A(Struct1),
50*e84751a2SVladimir Makaev B(Struct2),
51*e84751a2SVladimir Makaev }
52*e84751a2SVladimir Makaev
53*e84751a2SVladimir Makaev #[repr(usize)]
54*e84751a2SVladimir Makaev pub enum MixedEnum {
55*e84751a2SVladimir Makaev A,
56*e84751a2SVladimir Makaev B(i32),
57*e84751a2SVladimir Makaev C(u8, i32),
58*e84751a2SVladimir Makaev D(Option<Struct2>),
59*e84751a2SVladimir Makaev E(EnumWithStructs),
60*e84751a2SVladimir Makaev }
61*e84751a2SVladimir Makaev
62*e84751a2SVladimir Makaev pub struct Struct1 {
63*e84751a2SVladimir Makaev field: i32,
64*e84751a2SVladimir Makaev }
65*e84751a2SVladimir Makaev
66*e84751a2SVladimir Makaev pub struct Struct2 {
67*e84751a2SVladimir Makaev field: u32,
68*e84751a2SVladimir Makaev inner: Struct1,
69*e84751a2SVladimir Makaev }
70*e84751a2SVladimir Makaev
71*e84751a2SVladimir Makaev pub struct NonNullHolder {
72*e84751a2SVladimir Makaev inner: Option<NonNull<u64>>,
73*e84751a2SVladimir Makaev }
74*e84751a2SVladimir Makaev
75*e84751a2SVladimir Makaev pub enum NicheLayoutEnum {
76*e84751a2SVladimir Makaev Tag1,
77*e84751a2SVladimir Makaev Data { my_data: CLikeEnumDefault },
78*e84751a2SVladimir Makaev Tag2,
79*e84751a2SVladimir Makaev }
80*e84751a2SVladimir Makaev
81*e84751a2SVladimir Makaev // The following three types will use a niche layout once
82*e84751a2SVladimir Makaev pub enum NicheLayoutWithFields1<'a> {
83*e84751a2SVladimir Makaev A(&'a u8, u32),
84*e84751a2SVladimir Makaev B(u32),
85*e84751a2SVladimir Makaev }
86*e84751a2SVladimir Makaev
87*e84751a2SVladimir Makaev pub enum NicheLayoutWithFields2 {
88*e84751a2SVladimir Makaev A(NonZeroU32, u64),
89*e84751a2SVladimir Makaev B(u64),
90*e84751a2SVladimir Makaev }
91*e84751a2SVladimir Makaev
92*e84751a2SVladimir Makaev pub enum NicheLayoutWithFields3 {
93*e84751a2SVladimir Makaev A(u8, bool),
94*e84751a2SVladimir Makaev B(u8),
95*e84751a2SVladimir Makaev C(bool),
96*e84751a2SVladimir Makaev D(u8),
97*e84751a2SVladimir Makaev E(u8),
98*e84751a2SVladimir Makaev F,
99*e84751a2SVladimir Makaev }
100*e84751a2SVladimir Makaev
101*e84751a2SVladimir Makaev #[repr(i128)]
102*e84751a2SVladimir Makaev enum DirectTag128 {
103*e84751a2SVladimir Makaev A(u32),
104*e84751a2SVladimir Makaev B(u32),
105*e84751a2SVladimir Makaev }
106*e84751a2SVladimir Makaev
107*e84751a2SVladimir Makaev static CLIKE_DEFAULT_A: CLikeEnumDefault = CLikeEnumDefault::A;
108*e84751a2SVladimir Makaev static CLIKE_DEFAULT_B: CLikeEnumDefault = CLikeEnumDefault::B;
109*e84751a2SVladimir Makaev
110*e84751a2SVladimir Makaev static CLIKE_U8_A: CLikeEnumReprU8 = CLikeEnumReprU8::VariantA;
111*e84751a2SVladimir Makaev static CLIKE_U8_B: CLikeEnumReprU8 = CLikeEnumReprU8::VariantB;
112*e84751a2SVladimir Makaev static CLIKE_U8_C: CLikeEnumReprU8 = CLikeEnumReprU8::VariantC;
113*e84751a2SVladimir Makaev
114*e84751a2SVladimir Makaev static CLIKE_U32_A: CLikeEnumReprU32 = CLikeEnumReprU32::VariantA;
115*e84751a2SVladimir Makaev static CLIKE_U32_B: CLikeEnumReprU32 = CLikeEnumReprU32::VariantB;
116*e84751a2SVladimir Makaev static CLIKE_U32_C: CLikeEnumReprU32 = CLikeEnumReprU32::VariantC;
117*e84751a2SVladimir Makaev
118*e84751a2SVladimir Makaev static ENUM_WITH_TUPLES_A: EnumWithTuples = EnumWithTuples::A(13);
119*e84751a2SVladimir Makaev static ENUM_WITH_TUPLES_AA: EnumWithTuples = EnumWithTuples::AA(13, 37);
120*e84751a2SVladimir Makaev static ENUM_WITH_TUPLES_B: EnumWithTuples = EnumWithTuples::B(37);
121*e84751a2SVladimir Makaev static ENUM_WITH_TUPLES_BB: EnumWithTuples = EnumWithTuples::BB(37, 5535);
122*e84751a2SVladimir Makaev static ENUM_WITH_TUPLES_BC: EnumWithTuples = EnumWithTuples::BC(65000, 165000);
123*e84751a2SVladimir Makaev static ENUM_WITH_TUPLES_C: EnumWithTuples = EnumWithTuples::C(31337);
124*e84751a2SVladimir Makaev static ENUM_WITH_TUPLES_CC: EnumWithTuples = EnumWithTuples::CC(31337, 87236);
125*e84751a2SVladimir Makaev static ENUM_WITH_TUPLES_D: EnumWithTuples = EnumWithTuples::D(123456789012345678);
126*e84751a2SVladimir Makaev
127*e84751a2SVladimir Makaev static MIXED_ENUM_A: MixedEnum = MixedEnum::A;
128*e84751a2SVladimir Makaev static MIXED_ENUM_B: MixedEnum = MixedEnum::B(-10);
129*e84751a2SVladimir Makaev static MIXED_ENUM_C: MixedEnum = MixedEnum::C(254, -254);
130*e84751a2SVladimir Makaev static MIXED_ENUM_D_NONE: MixedEnum = MixedEnum::D(None);
131*e84751a2SVladimir Makaev static MIXED_ENUM_D_SOME: MixedEnum = MixedEnum::D(Some(Struct2 {
132*e84751a2SVladimir Makaev field: 123456,
133*e84751a2SVladimir Makaev inner: Struct1 { field: 123 },
134*e84751a2SVladimir Makaev }));
135*e84751a2SVladimir Makaev
136*e84751a2SVladimir Makaev static NICHE_W_FIELDS_1_A: NicheLayoutWithFields1 = NicheLayoutWithFields1::A(&77, 7);
137*e84751a2SVladimir Makaev static NICHE_W_FIELDS_1_B: NicheLayoutWithFields1 = NicheLayoutWithFields1::B(99);
138*e84751a2SVladimir Makaev static NICHE_W_FIELDS_2_A: NicheLayoutWithFields2 =
139*e84751a2SVladimir Makaev NicheLayoutWithFields2::A(NonZeroU32::new(800).unwrap(), 900);
140*e84751a2SVladimir Makaev static NICHE_W_FIELDS_2_B: NicheLayoutWithFields2 = NicheLayoutWithFields2::B(1000);
141*e84751a2SVladimir Makaev static NICHE_W_FIELDS_3_A: NicheLayoutWithFields3 = NicheLayoutWithFields3::A(137, true);
142*e84751a2SVladimir Makaev static NICHE_W_FIELDS_3_B: NicheLayoutWithFields3 = NicheLayoutWithFields3::B(12);
143*e84751a2SVladimir Makaev static NICHE_W_FIELDS_3_C: NicheLayoutWithFields3 = NicheLayoutWithFields3::C(false);
144*e84751a2SVladimir Makaev static NICHE_W_FIELDS_3_D: NicheLayoutWithFields3 = NicheLayoutWithFields3::D(34);
145*e84751a2SVladimir Makaev static NICHE_W_FIELDS_3_E: NicheLayoutWithFields3 = NicheLayoutWithFields3::E(56);
146*e84751a2SVladimir Makaev static NICHE_W_FIELDS_3_F: NicheLayoutWithFields3 = NicheLayoutWithFields3::F;
147*e84751a2SVladimir Makaev
148*e84751a2SVladimir Makaev static DIRECT_TAG_128_A: DirectTag128 = DirectTag128::A(12345);
149*e84751a2SVladimir Makaev static DIRECT_TAG_128_B: DirectTag128 = DirectTag128::B(6789);
150*e84751a2SVladimir Makaev
main()151*e84751a2SVladimir Makaev pub fn main() {
152*e84751a2SVladimir Makaev let niche_w_fields_1_a: NicheLayoutWithFields1 = NicheLayoutWithFields1::A(&77, 7);
153*e84751a2SVladimir Makaev let niche_w_fields_1_b: NicheLayoutWithFields1 = NicheLayoutWithFields1::B(99);
154*e84751a2SVladimir Makaev let direct_tag_128_a: DirectTag128 = DirectTag128::A(0xF1F2);
155*e84751a2SVladimir Makaev let direct_tag_128_b: DirectTag128 = DirectTag128::B(0xF3F4);
156*e84751a2SVladimir Makaev let non_null = unsafe {
157*e84751a2SVladimir Makaev NonNullHolder {
158*e84751a2SVladimir Makaev inner: NonNull::new(12345 as *mut u64),
159*e84751a2SVladimir Makaev }
160*e84751a2SVladimir Makaev };
161*e84751a2SVladimir Makaev }
162