@@ -48,6 +48,7 @@ use std;
48
48
use llvm:: { ValueRef , True , IntEQ , IntNE } ;
49
49
use rustc:: ty:: layout;
50
50
use rustc:: ty:: { self , Ty , AdtKind } ;
51
+ use mir:: lvalue:: LvalueRef ;
51
52
use common:: * ;
52
53
use builder:: Builder ;
53
54
use glue;
@@ -64,32 +65,6 @@ pub enum BranchKind {
64
65
Single
65
66
}
66
67
67
- #[ derive( Copy , Clone ) ]
68
- pub struct MaybeSizedValue {
69
- pub value : ValueRef ,
70
- pub meta : ValueRef ,
71
- }
72
-
73
- impl MaybeSizedValue {
74
- pub fn sized ( value : ValueRef ) -> MaybeSizedValue {
75
- MaybeSizedValue {
76
- value : value,
77
- meta : std:: ptr:: null_mut ( )
78
- }
79
- }
80
-
81
- pub fn unsized_ ( value : ValueRef , meta : ValueRef ) -> MaybeSizedValue {
82
- MaybeSizedValue {
83
- value : value,
84
- meta : meta
85
- }
86
- }
87
-
88
- pub fn has_meta ( & self ) -> bool {
89
- !self . meta . is_null ( )
90
- }
91
- }
92
-
93
68
/// Given an enum, struct, closure, or tuple, extracts fields.
94
69
/// Treats closures as a struct with one variant.
95
70
/// `empty_if_no_variants` is a switch to deal with empty enums.
@@ -500,11 +475,11 @@ fn assert_discr_in_range(min: Disr, max: Disr, discr: Disr) {
500
475
/// Access a field, at a point when the value's case is known.
501
476
pub fn trans_field_ptr < ' a , ' tcx > (
502
477
bcx : & Builder < ' a , ' tcx > ,
503
- t : Ty < ' tcx > ,
504
- val : MaybeSizedValue ,
478
+ val : LvalueRef < ' tcx > ,
505
479
discr : Disr ,
506
480
ix : usize
507
481
) -> ValueRef {
482
+ let t = val. ty . to_ty ( bcx. tcx ( ) ) ;
508
483
let l = bcx. ccx . layout_of ( t) ;
509
484
debug ! ( "trans_field_ptr on {} represented as {:#?}" , t, l) ;
510
485
// Note: if this ever needs to generate conditionals (e.g., if we
@@ -520,7 +495,7 @@ pub fn trans_field_ptr<'a, 'tcx>(
520
495
layout:: Vector { count, .. } => {
521
496
assert_eq ! ( discr. 0 , 0 ) ;
522
497
assert ! ( ( ix as u64 ) < count) ;
523
- bcx. struct_gep ( val. value , ix)
498
+ bcx. struct_gep ( val. llval , ix)
524
499
}
525
500
layout:: General { discr : d, ref variants, .. } => {
526
501
let mut fields = compute_fields ( bcx. ccx , t, discr. 0 as usize , false ) ;
@@ -532,7 +507,7 @@ pub fn trans_field_ptr<'a, 'tcx>(
532
507
layout:: UntaggedUnion { .. } => {
533
508
let fields = compute_fields ( bcx. ccx , t, 0 , false ) ;
534
509
let ty = type_of:: in_memory_type_of ( bcx. ccx , fields[ ix] ) ;
535
- bcx. pointercast ( val. value , ty. ptr_to ( ) )
510
+ bcx. pointercast ( val. llval , ty. ptr_to ( ) )
536
511
}
537
512
layout:: RawNullablePointer { nndiscr, .. } |
538
513
layout:: StructWrappedNullablePointer { nndiscr, .. } if discr. 0 != nndiscr => {
@@ -541,14 +516,14 @@ pub fn trans_field_ptr<'a, 'tcx>(
541
516
// (e.d., Result of Either with (), as one side.)
542
517
let ty = type_of:: type_of ( bcx. ccx , nullfields[ ix] ) ;
543
518
assert_eq ! ( machine:: llsize_of_alloc( bcx. ccx, ty) , 0 ) ;
544
- bcx. pointercast ( val. value , ty. ptr_to ( ) )
519
+ bcx. pointercast ( val. llval , ty. ptr_to ( ) )
545
520
}
546
521
layout:: RawNullablePointer { nndiscr, .. } => {
547
522
let nnty = compute_fields ( bcx. ccx , t, nndiscr as usize , false ) [ 0 ] ;
548
523
assert_eq ! ( ix, 0 ) ;
549
524
assert_eq ! ( discr. 0 , nndiscr) ;
550
525
let ty = type_of:: type_of ( bcx. ccx , nnty) ;
551
- bcx. pointercast ( val. value , ty. ptr_to ( ) )
526
+ bcx. pointercast ( val. llval , ty. ptr_to ( ) )
552
527
}
553
528
layout:: StructWrappedNullablePointer { ref nonnull, nndiscr, .. } => {
554
529
assert_eq ! ( discr. 0 , nndiscr) ;
@@ -564,7 +539,7 @@ fn struct_field_ptr<'a, 'tcx>(
564
539
bcx : & Builder < ' a , ' tcx > ,
565
540
st : & layout:: Struct ,
566
541
fields : & Vec < Ty < ' tcx > > ,
567
- val : MaybeSizedValue ,
542
+ val : LvalueRef ,
568
543
ix : usize ,
569
544
needs_cast : bool
570
545
) -> ValueRef {
@@ -576,9 +551,9 @@ fn struct_field_ptr<'a, 'tcx>(
576
551
type_of:: in_memory_type_of ( ccx, fields[ i] )
577
552
} ) . collect :: < Vec < _ > > ( ) ;
578
553
let real_ty = Type :: struct_ ( ccx, & fields[ ..] , st. packed ) ;
579
- bcx. pointercast ( val. value , real_ty. ptr_to ( ) )
554
+ bcx. pointercast ( val. llval , real_ty. ptr_to ( ) )
580
555
} else {
581
- val. value
556
+ val. llval
582
557
} ;
583
558
584
559
// Simple case - we can just GEP the field
@@ -600,7 +575,7 @@ fn struct_field_ptr<'a, 'tcx>(
600
575
}
601
576
602
577
// There's no metadata available, log the case and just do the GEP.
603
- if !val. has_meta ( ) {
578
+ if !val. has_extra ( ) {
604
579
debug ! ( "Unsized field `{}`, of `{:?}` has no metadata for adjustment" ,
605
580
ix, Value ( ptr_val) ) ;
606
581
return bcx. struct_gep ( ptr_val, ix) ;
@@ -621,7 +596,7 @@ fn struct_field_ptr<'a, 'tcx>(
621
596
// The type Foo<Foo<Trait>> is represented in LLVM as { u16, { u16, u8 }}, meaning that
622
597
// the `y` field has 16-bit alignment.
623
598
624
- let meta = val. meta ;
599
+ let meta = val. llextra ;
625
600
626
601
627
602
let offset = st. offsets [ ix] . bytes ( ) ;
0 commit comments