ac: move all LLVM module initialization into ac_create_module
authorMarek Olšák <marek.olsak@amd.com>
Sat, 30 Jun 2018 04:54:30 +0000 (00:54 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 2 Jul 2018 18:34:39 +0000 (14:34 -0400)
This removes some ugly code around module initialization.

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_llvm_helper.cpp
src/amd/common/ac_llvm_util.h
src/amd/vulkan/radv_nir_to_llvm.c
src/gallium/drivers/radeonsi/si_pipe.c
src/gallium/drivers/radeonsi/si_shader.h
src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c

index 1a2aee3bc9a8859c008af38e073919ee22be6261..495bd98da9cb93b83d95957b2c1cf3819d5773a9 100644 (file)
@@ -61,6 +61,16 @@ 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)
 {
index 0aa803c5bc1c6ac14b34efb7e9edb046551defca..6e6d15bb56c493485f39197a7b8b101ba4e5ea0b 100644 (file)
@@ -83,6 +83,7 @@ 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);
index cd8d86603bc4debcffc8d2da12d8fee503a8d1d7..ce6d5e1547d4fda53e20aebc67751f01b3aabb5a 100644 (file)
@@ -3165,14 +3165,7 @@ LLVMModuleRef ac_translate_nir_to_llvm(LLVMTargetMachineRef tm,
 
        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 :
@@ -3613,10 +3606,9 @@ radv_compile_gs_copy_shader(LLVMTargetMachineRef tm,
 
        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 :
index ded8cb5eb0893abc9d4a5fa77201932dbb847051..5da8a4b9873150c44fb87563a324979fdcb17bf0 100644 (file)
@@ -119,13 +119,14 @@ static void si_init_compiler(struct si_screen *sscreen,
                (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;
 
@@ -150,19 +151,10 @@ static void si_init_compiler(struct si_screen *sscreen,
        /* 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
index 0dc27f29afd63c3dafc27fd798367182523a676a..6b71b399437e9d5baaff7a7aec8c1879239369b5 100644 (file)
@@ -320,8 +320,6 @@ 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;
 };
index de3a6cbf0d76fe85f42909ea0f74a82147dc5cc2..2581d14e76040c9bb419f79c5af2f73ca4e7f7d4 100644 (file)
@@ -986,10 +986,7 @@ void si_llvm_context_init(struct si_shader_context *ctx,
        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 =