llvmpipe: Disassemble generated x86 code.
authorJosé Fonseca <jfonseca@vmware.com>
Sun, 16 Aug 2009 10:50:17 +0000 (11:50 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 29 Aug 2009 08:21:32 +0000 (09:21 +0100)
src/gallium/drivers/llvmpipe/README
src/gallium/drivers/llvmpipe/SConscript
src/gallium/drivers/llvmpipe/lp_bld_debug.c [new file with mode: 0644]
src/gallium/drivers/llvmpipe/lp_bld_debug.h [new file with mode: 0644]
src/gallium/drivers/llvmpipe/lp_state_blend.c
src/gallium/drivers/llvmpipe/lp_state_fs.c
src/gallium/drivers/llvmpipe/lp_test_blend.c
src/gallium/drivers/llvmpipe/lp_test_conv.c
src/gallium/winsys/xlib/SConscript

index afa9cbaf3ee21966a54c090c9db709b0efe7bdfa..af0ef2b317c93110f38456091cee86820062f34f 100644 (file)
@@ -6,11 +6,19 @@ Requirements
 
  - Linux
  
+ - udis86, http://udis86.sourceforge.net/
+     git clone git://udis86.git.sourceforge.net/gitroot/udis86
+     cd udis86
+     ./configure --with-pic
+     make
+     sudo make install
  - LLVM. On Debian based distributions do:
  
      aptitude install llvm-dev
 
-   There is a type in one of the llvm-dev 2.5 headers, that causes compilation
+   There is a typo in one of the llvm-dev 2.5 headers, that causes compilation
    errors in the debug build:
 
      --- /usr/include/llvm-c/Core.h.orig       2009-08-10 15:38:54.000000000 +0100
index 154964bf7acfee4b7ded9e87d7cefa63977381c1..cdd301b02919484d3e0483482d212cec04dcf57d 100644 (file)
@@ -12,6 +12,7 @@ llvmpipe = env.ConvenienceLibrary(
                'lp_bld_blend_soa.c',
                'lp_bld_const.c',
                'lp_bld_conv.c',
+               'lp_bld_debug.c',
                'lp_bld_intr.c',
                'lp_bld_pack.c',
                'lp_bld_unpack.c',
@@ -55,6 +56,7 @@ llvmpipe = env.ConvenienceLibrary(
 
 env = env.Clone()
 
+env.Prepend(LIBS = 'udis86')
 env['LINK'] = env['CXX']
 env.ParseConfig('llvm-config --libs jit interpreter nativecodegen bitwriter')
 env.Prepend(LIBS = [llvmpipe] + auxiliaries)
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_debug.c b/src/gallium/drivers/llvmpipe/lp_bld_debug.c
new file mode 100644 (file)
index 0000000..49a6065
--- /dev/null
@@ -0,0 +1,70 @@
+/**************************************************************************
+ *
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+
+#include <udis86.h>
+
+#include "util/u_debug.h"
+#include "lp_bld_debug.h"
+
+
+void
+lp_disassemble(const void* func)
+{
+   ud_t ud_obj;
+
+   ud_init(&ud_obj);
+
+   ud_set_input_buffer(&ud_obj, (void*)func, 0xffff);
+   ud_set_pc(&ud_obj, (uint64_t) (uintptr_t) func);
+
+#ifdef PIPE_ARCH_X86
+   ud_set_mode(&ud_obj, 32);
+#endif
+#ifdef PIPE_ARCH_X86_64
+   ud_set_mode(&ud_obj, 64);
+#endif
+
+   ud_set_syntax(&ud_obj, UD_SYN_ATT);
+
+   while (ud_disassemble(&ud_obj)) {
+#ifdef PIPE_ARCH_X86
+      debug_printf("%08lx:\t%s\n",
+                   (unsigned long)ud_insn_off(&ud_obj),
+                   ud_insn_asm(&ud_obj));
+#endif
+#ifdef PIPE_ARCH_X86_64
+   debug_printf("%016llx:\t%s\n",
+                (unsigned long long)ud_insn_off(&ud_obj),
+                ud_insn_asm(&ud_obj));
+#endif
+
+      if (ud_obj.mnemonic == UD_Iret)
+         break;
+   }
+   debug_printf("\n");
+}
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_debug.h b/src/gallium/drivers/llvmpipe/lp_bld_debug.h
new file mode 100644 (file)
index 0000000..d836525
--- /dev/null
@@ -0,0 +1,37 @@
+/**************************************************************************
+ *
+ * Copyright 2009 VMware, Inc.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+
+#ifndef LP_BLD_DEBUG_H
+#define LP_BLD_DEBUG_H
+
+
+void
+lp_disassemble(const void* func);
+
+
+#endif /* !LP_BLD_DEBUG_H */
index be3e7b162915cc7a8286a6c2631b4a62fd0bdd08..d31fc6c5fa6a6144295a793e9b5971ebfc9b5f8e 100644 (file)
@@ -41,6 +41,7 @@
 #include "lp_bld_type.h"
 #include "lp_bld_arit.h"
 #include "lp_bld_blend.h"
+#include "lp_bld_debug.h"
 
 
 static void
@@ -127,7 +128,7 @@ llvmpipe_create_blend_state(struct pipe_context *pipe,
 
    LLVMRunFunctionPassManager(screen->pass, blend->function);
 
-#if 1
+#ifdef DEBUG
    debug_printf("%s=%s %s=%s %s=%s %s=%s %s=%s %s=%s\n",
                 "rgb_func",         debug_dump_blend_func  (blend->base.rgb_func, TRUE),
                 "rgb_src_factor",   debug_dump_blend_factor(blend->base.rgb_src_factor, TRUE),
@@ -146,6 +147,10 @@ llvmpipe_create_blend_state(struct pipe_context *pipe,
 
    blend->jit_function = (lp_blend_func)LLVMGetPointerToGlobal(screen->engine, blend->function);
 
+#ifdef DEBUG
+   lp_disassemble(blend->jit_function);
+#endif
+
    return blend;
 }
 
index b9bb7abb0b04e6adbdea608f3df36b51ec6e9f04..157f4eb59c9b4359c563984dc368f7e197285f87 100644 (file)
@@ -36,6 +36,7 @@
 #include "tgsi/tgsi_parse.h"
 #include "lp_bld_type.h"
 #include "lp_bld_tgsi.h"
+#include "lp_bld_debug.h"
 #include "lp_screen.h"
 #include "lp_context.h"
 #include "lp_state.h"
@@ -188,6 +189,10 @@ llvmpipe_create_fs_state(struct pipe_context *pipe,
 
    shader->jit_function = (lp_shader_fs_func)LLVMGetPointerToGlobal(screen->engine, shader->function);
 
+#ifdef DEBUG
+   lp_disassemble(shader->jit_function);
+#endif
+
    return shader;
 }
 
index 645d3880b90fb037d223b6a9607652ffd168ddbd..0b6d2da590abe63e6ef12fdf4ae6e2c6e87e4a5e 100644 (file)
@@ -40,6 +40,7 @@
 #include "lp_bld_type.h"
 #include "lp_bld_arit.h"
 #include "lp_bld_blend.h"
+#include "lp_bld_debug.h"
 #include "lp_test.h"
 
 
@@ -526,6 +527,9 @@ test_one(unsigned verbose,
 
    blend_test_ptr = (blend_test_ptr_t)LLVMGetPointerToGlobal(engine, func);
 
+   if(verbose >= 2)
+      lp_disassemble(blend_test_ptr);
+
    success = TRUE;
    for(i = 0; i < n && success; ++i) {
       if(mode == AoS) {
index 7e8b9347c22b6f6e28ad4c7dc9046032fb72b8b1..91815509b796349500c8850eeb243c7e7dcbd2aa 100644 (file)
@@ -36,6 +36,7 @@
 
 #include "lp_bld_type.h"
 #include "lp_bld_conv.h"
+#include "lp_bld_debug.h"
 #include "lp_test.h"
 
 
@@ -217,6 +218,9 @@ test_one(unsigned verbose,
 
    conv_test_ptr = (conv_test_ptr_t)LLVMGetPointerToGlobal(engine, func);
 
+   if(verbose >= 2)
+      lp_disassemble(conv_test_ptr);
+
    success = TRUE;
    for(i = 0; i < n && success; ++i) {
       unsigned src_stride = src_type.length*src_type.width/8;
index f67a94466a15f81950ca16f04261a081b566af30..d2be07b384e1ed197540832d330e09854461e1f6 100644 (file)
@@ -29,6 +29,14 @@ if env['platform'] == 'linux' \
         sources += ['xlib_softpipe.c']
         drivers += [softpipe]
 
+    if 'llvmpipe' in env['drivers']:
+        env.Append(CPPDEFINES = 'GALLIUM_LLVMPIPE')
+        env.Prepend(LIBS = 'udis86')
+        env.ParseConfig('llvm-config --libs jit interpreter nativecodegen')
+        env['LINK'] = env['CXX']
+        sources += ['xlib_llvmpipe.c']
+        drivers += [llvmpipe]
+
     if 'i965simple' in env['drivers']:
         env.Append(CPPDEFINES = 'GALLIUM_I965SIMPLE')
         sources += [