llvmpipe: Debug function to check stack alignment.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 9 Sep 2009 18:21:22 +0000 (19:21 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 9 Sep 2009 20:48:49 +0000 (21:48 +0100)
Doing alignment check in locus is redundant, as gcc alignment assumptions
will optimize away the check.

src/gallium/drivers/llvmpipe/lp_bld_debug.c
src/gallium/drivers/llvmpipe/lp_bld_debug.h
src/gallium/drivers/llvmpipe/lp_setup.c

index 30925b5f415d3f65d113769f3c1e8b01349afa76..59d8f492e60af0af4585c1fcaa5ac95f8154e5f6 100644 (file)
 #include <udis86.h>
 #endif
 
+#include "util/u_math.h"
 #include "util/u_debug.h"
 #include "lp_bld_debug.h"
 
 
+/**
+ * Check alignment.
+ *
+ * It is important that this check is not implemented as a macro or inlined
+ * function, as the compiler assumptions in respect to alignment of global
+ * and stack variables would often make the check a no op, defeating the
+ * whole purpose of the exercise.
+ */
+boolean
+lp_check_alignment(const void *ptr, unsigned alignment)
+{
+   assert(util_is_pot(alignment));
+   return ((uintptr_t)ptr & (alignment - 1)) == 0;
+}
+
+
 void
 lp_disassemble(const void* func)
 {
index ecdafef76d065424032ec9e9e1f9baf7e04fa6f4..583e6132b4b3b505b24efea072682e3aeab4bf74 100644 (file)
@@ -53,6 +53,10 @@ lp_build_name(LLVMValueRef val, const char *format, ...)
 }
 
 
+boolean
+lp_check_alignment(const void *ptr, unsigned alignment);
+
+
 void
 lp_disassemble(const void* func);
 
index d145f6d6bbc4f07737908d589f3e697bf5026b9a..f9e254efcae536e2b0306d95e1fc7b9cf26ab729 100644 (file)
@@ -44,6 +44,7 @@
 #include "pipe/p_thread.h"
 #include "util/u_math.h"
 #include "util/u_memory.h"
+#include "lp_bld_debug.h"
 #include "lp_tile_cache.h"
 #include "lp_tile_soa.h"
 
@@ -164,10 +165,12 @@ shade_quads(struct llvmpipe_context *llvmpipe,
 
    /* TODO: blend color */
 
-   assert((((uintptr_t)mask) & 0xf) == 0);
-   assert((((uintptr_t)depth) & 0xf) == 0);
-   assert((((uintptr_t)color) & 0xf) == 0);
-   assert((((uintptr_t)llvmpipe->jit_context.blend_color) & 0xf) == 0);
+   /* XXX: This will most likely fail on 32bit x86 without -mstackrealign */
+   assert(lp_check_alignment(mask, 16));
+
+   assert(lp_check_alignment(depth, 16));
+   assert(lp_check_alignment(color, 16));
+   assert(lp_check_alignment(llvmpipe->jit_context.blend_color, 16));
 
    /* run shader */
    fs->current->jit_function( &llvmpipe->jit_context,