Use callback-based interface to load ThinLTO import data into rustc.

This commit is contained in:
Michael Woerister 2018-07-13 12:41:22 +02:00
parent dd3f445ed2
commit e045a6cd8c
4 changed files with 56 additions and 94 deletions

View file

@ -805,7 +805,7 @@ pub struct ThinLTOImports {
impl ThinLTOImports {
pub fn new_empty() -> ThinLTOImports {
pub fn new() -> ThinLTOImports {
ThinLTOImports {
imports: FxHashMap(),
}
@ -813,58 +813,46 @@ impl ThinLTOImports {
/// Load the ThinLTO import map from ThinLTOData.
unsafe fn from_thin_lto_data(data: *const llvm::ThinLTOData) -> ThinLTOImports {
let raw_data: *const llvm::ThinLTOModuleImports =
llvm::LLVMRustGetThinLTOModuleImports(data);
assert!(!raw_data.is_null());
let mut imports = FxHashMap();
let mut module_ptr = raw_data;
let mut module_index = 0;
loop {
let mut entry_ptr: *const llvm::ThinLTOModuleName = *module_ptr;
if entry_ptr.is_null() {
break;
}
let importing_module_name = CStr::from_ptr(*entry_ptr)
.to_str()
.expect("Non-utf8 LLVM module name encountered")
.to_owned();
entry_ptr = entry_ptr.offset(1);
let mut imported_modules = vec![];
loop {
let imported_module_name = *entry_ptr;
if imported_module_name.is_null() {
break
fn module_name_to_str(c_str: &CStr) -> &str {
match c_str.to_str() {
Ok(s) => s,
Err(e) => {
bug!("Encountered non-utf8 LLVM module name `{}`: {}",
c_str.to_string_lossy(),
e)
}
}
}
let imported_module_name = CStr::from_ptr(imported_module_name)
.to_str()
.expect("Non-utf8 LLVM module name encountered")
.to_owned();
unsafe extern "C" fn imported_module_callback(payload: *mut libc::c_void,
importing_module_name: *const libc::c_char,
imported_module_name: *const libc::c_char) {
let map = &mut* (payload as *mut ThinLTOImports);
imported_modules.push(imported_module_name);
entry_ptr = entry_ptr.offset(1);
let importing_module_name = CStr::from_ptr(importing_module_name);
let importing_module_name = module_name_to_str(&importing_module_name);
let imported_module_name = CStr::from_ptr(imported_module_name);
let imported_module_name = module_name_to_str(&imported_module_name);
if !map.imports.contains_key(importing_module_name) {
map.imports.insert(importing_module_name.to_owned(), vec![]);
}
imports.insert(importing_module_name, imported_modules);
module_ptr = module_ptr.offset(1);
module_index += 1;
map.imports
.get_mut(importing_module_name)
.unwrap()
.push(imported_module_name.to_owned());
}
assert_eq!(module_index, imports.len());
let mut map = ThinLTOImports {
imports: FxHashMap(),
};
ThinLTOImports {
imports
}
llvm::LLVMRustGetThinLTOModuleImports(data,
imported_module_callback,
&mut map as *mut _ as *mut libc::c_void);
map
}
pub fn save_to_file(&self, path: &Path) -> io::Result<()> {

View file

@ -1360,7 +1360,7 @@ fn load_thin_lto_imports(sess: &Session) -> lto::ThinLTOImports {
);
if !path.exists() {
return lto::ThinLTOImports::new_empty();
return lto::ThinLTOImports::new();
}
match lto::ThinLTOImports::load_from_file(&path) {