@@ -98,7 +98,8 @@ fn MachineVar::from_ssa(var : @ssa.Var) -> MachineVar {
98
98
struct Builder {
99
99
method : MachineMethod
100
100
vars : Map [Int , MachineVar ]
101
- imported_global_vars : Map [String , MachineVar ]
101
+ imported_global_consts : Map [String , MachineVar ]
102
+ imported_global_labels : Map [String , MachineVar ]
102
103
103
104
// for global vars
104
105
world : MachineWorld
@@ -112,7 +113,13 @@ fn Builder::new(world : MachineWorld, method : MachineMethod) -> Builder {
112
113
}
113
114
method .params.each (fn { p => vars .set (p .id, p ) })
114
115
method .local_vars.each (fn { v => vars .set (v .id, v ) })
115
- Builder ::{ method , vars , imported_global_vars : Map ::new (), world }
116
+ Builder ::{
117
+ method ,
118
+ vars ,
119
+ imported_global_consts : Map ::new (),
120
+ imported_global_labels : Map ::new (),
121
+ world ,
122
+ }
116
123
}
117
124
118
125
fn Builder ::get_var (self : Builder , var : @ssa .Var ) -> MachineVar {
@@ -433,25 +440,31 @@ fn Builder::build_rvalue(
433
440
Some (Int (x )) => Some (Int (x ))
434
441
Some (Double (x )) => {
435
442
let label = add_double_const (self .world, x )
436
- match self .imported_global_vars .get (label ) {
443
+ match self .imported_global_consts .get (label ) {
437
444
Some (tmp ) => Some (Var (tmp , Double ))
438
- None => {
439
- let addr = self .add_temp_var (Ptr )
440
- stmts .push (Definition (Some (addr ), LoadLabel (label )))
441
- Some (Load ((addr , 0 ), Double , 202 ))
442
- }
445
+ None =>
446
+ match self .imported_global_labels.get (label ) {
447
+ Some (addr ) => Some (Load ((addr , 0 ), Double , 202 ))
448
+ None => {
449
+ let addr = self .add_temp_var (Ptr )
450
+ stmts .push (Definition (Some (addr ), LoadLabel (label )))
451
+ self .imported_global_labels.set (label , addr )
452
+ Some (Load ((addr , 0 ), Double , 202 ))
453
+ }
454
+ }
443
455
}
444
456
}
445
457
None => {
446
458
let width = Width ::from_low_type (var .ty)
447
459
if var .is_global {
448
460
let (label , _ ) = self .world.globals.get (var .id).unwrap ()
449
- match self .imported_global_vars .get (label ) {
450
- Some (tmp ) => Some (Var ( tmp , width ))
461
+ match self .imported_global_labels .get (label ) {
462
+ Some (addr ) => Some (Load (( addr , 0 ), width , 203 ))
451
463
None => {
452
464
let addr = self .add_temp_var (Ptr )
453
465
stmts .push (Comment ("Get global var \{ v } " ))
454
466
stmts .push (Definition (Some (addr ), LoadLabel (label )))
467
+ self .imported_global_labels.set (label , addr )
455
468
Some (Load ((addr , 0 ), width , 203 ))
456
469
}
457
470
}
@@ -660,15 +673,19 @@ fn Builder::build_get_var(
660
673
} else if var .is_global {
661
674
match self .world.globals.get (var .id) {
662
675
Some ((label , g )) =>
663
- match self .imported_global_vars.get (label ) {
664
- Some (tmp ) => tmp
676
+ match self .imported_global_labels.get (label ) {
677
+ Some (addr ) => {
678
+ let tmp = self .add_temp_var (var .ty)
679
+ stmts .push (Definition (Some (tmp ), Load ((addr , 0 ), g .width, 207 )))
680
+ tmp
681
+ }
665
682
None => {
666
683
let addr = self .add_temp_var (Type ::Ptr )
667
684
let tmp = self .add_temp_var (var .ty)
668
685
stmts .push (Comment ("Get global var \{ var } " ))
669
686
stmts .push (Definition (Some (addr ), LoadLabel (label )))
670
687
stmts .push (Definition (Some (tmp ), Load ((addr , 0 ), g .width, 207 )))
671
- self .imported_global_vars .set (label , tmp )
688
+ self .imported_global_labels .set (label , addr )
672
689
tmp
673
690
}
674
691
}
@@ -688,15 +705,29 @@ fn Builder::build_double_const(
688
705
stmts : Array [StmtKind ]
689
706
) -> MachineVar {
690
707
let label = add_double_const (self .world, value )
691
- match self .imported_global_vars .get (label ) {
708
+ match self .imported_global_consts .get (label ) {
692
709
Some (tmp ) => tmp
693
- None => {
694
- let addr = self .add_temp_var (Type ::Ptr )
695
- stmts .push (Definition (Some (addr ), LoadLabel (label )))
696
- let local_const = self .add_temp_var (Double )
697
- stmts .push (Definition (Some (local_const ), Load ((addr , 0 ), Double , 208 )))
698
- self .imported_global_vars.set (label , local_const )
699
- local_const
700
- }
710
+ None =>
711
+ match self .imported_global_labels.get (label ) {
712
+ Some (addr ) => {
713
+ let local_const = self .add_temp_var (Double )
714
+ stmts .push (
715
+ Definition (Some (local_const ), Load ((addr , 0 ), Double , 208 )),
716
+ )
717
+ self .imported_global_consts.set (label , local_const )
718
+ local_const
719
+ }
720
+ None => {
721
+ let addr = self .add_temp_var (Type ::Ptr )
722
+ stmts .push (Definition (Some (addr ), LoadLabel (label )))
723
+ let local_const = self .add_temp_var (Double )
724
+ stmts .push (
725
+ Definition (Some (local_const ), Load ((addr , 0 ), Double , 208 )),
726
+ )
727
+ self .imported_global_labels.set (label , addr )
728
+ self .imported_global_consts.set (label , local_const )
729
+ local_const
730
+ }
731
+ }
701
732
}
702
733
}
0 commit comments