From e551ed90331e236dc8fa6dadeeaa49dcdcb0c2ef Mon Sep 17 00:00:00 2001 From: Irina Popa Date: Tue, 17 Jul 2018 14:31:06 +0300 Subject: [PATCH] rustc_codegen_llvm: use safe references for ArchiveIterator. --- src/librustc_codegen_llvm/llvm/archive_ro.rs | 6 ++---- src/librustc_codegen_llvm/llvm/ffi.rs | 9 ++++----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/librustc_codegen_llvm/llvm/archive_ro.rs b/src/librustc_codegen_llvm/llvm/archive_ro.rs index 98a08f8501a..1d215910d95 100644 --- a/src/librustc_codegen_llvm/llvm/archive_ro.rs +++ b/src/librustc_codegen_llvm/llvm/archive_ro.rs @@ -23,8 +23,7 @@ pub struct ArchiveRO { unsafe impl Send for ArchiveRO {} pub struct Iter<'a> { - ptr: super::ArchiveIteratorRef, - _data: marker::PhantomData<&'a ArchiveRO>, + ptr: &'a mut super::ArchiveIterator<'a>, } pub struct Child<'a> { @@ -68,7 +67,6 @@ impl ArchiveRO { unsafe { Iter { ptr: super::LLVMRustArchiveIteratorNew(self.raw), - _data: marker::PhantomData, } } } @@ -101,7 +99,7 @@ impl<'a> Iterator for Iter<'a> { impl<'a> Drop for Iter<'a> { fn drop(&mut self) { unsafe { - super::LLVMRustArchiveIteratorFree(self.ptr); + super::LLVMRustArchiveIteratorFree(&mut *(self.ptr as *mut _)); } } } diff --git a/src/librustc_codegen_llvm/llvm/ffi.rs b/src/librustc_codegen_llvm/llvm/ffi.rs index ddd7809abc7..2dda2dd00d2 100644 --- a/src/librustc_codegen_llvm/llvm/ffi.rs +++ b/src/librustc_codegen_llvm/llvm/ffi.rs @@ -404,8 +404,7 @@ pub struct SectionIterator<'a>(InvariantOpaque<'a>); extern { pub type Pass; } extern { pub type TargetMachine; } extern { pub type Archive; } -extern { pub type ArchiveIterator; } -pub type ArchiveIteratorRef = *mut ArchiveIterator; +pub struct ArchiveIterator<'a>(InvariantOpaque<'a>); extern { pub type ArchiveChild; } pub type ArchiveChildRef = *mut ArchiveChild; extern { pub type Twine; } @@ -1471,12 +1470,12 @@ extern "C" { pub fn LLVMRustMarkAllFunctionsNounwind(M: &Module); pub fn LLVMRustOpenArchive(path: *const c_char) -> Option<&'static mut Archive>; - pub fn LLVMRustArchiveIteratorNew(AR: &Archive) -> ArchiveIteratorRef; - pub fn LLVMRustArchiveIteratorNext(AIR: ArchiveIteratorRef) -> ArchiveChildRef; + pub fn LLVMRustArchiveIteratorNew(AR: &'a Archive) -> &'a mut ArchiveIterator<'a>; + pub fn LLVMRustArchiveIteratorNext(AIR: &ArchiveIterator) -> ArchiveChildRef; pub fn LLVMRustArchiveChildName(ACR: ArchiveChildRef, size: &mut size_t) -> *const c_char; pub fn LLVMRustArchiveChildData(ACR: ArchiveChildRef, size: &mut size_t) -> *const c_char; pub fn LLVMRustArchiveChildFree(ACR: ArchiveChildRef); - pub fn LLVMRustArchiveIteratorFree(AIR: ArchiveIteratorRef); + pub fn LLVMRustArchiveIteratorFree(AIR: &'a mut ArchiveIterator<'a>); pub fn LLVMRustDestroyArchive(AR: &'static mut Archive); pub fn LLVMRustGetSectionName(SI: &SectionIterator, data: &mut *const c_char) -> size_t;