-
Notifications
You must be signed in to change notification settings - Fork 61
/
Copy pathmain.rs
161 lines (136 loc) · 4.79 KB
/
main.rs
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#![feature(repr128)]
#![feature(rustc_attrs)]
#![feature(const_option)]
use core::num::{NonZeroI128, NonZeroU32};
/// This file was manually compiled with rustc as object file
/// obj2yaml tool was used to convert this to main.yaml
/// This is done in order to make the test portable since LLVM codebase tests don't have setup to compile Rust programs
/// no_std , no_main is used in order to make the object file as small as possible eliminating extra symbols from standard library
/// static global variables are used because they can be inspected on object file without starting the process
/// Command:
/// rustc -g --emit=obj --crate-type=bin -C panic=abort -C link-arg=-nostdlib main.rs && obj2yaml main.o -o main.yaml
use core::ptr::NonNull;
pub enum CLikeEnumDefault {
A = 2,
B = 10,
}
#[repr(u8)]
pub enum CLikeEnumReprU8 {
VariantA,
VariantB,
VariantC,
}
#[repr(u32)]
pub enum CLikeEnumReprU32 {
VariantA = 1,
VariantB = 2,
VariantC = 3,
}
pub enum EnumWithTuples {
A(u8),
B(u16),
C(u32),
D(usize),
AA(u8, u8),
BB(u16, u16),
BC(u16, u32),
CC(u32, u32),
// no DD on purpose to have D = CC in size
}
pub enum EnumWithStructs {
A(Struct1),
B(Struct2),
}
#[repr(usize)]
pub enum MixedEnum {
A,
B(i32),
C(u8, i32),
D(Option<Struct2>),
E(EnumWithStructs),
}
pub struct Struct1 {
field: i32,
}
pub struct Struct2 {
field: u32,
inner: Struct1,
}
pub struct NonNullHolder {
inner: Option<NonNull<u64>>,
}
pub enum NicheLayoutEnum {
Tag1,
Data { my_data: CLikeEnumDefault },
Tag2,
}
// The following three types will use a niche layout once
pub enum NicheLayoutWithFields1<'a> {
A(&'a u8, u32),
B(u32),
}
pub enum NicheLayoutWithFields2 {
A(NonZeroU32, u64),
B(u64),
}
pub enum NicheLayoutWithFields3 {
A(u8, bool),
B(u8),
C(bool),
D(u8),
E(u8),
F,
}
#[repr(i128)]
enum DirectTag128 {
A(u32),
B(u32),
}
static CLIKE_DEFAULT_A: CLikeEnumDefault = CLikeEnumDefault::A;
static CLIKE_DEFAULT_B: CLikeEnumDefault = CLikeEnumDefault::B;
static CLIKE_U8_A: CLikeEnumReprU8 = CLikeEnumReprU8::VariantA;
static CLIKE_U8_B: CLikeEnumReprU8 = CLikeEnumReprU8::VariantB;
static CLIKE_U8_C: CLikeEnumReprU8 = CLikeEnumReprU8::VariantC;
static CLIKE_U32_A: CLikeEnumReprU32 = CLikeEnumReprU32::VariantA;
static CLIKE_U32_B: CLikeEnumReprU32 = CLikeEnumReprU32::VariantB;
static CLIKE_U32_C: CLikeEnumReprU32 = CLikeEnumReprU32::VariantC;
static ENUM_WITH_TUPLES_A: EnumWithTuples = EnumWithTuples::A(13);
static ENUM_WITH_TUPLES_AA: EnumWithTuples = EnumWithTuples::AA(13, 37);
static ENUM_WITH_TUPLES_B: EnumWithTuples = EnumWithTuples::B(37);
static ENUM_WITH_TUPLES_BB: EnumWithTuples = EnumWithTuples::BB(37, 5535);
static ENUM_WITH_TUPLES_BC: EnumWithTuples = EnumWithTuples::BC(65000, 165000);
static ENUM_WITH_TUPLES_C: EnumWithTuples = EnumWithTuples::C(31337);
static ENUM_WITH_TUPLES_CC: EnumWithTuples = EnumWithTuples::CC(31337, 87236);
static ENUM_WITH_TUPLES_D: EnumWithTuples = EnumWithTuples::D(123456789012345678);
static MIXED_ENUM_A: MixedEnum = MixedEnum::A;
static MIXED_ENUM_B: MixedEnum = MixedEnum::B(-10);
static MIXED_ENUM_C: MixedEnum = MixedEnum::C(254, -254);
static MIXED_ENUM_D_NONE: MixedEnum = MixedEnum::D(None);
static MIXED_ENUM_D_SOME: MixedEnum = MixedEnum::D(Some(Struct2 {
field: 123456,
inner: Struct1 { field: 123 },
}));
static NICHE_W_FIELDS_1_A: NicheLayoutWithFields1 = NicheLayoutWithFields1::A(&77, 7);
static NICHE_W_FIELDS_1_B: NicheLayoutWithFields1 = NicheLayoutWithFields1::B(99);
static NICHE_W_FIELDS_2_A: NicheLayoutWithFields2 =
NicheLayoutWithFields2::A(NonZeroU32::new(800).unwrap(), 900);
static NICHE_W_FIELDS_2_B: NicheLayoutWithFields2 = NicheLayoutWithFields2::B(1000);
static NICHE_W_FIELDS_3_A: NicheLayoutWithFields3 = NicheLayoutWithFields3::A(137, true);
static NICHE_W_FIELDS_3_B: NicheLayoutWithFields3 = NicheLayoutWithFields3::B(12);
static NICHE_W_FIELDS_3_C: NicheLayoutWithFields3 = NicheLayoutWithFields3::C(false);
static NICHE_W_FIELDS_3_D: NicheLayoutWithFields3 = NicheLayoutWithFields3::D(34);
static NICHE_W_FIELDS_3_E: NicheLayoutWithFields3 = NicheLayoutWithFields3::E(56);
static NICHE_W_FIELDS_3_F: NicheLayoutWithFields3 = NicheLayoutWithFields3::F;
static DIRECT_TAG_128_A: DirectTag128 = DirectTag128::A(12345);
static DIRECT_TAG_128_B: DirectTag128 = DirectTag128::B(6789);
pub fn main() {
let niche_w_fields_1_a: NicheLayoutWithFields1 = NicheLayoutWithFields1::A(&77, 7);
let niche_w_fields_1_b: NicheLayoutWithFields1 = NicheLayoutWithFields1::B(99);
let direct_tag_128_a: DirectTag128 = DirectTag128::A(0xF1F2);
let direct_tag_128_b: DirectTag128 = DirectTag128::B(0xF3F4);
let non_null = unsafe {
NonNullHolder {
inner: NonNull::new(12345 as *mut u64),
}
};
}