gallivm: Add a lp_build_const_func_pointer() helper.
authorJosé Fonseca <jfonseca@vmware.com>
Thu, 23 Feb 2012 09:21:26 +0000 (09:21 +0000)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 2 May 2012 09:24:34 +0000 (10:24 +0100)
To be reused in all places where we want to call C code.

src/gallium/auxiliary/gallivm/lp_bld_const.c
src/gallium/auxiliary/gallivm/lp_bld_const.h
src/gallium/auxiliary/gallivm/lp_bld_format_aos.c

index 9e9dc442733c8307a0a8958e42046d325032897f..f0611b158d92b837b0b98fd2d79aa653530591e4 100644 (file)
@@ -446,3 +446,32 @@ lp_build_const_string(struct gallivm_state *gallivm,
    string = LLVMConstBitCast(string, LLVMPointerType(i8, 0));
    return string;
 }
+
+
+/**
+ * Build a callable function pointer.
+ *
+ * We this casts instead of LLVMAddGlobalMapping()
+ * to work around a bug in LLVM 2.6, and for efficiency/simplicity.
+ */
+LLVMValueRef
+lp_build_const_func_pointer(struct gallivm_state *gallivm,
+                            const void *ptr,
+                            LLVMTypeRef ret_type,
+                            LLVMTypeRef *arg_types,
+                            unsigned num_args,
+                            const char *name)
+{
+   LLVMTypeRef function_type;
+   LLVMValueRef function;
+
+   function_type = LLVMFunctionType(ret_type, arg_types, num_args, 0);
+
+   function = lp_build_const_int_pointer(gallivm, ptr);
+
+   function = LLVMBuildBitCast(gallivm->builder, function,
+                               LLVMPointerType(function_type, 0),
+                               name);
+
+   return function;
+}
index 34c3c691377bea67cf078157a7b0d3b901987cb5..2205616274f2d48d67e5b50af9bd84bfced9f6ef 100644 (file)
@@ -153,4 +153,14 @@ LLVMValueRef
 lp_build_const_string(struct gallivm_state *gallivm,
                       const char *str);
 
+
+LLVMValueRef
+lp_build_const_func_pointer(struct gallivm_state *gallivm,
+                            const void *ptr,
+                            LLVMTypeRef ret_type,
+                            LLVMTypeRef *arg_types,
+                            unsigned num_args,
+                            const char *name);
+
+
 #endif /* !LP_BLD_CONST_H */
index 82ab19eda14ba199389ac7c040c357a9b1ac31ed..e4b8da6bcfd043d5513769f031b9ccc2292a6dc9 100644 (file)
@@ -643,28 +643,18 @@ lp_build_fetch_rgba_aos(struct gallivm_state *gallivm,
           */
          LLVMTypeRef ret_type;
          LLVMTypeRef arg_types[4];
-         LLVMTypeRef function_type;
 
          ret_type = LLVMVoidTypeInContext(gallivm->context);
          arg_types[0] = pf32t;
          arg_types[1] = pi8t;
          arg_types[2] = i32t;
          arg_types[3] = i32t;
-         function_type = LLVMFunctionType(ret_type, arg_types,
-                                          Elements(arg_types), 0);
 
-         /* Note: we're using this casting here instead of LLVMAddGlobalMapping()
-          * to work around a bug in LLVM 2.6, and for efficiency/simplicity.
-          */
-
-         /* make const pointer for the C fetch_rgba_float function */
-         function = lp_build_const_int_pointer(gallivm,
-            func_to_pointer((func_pointer) format_desc->fetch_rgba_float));
-
-         /* cast the callee pointer to the function's type */
-         function = LLVMBuildBitCast(builder, function,
-                                     LLVMPointerType(function_type, 0),
-                                     "cast callee");
+         function = lp_build_const_func_pointer(gallivm,
+                                                func_to_pointer((func_pointer) format_desc->fetch_rgba_float),
+                                                ret_type,
+                                                arg_types, Elements(arg_types),
+                                                format_desc->short_name);
       }
 
       tmp_ptr = lp_build_alloca(gallivm, f32x4t, "");