From: Marek Olšák <marek.ol...@amd.com>

This removes some ugly code around module initialization.
---
Dave, please rebase your code on top of this, and we don't need triple
and data_layout in ac_llvm_compiler_info.

 src/amd/common/ac_llvm_helper.cpp                  | 10 ++++++++++
 src/amd/common/ac_llvm_util.h                      |  1 +
 src/amd/vulkan/radv_nir_to_llvm.c                  | 12 ++----------
 src/gallium/drivers/radeonsi/si_pipe.c             | 14 +++-----------
 src/gallium/drivers/radeonsi/si_shader.h           |  2 --
 .../drivers/radeonsi/si_shader_tgsi_setup.c        |  5 +----
 6 files changed, 17 insertions(+), 27 deletions(-)

diff --git a/src/amd/common/ac_llvm_helper.cpp 
b/src/amd/common/ac_llvm_helper.cpp
index 1a2aee3bc9a..495bd98da9c 100644
--- a/src/amd/common/ac_llvm_helper.cpp
+++ b/src/amd/common/ac_llvm_helper.cpp
@@ -54,20 +54,30 @@ bool ac_is_sgpr_param(LLVMValueRef arg)
 LLVMValueRef ac_llvm_get_called_value(LLVMValueRef call)
 {
        return LLVMGetCalledValue(call);
 }
 
 bool ac_llvm_is_function(LLVMValueRef v)
 {
        return LLVMGetValueKind(v) == LLVMFunctionValueKind;
 }
 
