@@ -3,7 +3,7 @@ use core::fmt;
33use alloc:: { format, string:: ToString , vec:: Vec } ;
44use serde:: { Deserialize , Serialize } ;
55
6- use crate :: { Block , Function , Inst , InstRange , MachineEnv , Operand , PRegSet , RegClass , VReg } ;
6+ use crate :: { Block , Function , Inst , InstRange , MachineEnv , Operand , PReg , PRegSet , RegClass , VReg } ;
77
88#[ derive( Clone , Copy , Debug , PartialEq , Eq , Serialize , Deserialize ) ]
99enum InstOpcode {
@@ -37,7 +37,7 @@ struct InstData {
3737/// was created with.
3838#[ derive( Serialize , Deserialize ) ]
3939pub struct SerializableFunction {
40- machine_env : MachineEnv ,
40+ machine_env : SerializableMachineEnv ,
4141 entry_block : Block ,
4242 insts : Vec < InstData > ,
4343 blocks : Vec < InstRange > ,
@@ -57,7 +57,7 @@ impl SerializableFunction {
5757 /// `MachineEnv`.
5858 pub fn new ( func : & impl Function , machine_env : MachineEnv ) -> Self {
5959 Self {
60- machine_env,
60+ machine_env : SerializableMachineEnv :: new ( machine_env ) ,
6161 entry_block : func. entry_block ( ) ,
6262 insts : ( 0 ..func. num_insts ( ) )
6363 . map ( |i| {
@@ -123,8 +123,8 @@ impl SerializableFunction {
123123 }
124124
125125 /// Returns the `MachineEnv` associated with this function.
126- pub fn machine_env ( & self ) -> & MachineEnv {
127- & self . machine_env
126+ pub fn machine_env ( & self ) -> MachineEnv {
127+ self . machine_env . machine_env ( )
128128 }
129129}
130130
@@ -291,3 +291,47 @@ impl fmt::Debug for SerializableFunction {
291291 Ok ( ( ) )
292292 }
293293}
294+
295+ #[ derive( Serialize , Deserialize ) ]
296+ pub struct SerializableMachineEnv {
297+ preferred_regs_by_class : [ Vec < PReg > ; 3 ] ,
298+ non_preferred_regs_by_class : [ Vec < PReg > ; 3 ] ,
299+ scratch_by_class : [ Option < PReg > ; 3 ] ,
300+ fixed_stack_slots : Vec < PReg > ,
301+ }
302+
303+ impl SerializableMachineEnv {
304+ pub fn new ( machine_env : MachineEnv ) -> Self {
305+ Self {
306+ preferred_regs_by_class : [
307+ machine_env. preferred_regs_by_class [ 0 ] . to_vec ( ) ,
308+ machine_env. preferred_regs_by_class [ 1 ] . to_vec ( ) ,
309+ machine_env. preferred_regs_by_class [ 2 ] . to_vec ( ) ,
310+ ] ,
311+ non_preferred_regs_by_class : [
312+ machine_env. non_preferred_regs_by_class [ 0 ] . to_vec ( ) ,
313+ machine_env. non_preferred_regs_by_class [ 1 ] . to_vec ( ) ,
314+ machine_env. non_preferred_regs_by_class [ 2 ] . to_vec ( ) ,
315+ ] ,
316+ scratch_by_class : machine_env. scratch_by_class ,
317+ fixed_stack_slots : machine_env. fixed_stack_slots . to_vec ( ) ,
318+ }
319+ }
320+
321+ pub fn machine_env ( & self ) -> MachineEnv {
322+ MachineEnv {
323+ preferred_regs_by_class : [
324+ & self . preferred_regs_by_class [ 0 ] ,
325+ & self . preferred_regs_by_class [ 1 ] ,
326+ & self . preferred_regs_by_class [ 2 ] ,
327+ ] ,
328+ non_preferred_regs_by_class : [
329+ & self . non_preferred_regs_by_class [ 0 ] ,
330+ & self . non_preferred_regs_by_class [ 1 ] ,
331+ & self . non_preferred_regs_by_class [ 2 ] ,
332+ ] ,
333+ scratch_by_class : self . scratch_by_class ,
334+ fixed_stack_slots : & self . fixed_stack_slots ,
335+ }
336+ }
337+ }
0 commit comments