about summary refs log tree commit diff
path: root/src/librustc_codegen_llvm
diff options
context:
space:
mode:
authorEduard-Mihai Burtescu <edy.burt@gmail.com>2018-11-16 13:33:28 +0200
committerEduard-Mihai Burtescu <edy.burt@gmail.com>2018-11-16 15:08:18 +0200
commit9bb66634314323e92eb1f33fed0a059f46b0aa4c (patch)
tree5f0cec324530e38af8f8925c2a50418cfc6668c7 /src/librustc_codegen_llvm
parentbf7f8cd3fc2164b8669a13aad6197f1c8c42da51 (diff)
downloadrust-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.rs4
-rw-r--r--src/librustc_codegen_llvm/base.rs4
-rw-r--r--src/librustc_codegen_llvm/builder.rs19
-rw-r--r--src/librustc_codegen_llvm/consts.rs10
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);
     }
 }