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 <avn@daemon.hole.ru>
Signed-off-by: José Fonseca <jose.r.fonseca@gmail.com>
This commit is contained in:
Alexander V. Nikolaev 2012-09-23 05:28:39 +03:00 committed by José Fonseca
parent 459b28aba7
commit eaa8e56108
3 changed files with 44 additions and 17 deletions

View File

@ -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);

View File

@ -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) {

View File

@ -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