1 use rustc::middle::cstore::MetadataLoader;
2 use rustc_data_structures::owning_ref::{self, OwningRef};
6 pub struct CraneliftMetadataLoader;
8 impl MetadataLoader for CraneliftMetadataLoader {
11 _target: &::rustc_target::spec::Target,
13 ) -> Result<owning_ref::ErasedBoxRef<[u8]>, String> {
14 let mut archive = ar::Archive::new(File::open(path).map_err(|e| format!("{:?}", e))?);
15 // Iterate over all entries in the archive:
16 while let Some(entry_result) = archive.next_entry() {
17 let mut entry = entry_result.map_err(|e| format!("{:?}", e))?;
21 .starts_with(b".rustc.clif_metadata")
23 let mut buf = Vec::new();
24 ::std::io::copy(&mut entry, &mut buf).map_err(|e| format!("{:?}", e))?;
25 let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf).into();
26 return Ok(rustc_erase_owner!(buf.map_owner_box()));
30 Err("couldn't find metadata entry".to_string())
31 //self.get_dylib_metadata(target, path)
34 fn get_dylib_metadata(
36 _target: &::rustc_target::spec::Target,
38 ) -> Result<owning_ref::ErasedBoxRef<[u8]>, String> {
41 //let buffer = ::std::fs::read(path).map_err(|e|format!("{:?}", e))?;
42 /*match Object::parse(&buffer).map_err(|e|format!("{:?}", e))? {
44 println!("elf: {:#?}", &elf);
47 println!("pe: {:#?}", &pe);
49 Object::Mach(mach) => {
50 println!("mach: {:#?}", &mach);
52 Object::Archive(archive) => {
53 return Err(format!("archive: {:#?}", &archive));
55 Object::Unknown(magic) => {
56 return Err(format!("unknown magic: {:#x}", magic))
59 Err("dylib metadata loading is not yet supported".to_string())