Skip to content

Commit

Permalink
rustc_codegen_llvm: use safe references for RustArchiveMember.
Browse files Browse the repository at this point in the history
  • Loading branch information
irinagpopa committed Jul 30, 2018
1 parent c7669df commit b643e51
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 16 deletions.
20 changes: 10 additions & 10 deletions src/librustc_codegen_llvm/back/archive.rs
Expand Up @@ -226,10 +226,13 @@ impl<'a> ArchiveBuilder<'a> {
}

fn build_with_llvm(&mut self, kind: ArchiveKind) -> io::Result<()> {
let mut archives = Vec::new();
let removals = mem::replace(&mut self.removals, Vec::new());
let mut additions = mem::replace(&mut self.additions, Vec::new());
let mut strings = Vec::new();
let mut members = Vec::new();
let removals = mem::replace(&mut self.removals, Vec::new());

let dst = CString::new(self.config.dst.to_str().unwrap())?;
let should_update_symbols = self.should_update_symbols;

unsafe {
if let Some(archive) = self.src_archive() {
Expand All @@ -250,18 +253,18 @@ impl<'a> ArchiveBuilder<'a> {
strings.push(name);
}
}
for addition in mem::replace(&mut self.additions, Vec::new()) {
for addition in &mut additions {
match addition {
Addition::File { path, name_in_archive } => {
let path = CString::new(path.to_str().unwrap())?;
let name = CString::new(name_in_archive)?;
let name = CString::new(name_in_archive.clone())?;
members.push(llvm::LLVMRustArchiveMemberNew(path.as_ptr(),
name.as_ptr(),
None));
strings.push(path);
strings.push(name);
}
Addition::Archive { archive, mut skip } => {
Addition::Archive { archive, skip } => {
for child in archive.iter() {
let child = child.map_err(string_to_io_error)?;
if !is_relevant_child(&child) {
Expand All @@ -288,17 +291,14 @@ impl<'a> ArchiveBuilder<'a> {
members.push(m);
strings.push(name);
}
archives.push(archive);
}
}
}

let dst = self.config.dst.to_str().unwrap().as_bytes();
let dst = CString::new(dst)?;
let r = llvm::LLVMRustWriteArchive(dst.as_ptr(),
members.len() as libc::size_t,
members.as_ptr(),
self.should_update_symbols,
members.as_ptr() as *const &_,
should_update_symbols,
kind);
let ret = if r.into_result().is_err() {
let err = llvm::LLVMRustGetLastError();
Expand Down
12 changes: 6 additions & 6 deletions src/librustc_codegen_llvm/llvm/ffi.rs
Expand Up @@ -413,8 +413,8 @@ pub struct ArchiveChild<'a>(InvariantOpaque<'a>);
extern { pub type Twine; }
extern { pub type DiagnosticInfo; }
extern { pub type SMDiagnostic; }
extern { pub type RustArchiveMember; }
pub type RustArchiveMemberRef = *mut RustArchiveMember;
#[repr(C)]
pub struct RustArchiveMember<'a>(InvariantOpaque<'a>);
#[repr(C)]
pub struct OperandBundleDef<'a>(InvariantOpaque<'a>);
#[repr(C)]
Expand Down Expand Up @@ -1540,15 +1540,15 @@ extern "C" {
extern "C" {
pub fn LLVMRustWriteArchive(Dst: *const c_char,
NumMembers: size_t,
Members: *const RustArchiveMemberRef,
Members: *const &RustArchiveMember,
WriteSymbtab: bool,
Kind: ArchiveKind)
-> LLVMRustResult;
pub fn LLVMRustArchiveMemberNew(Filename: *const c_char,
Name: *const c_char,
Child: Option<&ArchiveChild>)
-> RustArchiveMemberRef;
pub fn LLVMRustArchiveMemberFree(Member: RustArchiveMemberRef);
Child: Option<&'a ArchiveChild>)
-> &'a mut RustArchiveMember<'a>;
pub fn LLVMRustArchiveMemberFree(Member: &'a mut RustArchiveMember<'a>);

pub fn LLVMRustSetDataLayoutFromTargetMachine(M: &'a Module, TM: &'a TargetMachine);

Expand Down

0 comments on commit b643e51

Please sign in to comment.