use std::ffi::CString; use std::sync::Arc; use rustc_data_structures::memmap::Mmap; use crate::traits::*; pub struct ThinModule { pub shared: Arc>, pub idx: usize, } impl ThinModule { pub fn name(&self) -> &str { self.shared.module_names[self.idx].to_str().unwrap() } pub fn cost(&self) -> u64 { // Yes, that's correct, we're using the size of the bytecode as an // indicator for how costly this codegen unit is. self.data().len() as u64 } pub fn data(&self) -> &[u8] { let a = self.shared.thin_buffers.get(self.idx).map(|b| b.data()); a.unwrap_or_else(|| { let len = self.shared.thin_buffers.len(); self.shared.serialized_modules[self.idx - len].data() }) } } pub struct ThinShared { pub data: B::ThinData, pub thin_buffers: Vec, pub serialized_modules: Vec>, pub module_names: Vec, } pub enum SerializedModule { Local(M), FromRlib(Vec), FromUncompressedFile(Mmap), } impl SerializedModule { pub fn data(&self) -> &[u8] { match *self { SerializedModule::Local(ref m) => m.data(), SerializedModule::FromRlib(ref m) => m, SerializedModule::FromUncompressedFile(ref m) => m, } } }