]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_codegen_llvm/allocator.rs
Rollup merge of #69893 - tmiasko:cstr, r=petrochenkov
[rust.git] / src / librustc_codegen_llvm / allocator.rs
index e1d56b9be7a27f998b0ec17fcba49f610404260a..4e7bc9fa0e2aed5fa11796834cbbb2b027cbfd42 100644 (file)
@@ -1,13 +1,11 @@
-use std::ffi::CString;
-
 use crate::attributes;
 use libc::c_uint;
-use rustc::ty::TyCtxt;
-use syntax::expand::allocator::{AllocatorKind, AllocatorTy, ALLOCATOR_METHODS};
 use rustc::bug;
+use rustc::ty::TyCtxt;
+use rustc_ast::expand::allocator::{AllocatorKind, AllocatorTy, ALLOCATOR_METHODS};
 
-use crate::ModuleLlvm;
 use crate::llvm::{self, False, True};
+use crate::ModuleLlvm;
 
 pub(crate) unsafe fn codegen(tcx: TyCtxt<'_>, mods: &mut ModuleLlvm, kind: AllocatorKind) {
     let llcx = &*mods.llcx;
@@ -33,26 +31,25 @@ pub(crate) unsafe fn codegen(tcx: TyCtxt<'_>, mods: &mut ModuleLlvm, kind: Alloc
                 AllocatorTy::Ptr => args.push(i8p),
                 AllocatorTy::Usize => args.push(usize),
 
-                AllocatorTy::ResultPtr |
-                AllocatorTy::Unit => panic!("invalid allocator arg"),
+                AllocatorTy::ResultPtr | AllocatorTy::Unit => panic!("invalid allocator arg"),
             }
         }
         let output = match method.output {
             AllocatorTy::ResultPtr => Some(i8p),
             AllocatorTy::Unit => None,
 
-            AllocatorTy::Layout |
-            AllocatorTy::Usize |
-            AllocatorTy::Ptr => panic!("invalid allocator output"),
+            AllocatorTy::Layout | AllocatorTy::Usize | AllocatorTy::Ptr => {
+                panic!("invalid allocator output")
+            }
         };
-        let ty = llvm::LLVMFunctionType(output.unwrap_or(void),
-                                        args.as_ptr(),
-                                        args.len() as c_uint,
-                                        False);
-        let name = CString::new(format!("__rust_{}", method.name)).unwrap();
-        let llfn = llvm::LLVMRustGetOrInsertFunction(llmod,
-                                                     name.as_ptr(),
-                                                     ty);
+        let ty = llvm::LLVMFunctionType(
+            output.unwrap_or(void),
+            args.as_ptr(),
+            args.len() as c_uint,
+            False,
+        );
+        let name = format!("__rust_{}", method.name);
+        let llfn = llvm::LLVMRustGetOrInsertFunction(llmod, name.as_ptr().cast(), name.len(), ty);
 
         if tcx.sess.target.target.options.default_hidden_visibility {
             llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
@@ -61,27 +58,22 @@ pub(crate) unsafe fn codegen(tcx: TyCtxt<'_>, mods: &mut ModuleLlvm, kind: Alloc
             attributes::emit_uwtable(llfn, true);
         }
 
-        let callee = CString::new(kind.fn_name(method.name)).unwrap();
-        let callee = llvm::LLVMRustGetOrInsertFunction(llmod,
-                                                       callee.as_ptr(),
-                                                       ty);
+        let callee = kind.fn_name(method.name);
+        let callee =
+            llvm::LLVMRustGetOrInsertFunction(llmod, callee.as_ptr().cast(), callee.len(), ty);
         llvm::LLVMRustSetVisibility(callee, llvm::Visibility::Hidden);
 
-        let llbb = llvm::LLVMAppendBasicBlockInContext(llcx,
-                                                       llfn,
-                                                       "entry\0".as_ptr().cast());
+        let llbb = llvm::LLVMAppendBasicBlockInContext(llcx, llfn, "entry\0".as_ptr().cast());
 
         let llbuilder = llvm::LLVMCreateBuilderInContext(llcx);
         llvm::LLVMPositionBuilderAtEnd(llbuilder, llbb);
-        let args = args.iter().enumerate().map(|(i, _)| {
-            llvm::LLVMGetParam(llfn, i as c_uint)
-        }).collect::<Vec<_>>();
-        let ret = llvm::LLVMRustBuildCall(llbuilder,
-                                          callee,
-                                          args.as_ptr(),
-                                          args.len() as c_uint,
-                                          None,
-                                          "\0".as_ptr().cast());
+        let args = args
+            .iter()
+            .enumerate()
+            .map(|(i, _)| llvm::LLVMGetParam(llfn, i as c_uint))
+            .collect::<Vec<_>>();
+        let ret =
+            llvm::LLVMRustBuildCall(llbuilder, callee, args.as_ptr(), args.len() as c_uint, None);
         llvm::LLVMSetTailCall(ret, True);
         if output.is_some() {
             llvm::LLVMBuildRet(llbuilder, ret);