@@ -34,6 +34,7 @@ use rustc_session::cstore::{self, CrateSource};
3434use rustc_session:: utils:: NativeLibKind ;
3535use rustc_span:: symbol:: Symbol ;
3636use std:: path:: { Path , PathBuf } ;
37+ use rustc_serialize:: { Decodable , Decoder , Encoder , opaque} ;
3738
3839pub mod back;
3940pub mod base;
@@ -190,3 +191,33 @@ pub fn looks_like_rust_object_file(filename: &str) -> bool {
190191 // Check if the "inner" extension
191192 ext2 == Some ( RUST_CGU_EXT )
192193}
194+
195+ const RLINK_MAGIC : & ' static [ u8 ; 5 ] = b"rlink" ;
196+ const RUSTC_VERSION : Option < & str > = option_env ! ( "CFG_VERSION" ) ;
197+
198+ impl CodegenResults {
199+ pub fn serialize_rlink ( codegen_results : & CodegenResults ) -> Vec < u8 > {
200+ let mut encoder = opaque:: Encoder :: new ( vec ! [ ] ) ;
201+ encoder. emit_raw_bytes ( RLINK_MAGIC ) . unwrap ( ) ;
202+ encoder. emit_str ( RUSTC_VERSION . unwrap ( ) ) . unwrap ( ) ;
203+
204+ let mut encoder = rustc_serialize:: opaque:: Encoder :: new ( encoder. into_inner ( ) ) ;
205+ rustc_serialize:: Encodable :: encode ( codegen_results, & mut encoder) . unwrap ( ) ;
206+ encoder. into_inner ( )
207+ }
208+
209+ pub fn deserialize_rlink ( data : Vec < u8 > ) -> Result < Self , String > {
210+ if !data. starts_with ( RLINK_MAGIC ) {
211+ return Err ( "The input does not look like a .rlink file" . to_string ( ) ) ;
212+ }
213+ let mut decoder = opaque:: Decoder :: new ( & data[ RLINK_MAGIC . len ( ) ..] , 0 ) ;
214+ let rustc_version = decoder. read_str ( ) ;
215+ let current_version = RUSTC_VERSION . unwrap ( ) ;
216+ if rustc_version != current_version {
217+ return Err ( format ! ( ".rlink file was produced by rustc version {rustc_version}, but the current version is {current_version}." ) ) ;
218+ }
219+
220+ let codegen_results = CodegenResults :: decode ( & mut decoder) ;
221+ Ok ( codegen_results)
222+ }
223+ }
0 commit comments