1
- use crate :: ty:: { AdtDef , ClosureDef , Const , CoroutineDef , GenericArgs , Movability , Region } ;
1
+ use crate :: ty:: { AdtDef , ClosureDef , Const , CoroutineDef , GenericArgs , Movability , Region , Ty } ;
2
2
use crate :: Opaque ;
3
- use crate :: { ty :: Ty , Span } ;
3
+ use crate :: Span ;
4
4
5
5
/// The SMIR representation of a single function.
6
6
#[ derive( Clone , Debug ) ]
@@ -12,10 +12,10 @@ pub struct Body {
12
12
// The first local is the return value pointer, followed by `arg_count`
13
13
// locals for the function arguments, followed by any user-declared
14
14
// variables and temporaries.
15
- locals : LocalDecls ,
15
+ pub ( super ) locals : LocalDecls ,
16
16
17
17
// The number of arguments this function takes.
18
- arg_count : usize ,
18
+ pub ( super ) arg_count : usize ,
19
19
}
20
20
21
21
impl Body {
@@ -35,7 +35,7 @@ impl Body {
35
35
36
36
/// Return local that holds this function's return value.
37
37
pub fn ret_local ( & self ) -> & LocalDecl {
38
- & self . locals [ 0 ]
38
+ & self . locals [ RETURN_LOCAL ]
39
39
}
40
40
41
41
/// Locals in `self` that correspond to this function's arguments.
@@ -60,7 +60,7 @@ impl Body {
60
60
61
61
type LocalDecls = Vec < LocalDecl > ;
62
62
63
- #[ derive( Clone , Debug ) ]
63
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
64
64
pub struct LocalDecl {
65
65
pub ty : Ty ,
66
66
pub span : Span ,
@@ -72,13 +72,13 @@ pub struct BasicBlock {
72
72
pub terminator : Terminator ,
73
73
}
74
74
75
- #[ derive( Clone , Debug ) ]
75
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
76
76
pub struct Terminator {
77
77
pub kind : TerminatorKind ,
78
78
pub span : Span ,
79
79
}
80
80
81
- #[ derive( Clone , Debug ) ]
81
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
82
82
pub enum TerminatorKind {
83
83
Goto {
84
84
target : usize ,
@@ -122,7 +122,7 @@ pub enum TerminatorKind {
122
122
} ,
123
123
}
124
124
125
- #[ derive( Clone , Debug ) ]
125
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
126
126
pub struct InlineAsmOperand {
127
127
pub in_value : Option < Operand > ,
128
128
pub out_place : Option < Place > ,
@@ -131,15 +131,15 @@ pub struct InlineAsmOperand {
131
131
pub raw_rpr : String ,
132
132
}
133
133
134
- #[ derive( Clone , Debug ) ]
134
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
135
135
pub enum UnwindAction {
136
136
Continue ,
137
137
Unreachable ,
138
138
Terminate ,
139
139
Cleanup ( usize ) ,
140
140
}
141
141
142
- #[ derive( Clone , Debug ) ]
142
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
143
143
pub enum AssertMessage {
144
144
BoundsCheck { len : Operand , index : Operand } ,
145
145
Overflow ( BinOp , Operand , Operand ) ,
@@ -151,7 +151,7 @@ pub enum AssertMessage {
151
151
MisalignedPointerDereference { required : Operand , found : Operand } ,
152
152
}
153
153
154
- #[ derive( Clone , Debug ) ]
154
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
155
155
pub enum BinOp {
156
156
Add ,
157
157
AddUnchecked ,
@@ -177,20 +177,20 @@ pub enum BinOp {
177
177
Offset ,
178
178
}
179
179
180
- #[ derive( Clone , Debug ) ]
180
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
181
181
pub enum UnOp {
182
182
Not ,
183
183
Neg ,
184
184
}
185
185
186
- #[ derive( Clone , Debug ) ]
186
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
187
187
pub enum CoroutineKind {
188
188
Async ( CoroutineSource ) ,
189
189
Coroutine ,
190
190
Gen ( CoroutineSource ) ,
191
191
}
192
192
193
- #[ derive( Clone , Debug ) ]
193
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
194
194
pub enum CoroutineSource {
195
195
Block ,
196
196
Closure ,
@@ -204,7 +204,7 @@ pub(crate) type LocalDefId = Opaque;
204
204
pub ( crate ) type Coverage = Opaque ;
205
205
206
206
/// The FakeReadCause describes the type of pattern why a FakeRead statement exists.
207
- #[ derive( Clone , Debug ) ]
207
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
208
208
pub enum FakeReadCause {
209
209
ForMatchGuard ,
210
210
ForMatchedPlace ( LocalDefId ) ,
@@ -214,42 +214,42 @@ pub enum FakeReadCause {
214
214
}
215
215
216
216
/// Describes what kind of retag is to be performed
217
- #[ derive( Clone , Debug ) ]
217
+ #[ derive( Clone , Debug , Eq , PartialEq , Hash ) ]
218
218
pub enum RetagKind {
219
219
FnEntry ,
220
220
TwoPhase ,
221
221
Raw ,
222
222
Default ,
223
223
}
224
224
225
- #[ derive( Clone , Debug ) ]
225
+ #[ derive( Clone , Debug , Eq , PartialEq , Hash ) ]
226
226
pub enum Variance {
227
227
Covariant ,
228
228
Invariant ,
229
229
Contravariant ,
230
230
Bivariant ,
231
231
}
232
232
233
- #[ derive( Clone , Debug ) ]
233
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
234
234
pub struct CopyNonOverlapping {
235
235
pub src : Operand ,
236
236
pub dst : Operand ,
237
237
pub count : Operand ,
238
238
}
239
239
240
- #[ derive( Clone , Debug ) ]
240
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
241
241
pub enum NonDivergingIntrinsic {
242
242
Assume ( Operand ) ,
243
243
CopyNonOverlapping ( CopyNonOverlapping ) ,
244
244
}
245
245
246
- #[ derive( Clone , Debug ) ]
246
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
247
247
pub struct Statement {
248
248
pub kind : StatementKind ,
249
249
pub span : Span ,
250
250
}
251
251
252
- #[ derive( Clone , Debug ) ]
252
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
253
253
pub enum StatementKind {
254
254
Assign ( Place , Rvalue ) ,
255
255
FakeRead ( FakeReadCause , Place ) ,
@@ -266,7 +266,7 @@ pub enum StatementKind {
266
266
Nop ,
267
267
}
268
268
269
- #[ derive( Clone , Debug ) ]
269
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
270
270
pub enum Rvalue {
271
271
/// Creates a pointer with the indicated mutability to the place.
272
272
///
@@ -378,7 +378,7 @@ pub enum Rvalue {
378
378
Use ( Operand ) ,
379
379
}
380
380
381
- #[ derive( Clone , Debug ) ]
381
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
382
382
pub enum AggregateKind {
383
383
Array ( Ty ) ,
384
384
Tuple ,
@@ -387,49 +387,51 @@ pub enum AggregateKind {
387
387
Coroutine ( CoroutineDef , GenericArgs , Movability ) ,
388
388
}
389
389
390
- #[ derive( Clone , Debug ) ]
390
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
391
391
pub enum Operand {
392
392
Copy ( Place ) ,
393
393
Move ( Place ) ,
394
394
Constant ( Constant ) ,
395
395
}
396
396
397
- #[ derive( Clone , Debug ) ]
397
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
398
398
pub struct Place {
399
399
pub local : Local ,
400
400
/// projection out of a place (access a field, deref a pointer, etc)
401
401
pub projection : String ,
402
402
}
403
403
404
- #[ derive( Clone , Debug ) ]
404
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
405
405
pub struct UserTypeProjection {
406
406
pub base : UserTypeAnnotationIndex ,
407
407
pub projection : String ,
408
408
}
409
409
410
410
pub type Local = usize ;
411
411
412
+ pub const RETURN_LOCAL : Local = 0 ;
413
+
412
414
type FieldIdx = usize ;
413
415
414
416
/// The source-order index of a variant in a type.
415
417
pub type VariantIdx = usize ;
416
418
417
419
type UserTypeAnnotationIndex = usize ;
418
420
419
- #[ derive( Clone , Debug ) ]
421
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
420
422
pub struct Constant {
421
423
pub span : Span ,
422
424
pub user_ty : Option < UserTypeAnnotationIndex > ,
423
425
pub literal : Const ,
424
426
}
425
427
426
- #[ derive( Clone , Debug ) ]
428
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
427
429
pub struct SwitchTarget {
428
430
pub value : u128 ,
429
431
pub target : usize ,
430
432
}
431
433
432
- #[ derive( Clone , Debug ) ]
434
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
433
435
pub enum BorrowKind {
434
436
/// Data must be immutable and is aliasable.
435
437
Shared ,
@@ -446,26 +448,26 @@ pub enum BorrowKind {
446
448
} ,
447
449
}
448
450
449
- #[ derive( Clone , Debug ) ]
451
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
450
452
pub enum MutBorrowKind {
451
453
Default ,
452
454
TwoPhaseBorrow ,
453
455
ClosureCapture ,
454
456
}
455
457
456
- #[ derive( Clone , Debug ) ]
458
+ #[ derive( Clone , Debug , PartialEq , Eq ) ]
457
459
pub enum Mutability {
458
460
Not ,
459
461
Mut ,
460
462
}
461
463
462
- #[ derive( Copy , Clone , Debug ) ]
464
+ #[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
463
465
pub enum Safety {
464
466
Unsafe ,
465
467
Normal ,
466
468
}
467
469
468
- #[ derive( Clone , Debug ) ]
470
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
469
471
pub enum PointerCoercion {
470
472
/// Go from a fn-item type to a fn-pointer type.
471
473
ReifyFnPointer ,
@@ -492,7 +494,7 @@ pub enum PointerCoercion {
492
494
Unsize ,
493
495
}
494
496
495
- #[ derive( Clone , Debug ) ]
497
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
496
498
pub enum CastKind {
497
499
PointerExposeAddress ,
498
500
PointerFromExposedAddress ,
@@ -507,7 +509,7 @@ pub enum CastKind {
507
509
Transmute ,
508
510
}
509
511
510
- #[ derive( Clone , Debug ) ]
512
+ #[ derive( Clone , Debug , Eq , PartialEq ) ]
511
513
pub enum NullOp {
512
514
/// Returns the size of a value of that type.
513
515
SizeOf ,
0 commit comments