radeon/llvm: Use amdgcn triple for SI+ on LLVM >= 3.6
This commit is contained in:
@@ -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) {
|
||||||
|
@@ -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);
|
||||||
|
@@ -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,
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user