]> git.lizzy.rs Git - rust.git/commitdiff
rustc_codegen_llvm: use safe references for RustArchiveMember.
authorIrina Popa <irinagpopa@gmail.com>
Tue, 17 Jul 2018 13:00:10 +0000 (16:00 +0300)
committerIrina Popa <irinagpopa@gmail.com>
Mon, 30 Jul 2018 17:10:44 +0000 (20:10 +0300)
src/librustc_codegen_llvm/back/archive.rs
src/librustc_codegen_llvm/llvm/ffi.rs

index d290753a5bc29580527f78060b15742c6ae1691d..af9efc6d7c4173f905254795be1d431a9255258e 100644 (file)
@@ -226,10 +226,13 @@ fn llvm_archive_kind(&self) -> Result<ArchiveKind, &str> {
     }
 
     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() {
@@ -250,18 +253,18 @@ fn build_with_llvm(&mut self, kind: ArchiveKind) -> io::Result<()> {
                     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) {
@@ -288,17 +291,14 @@ fn build_with_llvm(&mut self, kind: ArchiveKind) -> io::Result<()> {
                             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();
index c139868544df78952f571dbb009f1cfa351f14f1..cbf1c556c6cc325e1fcbfc8fe8df6c5c027df444 100644 (file)
@@ -413,8 +413,8 @@ struct InvariantOpaque<'a> {
 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)]
@@ -1540,15 +1540,15 @@ pub fn LLVMRustSetInlineAsmDiagnosticHandler(C: &Context,
 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);