[Mesa-dev] [PATCH] various: Fix missing DumpModule with recent LLVM.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Sat Jan 28 21:58:20 UTC 2017


You're right.  Saw that it wasn't in 3.3 and just kept using the
DumpModule in the versions where it was possible to avoid unforeseen
regressions in old LLVM versions . You're right about radeonsi+radv only
supporting 3.6+, and as it is availabe from 3.4 that saves having both
variants. I'll change the llvmpipe version check to 3.4  we know it can
be removed in the next minimum LLVM version bump.

- Bas

On Sat, Jan 28, 2017, at 22:39, Roland Scheidegger wrote:
> Maybe should use the new version for older llvm versions too? I think it
> would work back to around llvm 3.4 or 3.5. Meaning you don't need a
> ifdef for the radeon drivers.
> Or ist there any disadvantage of this versus the older method?
> 
> Roland
> 
> Am 28.01.2017 um 17:40 schrieb Bas Nieuwenhuizen:
> > Since LLVM revision 293359 DumpModule gets only implemented when
> > either a debug build or LLVM_ENABLE_DUMP is set.
> > 
> > This patch adds a direct replacement for the function for radv and
> > radeonsi, However, as I don't know a good place to put common LLVM
> > code for all three I inlined the implementation for LLVMPipe.
> > 
> > Signed-off-by: Bas Nieuwenhuizen <basni at google.com>
> > ---
> >  src/amd/common/ac_llvm_util.c            | 12 ++++++++++++
> >  src/amd/common/ac_llvm_util.h            |  3 +++
> >  src/amd/common/ac_nir_to_llvm.c          |  2 +-
> >  src/gallium/drivers/llvmpipe/lp_jit.c    |  8 +++++++-
> >  src/gallium/drivers/radeonsi/si_shader.c |  6 +++---
> >  5 files changed, 26 insertions(+), 5 deletions(-)
> > 
> > diff --git a/src/amd/common/ac_llvm_util.c b/src/amd/common/ac_llvm_util.c
> > index 770e3bd13c1..73181330b30 100644
> > --- a/src/amd/common/ac_llvm_util.c
> > +++ b/src/amd/common/ac_llvm_util.c
> > @@ -504,3 +504,15 @@ ac_prepare_cube_coords(struct ac_llvm_context *ctx,
> >  
> >  	memcpy(coords_arg, coords, sizeof(coords));
> >  }
> > +
> > +void
> > +ac_dump_module(LLVMModuleRef module)
> > +{
> > +#if HAVE_LLVM >= 0x500
> > +	char *str = LLVMPrintModuleToString(module);
> > +	fprintf(stderr, "%s", str);
> > +	LLVMDisposeMessage(str);
> > +#else
> > +	DumpModule(module);
> > +#endif
> > +}
> > diff --git a/src/amd/common/ac_llvm_util.h b/src/amd/common/ac_llvm_util.h
> > index 802c2662470..2d301c93575 100644
> > --- a/src/amd/common/ac_llvm_util.h
> > +++ b/src/amd/common/ac_llvm_util.h
> > @@ -95,6 +95,9 @@ ac_prepare_cube_coords(struct ac_llvm_context *ctx,
> >  		       LLVMValueRef *coords_arg,
> >  		       LLVMValueRef *derivs_arg);
> >  
> > +void
> > +ac_dump_module(LLVMModuleRef module);
> > +
> >  #ifdef __cplusplus
> >  }
> >  #endif
> > diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
> > index 26b87e8782b..5dc74e82da0 100644
> > --- a/src/amd/common/ac_nir_to_llvm.c
> > +++ b/src/amd/common/ac_nir_to_llvm.c
> > @@ -4566,7 +4566,7 @@ static void ac_compile_llvm_module(LLVMTargetMachineRef tm,
> >  				   bool dump_shader)
> >  {
> >  	if (dump_shader)
> > -		LLVMDumpModule(llvm_module);
> > +		ac_dump_module(llvm_module);
> >  
> >  	memset(binary, 0, sizeof(*binary));
> >  	int v = ac_llvm_compile(llvm_module, binary, tm);
> > diff --git a/src/gallium/drivers/llvmpipe/lp_jit.c b/src/gallium/drivers/llvmpipe/lp_jit.c
> > index 21260369aca..b15de129557 100644
> > --- a/src/gallium/drivers/llvmpipe/lp_jit.c
> > +++ b/src/gallium/drivers/llvmpipe/lp_jit.c
> > @@ -222,7 +222,13 @@ lp_jit_create_types(struct lp_fragment_shader_variant *lp)
> >     }
> >  
> >     if (gallivm_debug & GALLIVM_DEBUG_IR) {
> > -      LLVMDumpModule(gallivm->module);
> > +#if HAVE_LLVM >= 0x500
> > +		char *str = LLVMPrintModuleToString(gallivm->module);
> > +		fprintf(stderr, "%s", str);
> > +		LLVMDisposeMessage(str);
> > +#else
> > +		DumpModule(gallivm->module);
> > +#endif
> >     }
> >  }
> >  
> > diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> > index 5ca974e48b4..cad7bf7a024 100644
> > --- a/src/gallium/drivers/radeonsi/si_shader.c
> > +++ b/src/gallium/drivers/radeonsi/si_shader.c
> > @@ -6400,7 +6400,7 @@ int si_compile_llvm(struct si_screen *sscreen,
> >  
> >  		if (!(sscreen->b.debug_flags & (DBG_NO_IR | DBG_PREOPT_IR))) {
> >  			fprintf(stderr, "%s LLVM IR:\n\n", name);
> > -			LLVMDumpModule(mod);
> > +			ac_dump_module(mod);
> >  			fprintf(stderr, "\n");
> >  		}
> >  	}
> > @@ -6599,7 +6599,7 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
> >  	/* Dump LLVM IR before any optimization passes */
> >  	if (sscreen->b.debug_flags & DBG_PREOPT_IR &&
> >  	    r600_can_dump_shader(&sscreen->b, PIPE_SHADER_GEOMETRY))
> > -		LLVMDumpModule(bld_base->base.gallivm->module);
> > +		ac_dump_module(bld_base->base.gallivm->module);
> >  
> >  	si_llvm_finalize_module(&ctx,
> >  		r600_extra_shader_checks(&sscreen->b, PIPE_SHADER_GEOMETRY));
> > @@ -7603,7 +7603,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
> >  	/* Dump LLVM IR before any optimization passes */
> >  	if (sscreen->b.debug_flags & DBG_PREOPT_IR &&
> >  	    r600_can_dump_shader(&sscreen->b, ctx.type))
> > -		LLVMDumpModule(mod);
> > +		ac_dump_module(mod);
> >  
> >  	si_llvm_finalize_module(&ctx,
> >  				    r600_extra_shader_checks(&sscreen->b, ctx.type));
> > 
> 


More information about the mesa-dev mailing list