From eaa8e56108e28ff5fabc8c471f4e904b53c5f8fb Mon Sep 17 00:00:00 2001 From: "Alexander V. Nikolaev" Date: Sun, 23 Sep 2012 05:28:39 +0300 Subject: [PATCH] gallium/gallivm: code generation options for LLVM 3.1+ MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: José Fonseca --- 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 d364390cdf0..0065bb49a4b 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 dd2c6120afb..6a560df065a 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 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 4f80b38280c..9ed7c348bb4 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 -- 2.30.2