+LLVMModuleRef ac_create_module(LLVMTargetMachineRef tm, LLVMContextRef ctx)
+{
+   llvm::TargetMachine *TM = reinterpret_cast<llvm::TargetMachine*>(tm);
+   LLVMModuleRef module = LLVMModuleCreateWithNameInContext("mesa-shader", 
ctx);
+
+   llvm::unwrap(module)->setTargetTriple(TM->getTargetTriple().getTriple());
+   llvm::unwrap(module)->setDataLayout(TM->createDataLayout());
+   return module;
+}
+
 LLVMBuilderRef ac_create_builder(LLVMContextRef ctx,
                                 enum ac_float_mode float_mode)
 {
        LLVMBuilderRef builder = LLVMCreateBuilderInContext(ctx);
 
        llvm::FastMathFlags flags;
 
        switch (float_mode) {
        case AC_FLOAT_MODE_DEFAULT:
                break;
diff --git a/src/amd/common/ac_llvm_util.h b/src/amd/common/ac_llvm_util.h
index 0aa803c5bc1..6e6d15bb56c 100644
--- a/src/amd/common/ac_llvm_util.h
+++ b/src/amd/common/ac_llvm_util.h
@@ -76,20 +76,21 @@ LLVMTargetRef ac_get_llvm_target(const char *triple);
 void ac_add_attr_dereferenceable(LLVMValueRef val, uint64_t bytes);
 bool ac_is_sgpr_param(LLVMValueRef param);
 void ac_add_function_attr(LLVMContextRef ctx, LLVMValueRef function,
                           int attr_idx, enum ac_func_attr attr);
 void ac_add_func_attributes(LLVMContextRef ctx, LLVMValueRef function,
                            unsigned attrib_mask);
 void ac_dump_module(LLVMModuleRef module);
 
 LLVMValueRef ac_llvm_get_called_value(LLVMValueRef call);
 bool ac_llvm_is_function(LLVMValueRef v);
+LLVMModuleRef ac_create_module(LLVMTargetMachineRef tm, LLVMContextRef ctx);
 
 LLVMBuilderRef ac_create_builder(LLVMContextRef ctx,
                                 enum ac_float_mode float_mode);
 
 void
 ac_llvm_add_target_dep_function_attr(LLVMValueRef F,
                                     const char *name, unsigned value);
 
 static inline unsigned
 ac_get_load_intr_attribs(bool can_speculate)
diff --git a/src/amd/vulkan/radv_nir_to_llvm.c 
b/src/amd/vulkan/radv_nir_to_llvm.c
index cd8d86603bc..ce6d5e1547d 100644
--- a/src/amd/vulkan/radv_nir_to_llvm.c
+++ b/src/amd/vulkan/radv_nir_to_llvm.c
@@ -3158,28 +3158,21 @@ LLVMModuleRef 
ac_translate_nir_to_llvm(LLVMTargetMachineRef tm,
                                        const struct radv_nir_compiler_options 
*options)
 {
        struct radv_shader_context ctx = {0};
        unsigned i;
        ctx.options = options;
        ctx.shader_info = shader_info;
        ctx.context = LLVMContextCreate();
 
        ac_llvm_context_init(&ctx.ac, ctx.context, options->chip_class,
                             options->family);
-       ctx.ac.module = LLVMModuleCreateWithNameInContext("shader", 
ctx.context);
-       LLVMSetTarget(ctx.ac.module, options->supports_spill ? 
"amdgcn-mesa-mesa3d" : "amdgcn--");
-
-       LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(tm);
-       char *data_layout_str = LLVMCopyStringRepOfTargetData(data_layout);
-       LLVMSetDataLayout(ctx.ac.module, data_layout_str);
-       LLVMDisposeTargetData(data_layout);
-       LLVMDisposeMessage(data_layout_str);
+       ctx.ac.module = ac_create_module(tm, ctx.context);
 
        enum ac_float_mode float_mode =
                options->unsafe_math ? AC_FLOAT_MODE_UNSAFE_FP_MATH :
                                       AC_FLOAT_MODE_DEFAULT;
 
        ctx.ac.builder = ac_create_builder(ctx.context, float_mode);
 
        memset(shader_info, 0, sizeof(*shader_info));
 
        for(int i = 0; i < shader_count; ++i)
@@ -3606,24 +3599,23 @@ radv_compile_gs_copy_shader(LLVMTargetMachineRef tm,
                            struct radv_shader_variant_info *shader_info,
                            const struct radv_nir_compiler_options *options)
 {
        struct radv_shader_context ctx = {0};
        ctx.context = LLVMContextCreate();
        ctx.options = options;
        ctx.shader_info = shader_info;
 
        ac_llvm_context_init(&ctx.ac, ctx.context, options->chip_class,
                             options->family);
-       ctx.ac.module = LLVMModuleCreateWithNameInContext("shader", 
ctx.context);
+       ctx.ac.module = ac_create_module(tm, ctx.context);
 
        ctx.is_gs_copy_shader = true;
-       LLVMSetTarget(ctx.ac.module, "amdgcn--");
 
        enum ac_float_mode float_mode =
                options->unsafe_math ? AC_FLOAT_MODE_UNSAFE_FP_MATH :
                                       AC_FLOAT_MODE_DEFAULT;
 
        ctx.ac.builder = ac_create_builder(ctx.context, float_mode);
        ctx.stage = MESA_SHADER_VERTEX;
 
        radv_nir_shader_info_pass(geom_shader, options, &shader_info->info);
 
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c 
b/src/gallium/drivers/radeonsi/si_pipe.c
index ded8cb5eb08..5da8a4b9873 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -112,27 +112,28 @@ static const struct debug_named_value debug_options[] = {
 
 static void si_init_compiler(struct si_screen *sscreen,
                             struct si_compiler *compiler)
 {
        enum ac_target_machine_options tm_options =
                (sscreen->debug_flags & DBG(SI_SCHED) ? AC_TM_SISCHED : 0) |
                (sscreen->info.chip_class >= GFX9 ? AC_TM_FORCE_ENABLE_XNACK : 
0) |
                (sscreen->info.chip_class < GFX9 ? AC_TM_FORCE_DISABLE_XNACK : 
0) |
                (!sscreen->llvm_has_working_vgpr_indexing ? 
AC_TM_PROMOTE_ALLOCA_TO_SCRATCH : 0);
 
+       const char *triple;
        compiler->tm = ac_create_target_machine(sscreen->info.family,
-                                               tm_options, &compiler->triple);
+                                               tm_options, &triple);
        if (!compiler->tm)
                return;
 
        compiler->target_library_info =
-               gallivm_create_target_library_info(compiler->triple);
+               gallivm_create_target_library_info(triple);
        if (!compiler->target_library_info)
                return;
 
        compiler->passmgr = LLVMCreatePassManager();
        if (!compiler->passmgr)
                return;
 
        LLVMAddTargetLibraryInfo(compiler->target_library_info,
                                 compiler->passmgr);
 
@@ -143,33 +144,24 @@ static void si_init_compiler(struct si_screen *sscreen,
        LLVMAddAlwaysInlinerPass(compiler->passmgr);
        /* This pass should eliminate all the load and store instructions. */
        LLVMAddPromoteMemoryToRegisterPass(compiler->passmgr);
        LLVMAddScalarReplAggregatesPass(compiler->passmgr);
        LLVMAddLICMPass(compiler->passmgr);
        LLVMAddAggressiveDCEPass(compiler->passmgr);
        LLVMAddCFGSimplificationPass(compiler->passmgr);
        /* This is recommended by the instruction combining pass. */
        LLVMAddEarlyCSEMemSSAPass(compiler->passmgr);
        LLVMAddInstructionCombiningPass(compiler->passmgr);
-
-       /* Get the data layout. */
-       LLVMTargetDataRef data_layout = 
LLVMCreateTargetDataLayout(compiler->tm);
-       if (!data_layout)
-               return;
-       compiler->data_layout = LLVMCopyStringRepOfTargetData(data_layout);
-       LLVMDisposeTargetData(data_layout);
 }
 
 static void si_destroy_compiler(struct si_compiler *compiler)
 {
-       if (compiler->data_layout)
-               LLVMDisposeMessage((char*)compiler->data_layout);
        if (compiler->passmgr)
                LLVMDisposePassManager(compiler->passmgr);
 #if HAVE_LLVM >= 0x0700
        /* This crashes on LLVM 5.0 and 6.0 and Ubuntu 18.04, so leak it there. 
*/
        if (compiler->target_library_info)
                
gallivm_dispose_target_library_info(compiler->target_library_info);
 #endif
        if (compiler->tm)
                LLVMDisposeTargetMachine(compiler->tm);
 }
diff --git a/src/gallium/drivers/radeonsi/si_shader.h 
b/src/gallium/drivers/radeonsi/si_shader.h
index 0dc27f29afd..6b71b399437 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -313,22 +313,20 @@ enum {
        SI_FIX_FETCH_RGB_8_INT, /* A = 1 */
        SI_FIX_FETCH_RGB_16,
        SI_FIX_FETCH_RGB_16_INT,
 };
 
 struct si_shader;
 
 /* Per-thread persistent LLVM objects. */
 struct si_compiler {
        LLVMTargetMachineRef            tm;
-       const char                      *triple;
-       const char                      *data_layout;
        LLVMTargetLibraryInfoRef        target_library_info;
        LLVMPassManagerRef              passmgr;
 };
 
 /* State of the context creating the shader object. */
 struct si_compiler_ctx_state {
        /* Should only be used by si_init_shader_selector_async and
         * si_build_shader_variant if thread_index == -1 (non-threaded). */
        struct si_compiler              *compiler;
 
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c 
b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
index de3a6cbf0d7..2581d14e760 100644
--- a/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
+++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c
@@ -979,24 +979,21 @@ void si_llvm_context_init(struct si_shader_context *ctx,
        /* Initialize the gallivm object:
         * We are only using the module, context, and builder fields of this 
struct.
         * This should be enough for us to be able to pass our gallivm struct 
to the
         * helper functions in the gallivm module.
         */
        memset(ctx, 0, sizeof(*ctx));
        ctx->screen = sscreen;
        ctx->compiler = compiler;
 
        ctx->gallivm.context = LLVMContextCreate();
-       ctx->gallivm.module = LLVMModuleCreateWithNameInContext("tgsi",
-                                               ctx->gallivm.context);
-       LLVMSetTarget(ctx->gallivm.module, compiler->triple);
-       LLVMSetDataLayout(ctx->gallivm.module, compiler->data_layout);
+       ctx->gallivm.module = ac_create_module(compiler->tm, 
ctx->gallivm.context);
 
        bool unsafe_fpmath = (sscreen->debug_flags & DBG(UNSAFE_MATH)) != 0;
        enum ac_float_mode float_mode =
                unsafe_fpmath ? AC_FLOAT_MODE_UNSAFE_FP_MATH :
                                AC_FLOAT_MODE_NO_SIGNED_ZEROS_FP_MATH;
 
        ctx->gallivm.builder = ac_create_builder(ctx->gallivm.context,
                                                 float_mode);
 
        ac_llvm_context_init(&ctx->ac, ctx->gallivm.context,
-- 
2.17.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to