diff options
author | Tom Stellard <[email protected]> | 2014-12-23 10:26:23 -0500 |
---|---|---|
committer | Tom Stellard <[email protected]> | 2015-01-06 12:53:21 -0800 |
commit | a8ef880a1b38cbcfc26e9f829338739d16cece99 (patch) | |
tree | 5a65fa8ae3ce7115a4b687c7394ced18a43b3054 /src/gallium/drivers/radeon | |
parent | 761e36b4caab4e8e09a4c2b1409a825902fc7d2c (diff) |
radeon/llvm: Use amdgcn triple for SI+ on LLVM >= 3.6
Diffstat (limited to 'src/gallium/drivers/radeon')
-rw-r--r-- | src/gallium/drivers/radeon/r600_pipe_common.c | 11 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/radeon_llvm_emit.c | 21 | ||||
-rw-r--r-- | src/gallium/drivers/radeon/radeon_llvm_emit.h | 2 |
3 files changed, 20 insertions, 14 deletions
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index d4133d8cbad..d46b3b38f86 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -499,6 +499,12 @@ static int r600_get_compute_param(struct pipe_screen *screen, switch (param) { case PIPE_COMPUTE_CAP_IR_TARGET: { const char *gpu; + const char *triple; + if (rscreen->family <= CHIP_ARUBA || HAVE_LLVM < 0x0306) { + triple = "r600--"; + } else { + triple = "amdgcn--"; + } switch(rscreen->family) { /* Clang < 3.6 is missing Hainan in its list of * GPUs, so we need to use the name of a similar GPU. @@ -513,9 +519,10 @@ static int r600_get_compute_param(struct pipe_screen *screen, break; } if (ret) { - sprintf(ret, "%s-r600--", gpu); + sprintf(ret, "%s-%s", gpu, triple); + } - return (8 + strlen(gpu)) * sizeof(char); + return (strlen(triple) + strlen(gpu)) * sizeof(char); } case PIPE_COMPUTE_CAP_GRID_DIMENSION: if (ret) { diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c b/src/gallium/drivers/radeon/radeon_llvm_emit.c index 4f288e42b1f..b98afb246ae 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.c +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c @@ -98,20 +98,19 @@ static void init_r600_target() } } -LLVMTargetRef radeon_llvm_get_r600_target() +LLVMTargetRef radeon_llvm_get_r600_target(const char *triple) { LLVMTargetRef target = NULL; + char *err_message = NULL; + init_r600_target(); - for (target = LLVMGetFirstTarget(); target; - target = LLVMGetNextTarget(target)) { - if (!strncmp(LLVMGetTargetName(target), "r600", 4)) { - break; + if (LLVMGetTargetFromTriple(triple, &target, &err_message)) { + fprintf(stderr, "Cannot find target for triple %s ", triple); + if (err_message) { + fprintf(stderr, "%s\n", err_message); } - } - - if (!target) { - fprintf(stderr, "Can't find target r600\n"); + LLVMDisposeMessage(err_message); return NULL; } return target; @@ -155,7 +154,8 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar LLVMBool mem_err; if (!tm) { - LLVMTargetRef target = radeon_llvm_get_r600_target(); + strncpy(triple, "r600--", TRIPLE_STRING_LEN); + LLVMTargetRef target = radeon_llvm_get_r600_target(triple); if (!target) { return 1; } @@ -165,7 +165,6 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar LLVMDumpModule(M); strncpy(fs, "+DumpCode", FS_STRING_LEN); } - strncpy(triple, "r600--", TRIPLE_STRING_LEN); tm = LLVMCreateTargetMachine(target, triple, cpu, fs, LLVMCodeGenLevelDefault, LLVMRelocDefault, LLVMCodeModelDefault); diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.h b/src/gallium/drivers/radeon/radeon_llvm_emit.h index 66217b5ce5f..3ccef78e36d 100644 --- a/src/gallium/drivers/radeon/radeon_llvm_emit.h +++ b/src/gallium/drivers/radeon/radeon_llvm_emit.h @@ -34,7 +34,7 @@ struct radeon_shader_binary; void radeon_llvm_shader_type(LLVMValueRef F, unsigned type); -LLVMTargetRef radeon_llvm_get_r600_target(void); +LLVMTargetRef radeon_llvm_get_r600_target(const char *triple); unsigned radeon_llvm_compile( LLVMModuleRef M, |