1
Fork 0

rustc_codegen_llvm: use safe references for RustArchiveMember.

This commit is contained in:
Irina Popa 2018-07-17 16:00:10 +03:00
parent c7669dff2a
commit b643e5144e
2 changed files with 16 additions and 16 deletions

View file

@ -226,10 +226,13 @@ impl<'a> ArchiveBuilder<'a> {
} }
fn build_with_llvm(&mut self, kind: ArchiveKind) -> io::Result<()> { 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 strings = Vec::new();
let mut members = 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 { unsafe {
if let Some(archive) = self.src_archive() { if let Some(archive) = self.src_archive() {
@ -250,18 +253,18 @@ impl<'a> ArchiveBuilder<'a> {
strings.push(name); strings.push(name);
} }
} }
for addition in mem::replace(&mut self.additions, Vec::new()) { for addition in &mut additions {
match addition { match addition {
Addition::File { path, name_in_archive } => { Addition::File { path, name_in_archive } => {
let path = CString::new(path.to_str().unwrap())?; 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(), members.push(llvm::LLVMRustArchiveMemberNew(path.as_ptr(),
name.as_ptr(), name.as_ptr(),
None)); None));
strings.push(path); strings.push(path);
strings.push(name); strings.push(name);
} }
Addition::Archive { archive, mut skip } => { Addition::Archive { archive, skip } => {
for child in archive.iter() { for child in archive.iter() {
let child = child.map_err(string_to_io_error)?; let child = child.map_err(string_to_io_error)?;
if !is_relevant_child(&child) { if !is_relevant_child(&child) {
@ -288,17 +291,14 @@ impl<'a> ArchiveBuilder<'a> {
members.push(m); members.push(m);
strings.push(name); 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(), let r = llvm::LLVMRustWriteArchive(dst.as_ptr(),
members.len() as libc::size_t, members.len() as libc::size_t,
members.as_ptr(), members.as_ptr() as *const &_,
self.should_update_symbols, should_update_symbols,
kind); kind);
let ret = if r.into_result().is_err() { let ret = if r.into_result().is_err() {
let err = llvm::LLVMRustGetLastError(); let err = llvm::LLVMRustGetLastError();

View file

@ -413,8 +413,8 @@ pub struct ArchiveChild<'a>(InvariantOpaque<'a>);
extern { pub type Twine; } extern { pub type Twine; }
extern { pub type DiagnosticInfo; } extern { pub type DiagnosticInfo; }
extern { pub type SMDiagnostic; } extern { pub type SMDiagnostic; }
extern { pub type RustArchiveMember; } #[repr(C)]
pub type RustArchiveMemberRef = *mut RustArchiveMember; pub struct RustArchiveMember<'a>(InvariantOpaque<'a>);
#[repr(C)] #[repr(C)]
pub struct OperandBundleDef<'a>(InvariantOpaque<'a>); pub struct OperandBundleDef<'a>(InvariantOpaque<'a>);
#[repr(C)] #[repr(C)]
@ -1540,15 +1540,15 @@ extern "C" {
extern "C" { extern "C" {
pub fn LLVMRustWriteArchive(Dst: *const c_char, pub fn LLVMRustWriteArchive(Dst: *const c_char,
NumMembers: size_t, NumMembers: size_t,
Members: *const RustArchiveMemberRef, Members: *const &RustArchiveMember,
WriteSymbtab: bool, WriteSymbtab: bool,
Kind: ArchiveKind) Kind: ArchiveKind)
-> LLVMRustResult; -> LLVMRustResult;
pub fn LLVMRustArchiveMemberNew(Filename: *const c_char, pub fn LLVMRustArchiveMemberNew(Filename: *const c_char,
Name: *const c_char, Name: *const c_char,
Child: Option<&ArchiveChild>) Child: Option<&'a ArchiveChild>)
-> RustArchiveMemberRef; -> &'a mut RustArchiveMember<'a>;
pub fn LLVMRustArchiveMemberFree(Member: RustArchiveMemberRef); pub fn LLVMRustArchiveMemberFree(Member: &'a mut RustArchiveMember<'a>);
pub fn LLVMRustSetDataLayoutFromTargetMachine(M: &'a Module, TM: &'a TargetMachine); pub fn LLVMRustSetDataLayoutFromTargetMachine(M: &'a Module, TM: &'a TargetMachine);