[Mesa-dev] [PATCH 3/3] gallivm: Initialize LLVM Modules's DataLayout to an empty string.
Roland Scheidegger
sroland at vmware.com
Mon Jul 20 12:28:18 PDT 2015
Am 20.07.2015 um 19:35 schrieb Tom Stellard:
> This fixes crashes in some piglit tests on radeonsi that use the draw
> module, and llvmpipe is likely completely broken without this on LLVM
> 3.8.
Yes, see https://llvm.org/bugs/show_bug.cgi?id=24172
>
> This is just a temporary solution. The correct solution will require
> creating a TargetMachine during gallivm initialization and pulling the
> DataLayout from there. This will be a somewhat invasive change, and it
> will need to be validatated on multiple LLVM versions.
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
> ---
> src/gallium/auxiliary/gallivm/lp_bld_init.c | 28 +++++++++++++++++++++++-----
> 1 file changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_init.c b/src/gallium/auxiliary/gallivm/lp_bld_init.c
> index 384ea86..017d075 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_init.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_init.c
> @@ -106,7 +106,6 @@ enum LLVM_CodeGenOpt_Level {
> static boolean
> create_pass_manager(struct gallivm_state *gallivm)
> {
> - char *td_str;
> assert(!gallivm->passmgr);
> assert(gallivm->target);
>
> @@ -122,10 +121,29 @@ create_pass_manager(struct gallivm_state *gallivm)
> // Old versions of LLVM get the DataLayout from the pass manager.
> LLVMAddTargetData(gallivm->target, gallivm->passmgr);
>
> - // New ones from the Module.
> - td_str = LLVMCopyStringRepOfTargetData(gallivm->target);
> - LLVMSetDataLayout(gallivm->module, td_str);
> - free(td_str);
> + /* Setting the module's DataLayout to an empty string will cause the
> + * ExecutionEngine to copy to the DataLayout string from its target
> + * machine to the module. As of LLVM 3.8 the module and the execution
> + * engine are required to have the same DataLayout.
> + *
> + * TODO: This is just a temporary work-around. The correct solution is
> + * for gallivm_init_state() to create a TargetMachine and pull the
> + * DataLayout from there. Currently, the TargetMachine used by llvmpipe
> + * is being implicitly created by the EngineBuilder in
> + * lp_build_create_jit_compiler_for_module()
> + */
> +
> +#if HAVE_LLVM < 0x0308
> + {
> + char *td_str;
> + // New ones from the Module.
> + td_str = LLVMCopyStringRepOfTargetData(gallivm->target);
> + LLVMSetDataLayout(gallivm->module, td_str);
> + free(td_str);
> + }
> +#else
> + LLVMSetDataLayout(gallivm->module, "");
> +#endif
>
> if ((gallivm_debug & GALLIVM_DEBUG_NO_OPT) == 0) {
> /* These are the passes currently listed in llvm-c/Transforms/Scalar.h,
>
More information about the mesa-dev
mailing list