diff --git a/lib/singlepass-backend/src/codegen_x64.rs b/lib/singlepass-backend/src/codegen_x64.rs index 7bc6581ba..afd358cc2 100644 --- a/lib/singlepass-backend/src/codegen_x64.rs +++ b/lib/singlepass-backend/src/codegen_x64.rs @@ -557,6 +557,7 @@ impl X64FunctionCode { fsm.trappable_offsets.insert( offset, OffsetInfo { + end_offset: offset + 1, activate_offset: offset, diff_id: state_diff_id, }, @@ -1179,7 +1180,7 @@ impl X64FunctionCode { let used_gprs = m.get_used_gprs(); for r in used_gprs.iter() { a.emit_push(Size::S64, Location::GPR(*r)); - let content = m.state.register_values[X64Register::GPR(*r).to_index().0]; + let content = m.state.register_values[X64Register::GPR(*r).to_index().0].clone(); assert!(content != MachineValue::Undefined); m.state.stack_values.push(content); } @@ -1204,7 +1205,7 @@ impl X64FunctionCode { ); } for r in used_xmms.iter().rev() { - let content = m.state.register_values[X64Register::XMM(*r).to_index().0]; + let content = m.state.register_values[X64Register::XMM(*r).to_index().0].clone(); assert!(content != MachineValue::Undefined); m.state.stack_values.push(content); } @@ -1244,7 +1245,8 @@ impl X64FunctionCode { Location::Memory(_, _) => { match *param { Location::GPR(x) => { - let content = m.state.register_values[X64Register::GPR(x).to_index().0]; + let content = + m.state.register_values[X64Register::GPR(x).to_index().0].clone(); // FIXME: There might be some corner cases (release -> emit_call_sysv -> acquire?) that cause this assertion to fail. // Hopefully nothing would be incorrect at runtime. @@ -1252,7 +1254,8 @@ impl X64FunctionCode { m.state.stack_values.push(content); } Location::XMM(x) => { - let content = m.state.register_values[X64Register::XMM(x).to_index().0]; + let content = + m.state.register_values[X64Register::XMM(x).to_index().0].clone(); //assert!(content != MachineValue::Undefined); m.state.stack_values.push(content); } @@ -1335,6 +1338,7 @@ impl X64FunctionCode { fsm.call_offsets.insert( offset, OffsetInfo { + end_offset: offset + 1, activate_offset: offset, diff_id: state_diff_id, }, @@ -1694,6 +1698,7 @@ impl FunctionCodeGenerator for X64FunctionCode { self.fsm.loop_offsets.insert( a.get_offset().0, OffsetInfo { + end_offset: a.get_offset().0 + 1, activate_offset, diff_id: state_diff_id, }, @@ -3958,6 +3963,7 @@ impl FunctionCodeGenerator for X64FunctionCode { self.fsm.loop_offsets.insert( a.get_offset().0, OffsetInfo { + end_offset: a.get_offset().0 + 1, activate_offset, diff_id: state_diff_id, }, diff --git a/lib/singlepass-backend/src/machine.rs b/lib/singlepass-backend/src/machine.rs index b09d0bf85..fdabfca9a 100644 --- a/lib/singlepass-backend/src/machine.rs +++ b/lib/singlepass-backend/src/machine.rs @@ -157,12 +157,12 @@ impl Machine { }; if let Location::GPR(x) = loc { self.used_gprs.insert(x); - self.state.register_values[X64Register::GPR(x).to_index().0] = *mv; + self.state.register_values[X64Register::GPR(x).to_index().0] = mv.clone(); } else if let Location::XMM(x) = loc { self.used_xmms.insert(x); - self.state.register_values[X64Register::XMM(x).to_index().0] = *mv; + self.state.register_values[X64Register::XMM(x).to_index().0] = mv.clone(); } else { - self.state.stack_values.push(*mv); + self.state.stack_values.push(mv.clone()); } self.state.wasm_stack.push(WasmAbstractValue::Runtime); ret.push(loc);