gallivm: fix lp_build_sample_offset() crash when indexing a 1-D texture
[mesa.git] / src / gallium / auxiliary / gallivm / lp_bld_printf.c
index ae4d400af39e0a15b13701d505041c6c457a4d0b..153ba5b15b17656b3b3be65ce43c2b73f4cf38a6 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <stdio.h>
 
+#include "util/u_debug.h"
+#include "util/u_memory.h"
 #include "lp_bld_printf.h"
 
 
@@ -52,6 +54,7 @@ lp_get_printf_arg_count(const char *fmt)
               p += 3;
                continue;
            }
+           /* fallthrough */
         default:
            count ++;
       }
@@ -84,12 +87,14 @@ lp_build_printf(LLVMBuilderRef builder, const char *fmt, ...)
    int i = 0;
    int argcount = lp_get_printf_arg_count(fmt);
    LLVMModuleRef module = LLVMGetGlobalParent(LLVMGetBasicBlockParent(LLVMGetInsertBlock(builder)));
-   LLVMValueRef params[argcount + 1];
+   LLVMValueRef params[50];
    LLVMValueRef fmtarg = lp_build_const_string_variable(module, fmt, strlen(fmt) + 1);
    LLVMValueRef int0 = LLVMConstInt(LLVMInt32Type(), 0, 0);
    LLVMValueRef index[2];
    LLVMValueRef func_printf = LLVMGetNamedFunction(module, "printf");
 
+   assert(Elements(params) >= argcount + 1);
+
    index[0] = index[1] = int0;
 
    if (!func_printf) {
@@ -100,8 +105,15 @@ lp_build_printf(LLVMBuilderRef builder, const char *fmt, ...)
    params[0] = LLVMBuildGEP(builder, fmtarg, index, 2, "");
 
    va_start(arglist, fmt);
-   for (i = 1; i <= argcount; i++)
-      params[i] = va_arg(arglist, LLVMValueRef);
+   for (i = 1; i <= argcount; i++) {
+      LLVMValueRef val = va_arg(arglist, LLVMValueRef);
+      LLVMTypeRef type = LLVMTypeOf(val);
+      /* printf wants doubles, so lets convert so that
+       * we can actually print them */
+      if (LLVMGetTypeKind(type) == LLVMFloatTypeKind)
+         val = LLVMBuildFPExt(builder, val, LLVMDoubleType(), "");
+      params[i] = val;
+   }
    va_end(arglist);
 
    return LLVMBuildCall(builder, func_printf, params, argcount + 1, "");