about summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrina Popa <irinagpopa@gmail.com>2018-07-17 14:31:06 +0300
committerIrina Popa <irinagpopa@gmail.com>2018-07-30 20:10:42 +0300
commite551ed90331e236dc8fa6dadeeaa49dcdcb0c2ef (patch)
tree5d67b50a15373f64caee833077fc3f0e445de9ae
parent894467e5b4fd7c355f24c680a612ba810d1b4e8d (diff)
downloadrust-e551ed90331e236dc8fa6dadeeaa49dcdcb0c2ef.tar.gz
rust-e551ed90331e236dc8fa6dadeeaa49dcdcb0c2ef.zip
rustc_codegen_llvm: use safe references for ArchiveIterator.
-rw-r--r--src/librustc_codegen_llvm/llvm/archive_ro.rs6
-rw-r--r--src/librustc_codegen_llvm/llvm/ffi.rs9
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;