]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_codegen_llvm/context.rs
Generalized base.rs#call_memcpy and everything that it uses
[rust.git] / src / librustc_codegen_llvm / context.rs
index 4c405150532bd221b9b9475ee7dd2b6d48f9327d..ed9a9e3209ba2ea5927ceaef5b88875323f964b1 100644 (file)
@@ -18,7 +18,7 @@
 use base;
 use declare;
 use monomorphize::Instance;
-use value::Value;
+use value::{Value, ValueTrait};
 
 use monomorphize::partitioning::CodegenUnit;
 use type_::Type;
@@ -283,7 +283,7 @@ impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
             None
         };
 
-        let isize_ty = Type::ix_llcx(llcx, tcx.data_layout.pointer_size.bits());
+        let isize_ty = Type::ix_llcx::<Value>(llcx, tcx.data_layout.pointer_size.bits());
 
         CodegenCx {
             tcx,
@@ -315,7 +315,7 @@ impl<'a, 'tcx> CodegenCx<'a, 'tcx> {
     }
 }
 
-impl<'b, 'tcx> CodegenCx<'b, 'tcx> {
+impl<'b, 'tcx, Value : ?Sized> CodegenCx<'b, 'tcx, &'b Value> where Value : ValueTrait {
     pub fn sess<'a>(&'a self) -> &'a Session {
         &self.tcx.sess
     }
@@ -327,7 +327,9 @@ pub fn get_intrinsic(&self, key: &str) -> &'b Value {
 
         declare_intrinsic(self, key).unwrap_or_else(|| bug!("unknown intrinsic '{}'", key))
     }
+}
 
+impl<'b, 'tcx> CodegenCx<'b, 'tcx, &'b Value> {
     /// Generate a new symbol name with the given prefix. This symbol name must
     /// only be used for definitions with `internal` or `private` linkage.
     pub fn generate_local_symbol_name(&self, prefix: &str) -> String {
@@ -377,7 +379,7 @@ pub fn eh_personality(&self) -> &'b Value {
                 } else {
                     "rust_eh_personality"
                 };
-                let fty = Type::variadic_func(&[], Type::i32(self));
+                let fty = Type::variadic_func::<Value>(&[], Type::i32(self));
                 declare::declare_cfn(self, name, fty)
             }
         };
@@ -478,28 +480,31 @@ fn layout_of(&self, ty: Ty<'tcx>) -> Self::TyLayout {
 }
 
 /// Declare any llvm intrinsics that you might need
-fn declare_intrinsic(cx: &CodegenCx<'ll, '_>, key: &str) -> Option<&'ll Value> {
+fn declare_intrinsic<Value : ?Sized>(
+    cx: &CodegenCx<'ll, '_, &'ll Value>,
+    key: &str
+) -> Option<&'ll Value> where Value : ValueTrait {
     macro_rules! ifn {
         ($name:expr, fn() -> $ret:expr) => (
             if key == $name {
-                let f = declare::declare_cfn(cx, $name, Type::func(&[], $ret));
-                llvm::SetUnnamedAddr(f, false);
+                let f = declare::declare_cfn(cx, $name, Type::func::<Value>(&[], $ret));
+                llvm::SetUnnamedAddr(f.to_llvm(), false);
                 cx.intrinsics.borrow_mut().insert($name, f.clone());
                 return Some(f);
             }
         );
         ($name:expr, fn(...) -> $ret:expr) => (
             if key == $name {
-                let f = declare::declare_cfn(cx, $name, Type::variadic_func(&[], $ret));
-                llvm::SetUnnamedAddr(f, false);
+                let f = declare::declare_cfn(cx, $name, Type::variadic_func::<Value>(&[], $ret));
+                llvm::SetUnnamedAddr(f.to_llvm(), false);
                 cx.intrinsics.borrow_mut().insert($name, f.clone());
                 return Some(f);
             }
         );
         ($name:expr, fn($($arg:expr),*) -> $ret:expr) => (
             if key == $name {
-                let f = declare::declare_cfn(cx, $name, Type::func(&[$($arg),*], $ret));
-                llvm::SetUnnamedAddr(f, false);
+                let f = declare::declare_cfn(cx, $name, Type::func::<Value>(&[$($arg),*], $ret));
+                llvm::SetUnnamedAddr(f.to_llvm(), false);
                 cx.intrinsics.borrow_mut().insert($name, f.clone());
                 return Some(f);
             }
@@ -520,14 +525,14 @@ macro_rules! mk_struct {
     let t_f32 = Type::f32(cx);
     let t_f64 = Type::f64(cx);
 
-    let t_v2f32 = Type::vector(t_f32, 2);
-    let t_v4f32 = Type::vector(t_f32, 4);
-    let t_v8f32 = Type::vector(t_f32, 8);
-    let t_v16f32 = Type::vector(t_f32, 16);
+    let t_v2f32 = Type::vector::<Value>(t_f32, 2);
+    let t_v4f32 = Type::vector::<Value>(t_f32, 4);
+    let t_v8f32 = Type::vector::<Value>(t_f32, 8);
+    let t_v16f32 = Type::vector::<Value>(t_f32, 16);
 
-    let t_v2f64 = Type::vector(t_f64, 2);
-    let t_v4f64 = Type::vector(t_f64, 4);
-    let t_v8f64 = Type::vector(t_f64, 8);
+    let t_v2f64 = Type::vector::<Value>(t_f64, 2);
+    let t_v4f64 = Type::vector::<Value>(t_f64, 4);
+    let t_v8f64 = Type::vector::<Value>(t_f64, 8);
 
     ifn!("llvm.memset.p0i8.i16", fn(i8p, t_i8, t_i16, t_i32, i1) -> void);
     ifn!("llvm.memset.p0i8.i32", fn(i8p, t_i8, t_i32, t_i32, i1) -> void);