}
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() {
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) {
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();
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)]
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);