From 894467e5b4fd7c355f24c680a612ba810d1b4e8d Mon Sep 17 00:00:00 2001 From: Irina Popa Date: Tue, 17 Jul 2018 14:26:22 +0300 Subject: [PATCH] rustc_codegen_llvm: use safe references for Linker. --- src/librustc_codegen_llvm/back/lto.rs | 10 +++++----- src/librustc_codegen_llvm/llvm/ffi.rs | 9 ++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/librustc_codegen_llvm/back/lto.rs b/src/librustc_codegen_llvm/back/lto.rs index 0a8b143ae923..d5d21eb91ecb 100644 --- a/src/librustc_codegen_llvm/back/lto.rs +++ b/src/librustc_codegen_llvm/back/lto.rs @@ -294,10 +294,10 @@ fn fat_lto(cgcx: &CodegenContext, }]) } -struct Linker(llvm::LinkerRef); +struct Linker<'a>(&'a mut llvm::Linker<'a>); -impl Linker { - fn new(llmod: &llvm::Module) -> Linker { +impl Linker<'a> { + fn new(llmod: &'a llvm::Module) -> Self { unsafe { Linker(llvm::LLVMRustLinkerNew(llmod)) } } @@ -314,9 +314,9 @@ impl Linker { } } -impl Drop for Linker { +impl Drop for Linker<'a> { fn drop(&mut self) { - unsafe { llvm::LLVMRustLinkerFree(self.0); } + unsafe { llvm::LLVMRustLinkerFree(&mut *(self.0 as *mut _)); } } } diff --git a/src/librustc_codegen_llvm/llvm/ffi.rs b/src/librustc_codegen_llvm/llvm/ffi.rs index 4b1e8e062613..ddd7809abc73 100644 --- a/src/librustc_codegen_llvm/llvm/ffi.rs +++ b/src/librustc_codegen_llvm/llvm/ffi.rs @@ -414,8 +414,7 @@ extern { pub type SMDiagnostic; } extern { pub type RustArchiveMember; } pub type RustArchiveMemberRef = *mut RustArchiveMember; pub struct OperandBundleDef<'a>(InvariantOpaque<'a>); -extern { pub type Linker; } -pub type LinkerRef = *mut Linker; +pub struct Linker<'a>(InvariantOpaque<'a>); pub type DiagnosticHandler = unsafe extern "C" fn(&DiagnosticInfo, *mut c_void); pub type InlineAsmDiagHandler = unsafe extern "C" fn(&SMDiagnostic, *const c_void, c_uint); @@ -1580,9 +1579,9 @@ extern "C" { CU2: &mut *mut c_void); pub fn LLVMRustThinLTOPatchDICompileUnit(M: &Module, CU: *mut c_void); - pub fn LLVMRustLinkerNew(M: &Module) -> LinkerRef; - pub fn LLVMRustLinkerAdd(linker: LinkerRef, + pub fn LLVMRustLinkerNew(M: &'a Module) -> &'a mut Linker<'a>; + pub fn LLVMRustLinkerAdd(linker: &Linker, bytecode: *const c_char, bytecode_len: usize) -> bool; - pub fn LLVMRustLinkerFree(linker: LinkerRef); + pub fn LLVMRustLinkerFree(linker: &'a mut Linker<'a>); }