rustc_codegen_llvm: use safe references for RustArchiveMember.
This commit is contained in:
parent
c7669dff2a
commit
b643e5144e
2 changed files with 16 additions and 16 deletions
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue