radeon/llvm: Use amdgcn triple for SI+ on LLVM >= 3.6

This commit is contained in:
Tom Stellard
2014-12-23 10:26:23 -05:00
parent 761e36b4ca
commit a8ef880a1b
4 changed files with 27 additions and 16 deletions

View File

@@ -499,6 +499,12 @@ static int r600_get_compute_param(struct pipe_screen *screen,
switch (param) { switch (param) {
case PIPE_COMPUTE_CAP_IR_TARGET: { case PIPE_COMPUTE_CAP_IR_TARGET: {
const char *gpu; const char *gpu;
const char *triple;
if (rscreen->family <= CHIP_ARUBA || HAVE_LLVM < 0x0306) {
triple = "r600--";
} else {
triple = "amdgcn--";
}
switch(rscreen->family) { switch(rscreen->family) {
/* Clang < 3.6 is missing Hainan in its list of /* Clang < 3.6 is missing Hainan in its list of
* GPUs, so we need to use the name of a similar GPU. * 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; break;
} }
if (ret) { 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: case PIPE_COMPUTE_CAP_GRID_DIMENSION:
if (ret) { if (ret) {

View File

@@ -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; LLVMTargetRef target = NULL;
char *err_message = NULL;
init_r600_target(); init_r600_target();
for (target = LLVMGetFirstTarget(); target; if (LLVMGetTargetFromTriple(triple, &target, &err_message)) {
target = LLVMGetNextTarget(target)) { fprintf(stderr, "Cannot find target for triple %s ", triple);
if (!strncmp(LLVMGetTargetName(target), "r600", 4)) { if (err_message) {
break; fprintf(stderr, "%s\n", err_message);
} }
} LLVMDisposeMessage(err_message);
if (!target) {
fprintf(stderr, "Can't find target r600\n");
return NULL; return NULL;
} }
return target; return target;
@@ -155,7 +154,8 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar
LLVMBool mem_err; LLVMBool mem_err;
if (!tm) { 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) { if (!target) {
return 1; return 1;
} }
@@ -165,7 +165,6 @@ unsigned radeon_llvm_compile(LLVMModuleRef M, struct radeon_shader_binary *binar
LLVMDumpModule(M); LLVMDumpModule(M);
strncpy(fs, "+DumpCode", FS_STRING_LEN); strncpy(fs, "+DumpCode", FS_STRING_LEN);
} }
strncpy(triple, "r600--", TRIPLE_STRING_LEN);
tm = LLVMCreateTargetMachine(target, triple, cpu, fs, tm = LLVMCreateTargetMachine(target, triple, cpu, fs,
LLVMCodeGenLevelDefault, LLVMRelocDefault, LLVMCodeGenLevelDefault, LLVMRelocDefault,
LLVMCodeModelDefault); LLVMCodeModelDefault);

View File

@@ -34,7 +34,7 @@ struct radeon_shader_binary;
void radeon_llvm_shader_type(LLVMValueRef F, unsigned type); 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( unsigned radeon_llvm_compile(
LLVMModuleRef M, LLVMModuleRef M,

View File

@@ -485,6 +485,11 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
{ {
struct si_screen *sscreen = CALLOC_STRUCT(si_screen); struct si_screen *sscreen = CALLOC_STRUCT(si_screen);
LLVMTargetRef r600_target; LLVMTargetRef r600_target;
#if HAVE_LLVM >= 0x0306
const char *triple = "amdgcn--";
#else
const char *triple = "r600--";
#endif
if (sscreen == NULL) { if (sscreen == NULL) {
return NULL; return NULL;
} }
@@ -514,8 +519,8 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
#if HAVE_LLVM >= 0x0306 #if HAVE_LLVM >= 0x0306
/* Initialize LLVM TargetMachine */ /* Initialize LLVM TargetMachine */
r600_target = radeon_llvm_get_r600_target(); r600_target = radeon_llvm_get_r600_target(triple);
sscreen->tm = LLVMCreateTargetMachine(r600_target, "r600--", sscreen->tm = LLVMCreateTargetMachine(r600_target, triple,
r600_get_llvm_processor_name(sscreen->b.family), r600_get_llvm_processor_name(sscreen->b.family),
"+DumpCode", LLVMCodeGenLevelDefault, LLVMRelocDefault, "+DumpCode", LLVMCodeGenLevelDefault, LLVMRelocDefault,
LLVMCodeModelDefault); LLVMCodeModelDefault);