Module: Mesa
Branch: master
Commit: eaa8e56108e28ff5fabc8c471f4e904b53c5f8fb
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=eaa8e56108e28ff5fabc8c471f4e904b53c5f8fb

Author: Alexander V. Nikolaev <a...@daemon.hole.ru>
Date:   Sun Sep 23 05:28:39 2012 +0300

gallium/gallivm: code generation options for LLVM 3.1+

LLVM 3.1+ haven't more "extern unsigned llvm::StackAlignmentOverride"
and friends for configuring code generation options, like stack
alignment.

So I restrict assiging of lvm::StackAlignmentOverride and other
variables to LLVM 3.0 only, and wrote similiar code using
TargetOptions.

This patch fix segfaulting of WINE using llvmpipe built with LLVM 3.1

Signed-off-by: Alexander V. Nikolaev <a...@daemon.hole.ru>
Signed-off-by: José Fonseca <jose.r.fons...@gmail.com>

---

 src/gallium/auxiliary/gallivm/lp_bld_init.c   |   11 ++++---
 src/gallium/auxiliary/gallivm/lp_bld_misc.cpp |   41 ++++++++++++++++++++-----
 src/gallium/auxiliary/gallivm/lp_bld_misc.h   |    9 +++--
 3 files changed, 44 insertions(+), 17 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c 
b/src/gallium/auxiliary/gallivm/lp_bld_init.c
index d364390..0065bb4 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_init.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c
@@ -258,11 +258,12 @@ init_gallivm_engine(struct gallivm_state *gallivm)
          optlevel = Default;
       }
 
-#if USE_MCJIT
-      ret = lp_build_create_mcjit_compiler_for_module(&gallivm->engine,
-                                                      gallivm->module,
-                                                      (unsigned) optlevel,
-                                                      &error);
+#if HAVE_LLVM >= 0x0301
+      ret = lp_build_create_jit_compiler_for_module(&gallivm->engine,
+                                                    gallivm->module,
+                                                    (unsigned) optlevel,
+                                                    USE_MCJIT,
+                                                    &error);
 #else
       ret = LLVMCreateJITCompiler(&gallivm->engine, gallivm->provider,
                                   (unsigned) optlevel, &error);
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp 
b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
index dd2c612..6a560df 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
+++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
@@ -109,7 +109,7 @@ lp_set_target_options(void)
     * to only assume a 4 bytes alignment for backwards compatibility.
     */
 #if defined(PIPE_ARCH_X86)
-#if HAVE_LLVM >= 0x0300
+#if HAVE_LLVM == 0x0300
    llvm::StackAlignmentOverride = 4;
 #else
    llvm::StackAlignment = 4;
@@ -232,8 +232,9 @@ lp_set_store_alignment(LLVMValueRef Inst,
 #if HAVE_LLVM >= 0x301
 
 /**
- * Same as LLVMCreateJITCompilerForModule, but using MCJIT and enabling AVX
- * feature where available.
+ * Same as LLVMCreateJITCompilerForModule, but:
+ * - allows using MCJIT and enabling AVX feature where available.
+ * - set target options
  *
  * See also:
  * - llvm/lib/ExecutionEngine/ExecutionEngineBindings.cpp
@@ -242,20 +243,44 @@ lp_set_store_alignment(LLVMValueRef Inst,
  */
 extern "C"
 LLVMBool
-lp_build_create_mcjit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
-                                          LLVMModuleRef M,
-                                          unsigned OptLevel,
-                                          char **OutError)
+lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
+                                        LLVMModuleRef M,
+                                        unsigned OptLevel,
+                                        int useMCJIT,
+                                        char **OutError)
 {
    using namespace llvm;
 
    std::string Error;
    EngineBuilder builder(unwrap(M));
+
+   /**
+    * LLVM 3.1+ haven't more "extern unsigned llvm::StackAlignmentOverride" and
+    * friends for configuring code generation options, like stack alignment.
+    */
+   TargetOptions options;
+#if defined(PIPE_ARCH_X86)
+   options.StackAlignmentOverride = 4;
+   options.RealignStack = true;
+#endif
+
+#if defined(DEBUG)
+   options.JITEmitDebugInfo = true;
+#endif
+
+#if defined(DEBUG) || defined(PROFILE)
+   options.NoFramePointerElimNonLeaf = true;
+   options.NoFramePointerElim = true;
+#endif
+
    builder.setEngineKind(EngineKind::JIT)
           .setErrorStr(&Error)
+          .setTargetOptions(options)
           .setOptLevel((CodeGenOpt::Level)OptLevel);
 
-   builder.setUseMCJIT(true);
+   if (useMCJIT) {
+       builder.setUseMCJIT(true);
+   }
 
    llvm::SmallVector<std::string, 1> MAttrs;
    if (util_cpu_caps.has_avx) {
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.h 
b/src/gallium/auxiliary/gallivm/lp_bld_misc.h
index 4f80b38..9ed7c34 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_misc.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.h
@@ -56,10 +56,11 @@ lp_build_load_volatile(LLVMBuilderRef B, LLVMValueRef 
PointerVal,
                        const char *Name);
 
 extern int
-lp_build_create_mcjit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
-                                          LLVMModuleRef M,
-                                          unsigned OptLevel,
-                                          char **OutError);
+lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
+                                        LLVMModuleRef M,
+                                        unsigned OptLevel,
+                                        int useMCJIT,
+                                        char **OutError);
 
 
 #ifdef __cplusplus

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to