diff options
| author | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2018-11-16 13:33:28 +0200 |
|---|---|---|
| committer | Eduard-Mihai Burtescu <edy.burt@gmail.com> | 2018-11-16 15:08:18 +0200 |
| commit | 9bb66634314323e92eb1f33fed0a059f46b0aa4c (patch) | |
| tree | 5f0cec324530e38af8f8925c2a50418cfc6668c7 /src/librustc_codegen_llvm | |
| parent | bf7f8cd3fc2164b8669a13aad6197f1c8c42da51 (diff) | |
| download | rust-9bb66634314323e92eb1f33fed0a059f46b0aa4c.tar.gz rust-9bb66634314323e92eb1f33fed0a059f46b0aa4c.zip | |
[eddyb] rustc_codegen_ssa: handle LLVM unsafety correctly.
Diffstat (limited to 'src/librustc_codegen_llvm')
| -rw-r--r-- | src/librustc_codegen_llvm/asm.rs | 4 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/base.rs | 4 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/builder.rs | 19 | ||||
| -rw-r--r-- | src/librustc_codegen_llvm/consts.rs | 10 |
4 files changed, 21 insertions, 16 deletions
diff --git a/src/librustc_codegen_llvm/asm.rs b/src/librustc_codegen_llvm/asm.rs index 8bb88ba5a83..7f0e18e1aeb 100644 --- a/src/librustc_codegen_llvm/asm.rs +++ b/src/librustc_codegen_llvm/asm.rs @@ -84,8 +84,8 @@ impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> { let asm = CString::new(ia.asm.as_str().as_bytes()).unwrap(); let constraint_cstr = CString::new(all_constraints).unwrap(); let r = self.inline_asm_call( - asm.as_ptr(), - constraint_cstr.as_ptr(), + &asm, + &constraint_cstr, &inputs, output_type, ia.volatile, diff --git a/src/librustc_codegen_llvm/base.rs b/src/librustc_codegen_llvm/base.rs index 529639bf033..102fc95529d 100644 --- a/src/librustc_codegen_llvm/base.rs +++ b/src/librustc_codegen_llvm/base.rs @@ -194,7 +194,9 @@ pub fn compile_codegen_unit<'ll, 'tcx>(tcx: TyCtxt<'ll, 'tcx, 'tcx>, // Run replace-all-uses-with for statics that need it for &(old_g, new_g) in cx.statics_to_rauw().borrow().iter() { - cx.static_replace_all_uses(old_g, new_g) + unsafe { + cx.static_replace_all_uses(old_g, new_g) + } } // Create the llvm.used variable diff --git a/src/librustc_codegen_llvm/builder.rs b/src/librustc_codegen_llvm/builder.rs index c10e98c5546..b8df95e3183 100644 --- a/src/librustc_codegen_llvm/builder.rs +++ b/src/librustc_codegen_llvm/builder.rs @@ -28,6 +28,7 @@ use rustc_codegen_ssa::base::to_immediate; use rustc_codegen_ssa::mir::operand::{OperandValue, OperandRef}; use rustc_codegen_ssa::mir::place::PlaceRef; use std::borrow::Cow; +use std::ffi::CStr; use std::ops::Range; use std::ptr; @@ -838,7 +839,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> { } } - fn inline_asm_call(&mut self, asm: *const c_char, cons: *const c_char, + fn inline_asm_call(&mut self, asm: &CStr, cons: &CStr, inputs: &[&'ll Value], output: &'ll Type, volatile: bool, alignstack: bool, dia: syntax::ast::AsmDialect) -> Option<&'ll Value> { @@ -858,11 +859,17 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> { let fty = self.cx().type_func(&argtys[..], output); unsafe { // Ask LLVM to verify that the constraints are well-formed. - let constraints_ok = llvm::LLVMRustInlineAsmVerify(fty, cons); + let constraints_ok = llvm::LLVMRustInlineAsmVerify(fty, cons.as_ptr()); debug!("Constraint verification result: {:?}", constraints_ok); if constraints_ok { let v = llvm::LLVMRustInlineAsm( - fty, asm, cons, volatile, alignstack, AsmDialect::from_generic(dia)); + fty, + asm.as_ptr(), + cons.as_ptr(), + volatile, + alignstack, + AsmDialect::from_generic(dia), + ); Some(self.call(v, inputs, None)) } else { // LLVM has detected an issue with our constraints, bail out @@ -1400,10 +1407,8 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> { self.cx } - fn delete_basic_block(&mut self, bb: &'ll BasicBlock) { - unsafe { - llvm::LLVMDeleteBasicBlock(bb); - } + unsafe fn delete_basic_block(&mut self, bb: &'ll BasicBlock) { + llvm::LLVMDeleteBasicBlock(bb); } fn do_not_inline(&mut self, llret: &'ll Value) { diff --git a/src/librustc_codegen_llvm/consts.rs b/src/librustc_codegen_llvm/consts.rs index f8876207b2e..5e45a4f68ae 100644 --- a/src/librustc_codegen_llvm/consts.rs +++ b/src/librustc_codegen_llvm/consts.rs @@ -498,11 +498,9 @@ impl StaticMethods<'tcx> for CodegenCx<'ll, 'tcx> { } } } - fn static_replace_all_uses(&self, old_g: &'ll Value, new_g: &'ll Value) { - unsafe { - let bitcast = llvm::LLVMConstPointerCast(new_g, self.val_ty(old_g)); - llvm::LLVMReplaceAllUsesWith(old_g, bitcast); - llvm::LLVMDeleteGlobal(old_g); - } + unsafe fn static_replace_all_uses(&self, old_g: &'ll Value, new_g: &'ll Value) { + let bitcast = llvm::LLVMConstPointerCast(new_g, self.val_ty(old_g)); + llvm::LLVMReplaceAllUsesWith(old_g, bitcast); + llvm::LLVMDeleteGlobal(old_g); } } |
