|
31 | 31 |
|
32 | 32 | pub struct CodeGenerator { |
33 | 33 | ir_graphs: Vec<IRGraph>, |
34 | | - jump_label: HashMap<usize, String>, |
| 34 | + jump_label: HashMap<(String, BlockIndex), String>, |
35 | 35 | } |
36 | 36 |
|
37 | 37 | impl CodeGenerator { |
@@ -140,7 +140,10 @@ impl CodeGenerator { |
140 | 140 | registers: &Registers, |
141 | 141 | ) -> String { |
142 | 142 | let mut code = String::new(); |
143 | | - let block_label = self.jump_label.get(&block_index).unwrap(); |
| 143 | + let block_label = self |
| 144 | + .jump_label |
| 145 | + .get(&(ir_graph.name().to_string(), block_index)) |
| 146 | + .unwrap(); |
144 | 147 | code.push_str(&format!("{}:\n", block_label)); |
145 | 148 |
|
146 | 149 | for (node_index, node) in block.get_nodes().iter().enumerate() { |
@@ -324,7 +327,10 @@ impl CodeGenerator { |
324 | 327 | node, |
325 | 328 | ); |
326 | 329 | let following_block_index = jump_information.get(&node_index).unwrap(); |
327 | | - let label = self.jump_label.get(following_block_index).unwrap(); |
| 330 | + let label = self |
| 331 | + .jump_label |
| 332 | + .get(&(ir_graph.name().to_string(), *following_block_index)) |
| 333 | + .unwrap(); |
328 | 334 | code.push_str(&self.generate_phi_moves( |
329 | 335 | block_index, |
330 | 336 | *following_block_index, |
@@ -372,7 +378,7 @@ impl CodeGenerator { |
372 | 378 | let following_block_index = jump_information.get(&node_index).unwrap(); |
373 | 379 | let jump_label = self |
374 | 380 | .jump_label |
375 | | - .get(following_block_index) |
| 381 | + .get(&(ir_graph.name().to_string(), *following_block_index)) |
376 | 382 | .expect("Expected jump label for false if"); |
377 | 383 | code.push_str(&self.generate_phi_moves( |
378 | 384 | block_index, |
@@ -620,7 +626,10 @@ impl CodeGenerator { |
620 | 626 | registers: &Registers, |
621 | 627 | ) -> Option<String> { |
622 | 628 | let mut code = String::new(); |
623 | | - let jump_label = self.jump_label.get(&jump_target).unwrap(); |
| 629 | + let jump_label = self |
| 630 | + .jump_label |
| 631 | + .get(&(ir_graph.name().to_string(), jump_target)) |
| 632 | + .unwrap(); |
624 | 633 | match comparision { |
625 | 634 | Node::Lower(data) |
626 | 635 | | Node::LowerEquals(data) |
@@ -898,20 +907,24 @@ fn move_stack_variable(register: &Box<dyn Register>) -> String { |
898 | 907 | code |
899 | 908 | } |
900 | 909 |
|
901 | | -fn calculate_jump_label(ir_graphs: &Vec<IRGraph>) -> HashMap<usize, String> { |
| 910 | +fn calculate_jump_label(ir_graphs: &Vec<IRGraph>) -> HashMap<(String, BlockIndex), String> { |
902 | 911 | let mut jump_label = HashMap::new(); |
903 | 912 | for ir_graph in ir_graphs { |
904 | 913 | for (block_index, block) in ir_graph.get_blocks().iter().enumerate() { |
905 | | - calculate_jump_label_block(block_index, block, &mut jump_label); |
| 914 | + calculate_jump_label_block(block_index, ir_graph, block, &mut jump_label); |
906 | 915 | } |
907 | 916 | } |
908 | 917 | jump_label |
909 | 918 | } |
910 | 919 |
|
911 | 920 | fn calculate_jump_label_block<'a>( |
912 | 921 | block_index: BlockIndex, |
| 922 | + ir_graph: &IRGraph, |
913 | 923 | _block: &Block, |
914 | | - current: &mut HashMap<usize, String>, |
| 924 | + current: &mut HashMap<(String, BlockIndex), String>, |
915 | 925 | ) { |
916 | | - current.insert(block_index, format!("LC{}", block_index)); |
| 926 | + current.insert( |
| 927 | + (ir_graph.name().to_string(), block_index), |
| 928 | + format!("LC{}{}", ir_graph.name(), block_index), |
| 929 | + ); |
917 | 930 | } |
0 commit comments