aco: fix printing assembly with CLRXdisasm on GFX6
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 20 Jan 2020 17:41:00 +0000 (18:41 +0100)
committerMarge Bot <eric+marge@anholt.net>
Thu, 23 Jan 2020 11:34:37 +0000 (11:34 +0000)
We thought that CLRXdisasm allowed gfx600 as well as gfx700 but
it actually doesn't. Use the family for GFX6 chips instead.

Fixes: 0099f85232b ("aco: print assembly with CLRXdisasm for GFX6-GFX7 if found on the system")
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3531>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3531>

src/amd/compiler/aco_print_asm.cpp

index 74115e10cd342fecd395bc821e200f8d1d3f9c52..fead382c7cf1a6d6e895f534b2d8e2b29901aca8 100644 (file)
@@ -16,6 +16,7 @@ void print_asm_gfx6_gfx7(Program *program, std::vector<uint32_t>& binary,
 {
    char path[] = "/tmp/fileXXXXXX";
    char line[2048], command[128];
+   const char *gpu_type;
    FILE *p;
    int fd;
 
@@ -30,8 +31,39 @@ void print_asm_gfx6_gfx7(Program *program, std::vector<uint32_t>& binary,
          goto fail;
    }
 
-   sprintf(command, "clrxdisasm --gpuType=%s -r %s",
-           program->chip_class == GFX6 ? "gfx600" : "gfx700", path);
+   /* Determine the GPU type for CLRXdisasm. Use the family for GFX6 chips
+    * because it doesn't allow to use gfx600 directly.
+    */
+   switch (program->chip_class) {
+   case GFX6:
+      switch (program->family) {
+      case CHIP_TAHITI:
+         gpu_type = "tahiti";
+         break;
+      case CHIP_PITCAIRN:
+         gpu_type = "pitcairn";
+         break;
+      case CHIP_VERDE:
+         gpu_type = "capeverde";
+         break;
+      case CHIP_OLAND:
+         gpu_type = "oland";
+         break;
+      case CHIP_HAINAN:
+         gpu_type = "hainan";
+         break;
+      default:
+         unreachable("Invalid GFX6 family!");
+      }
+      break;
+   case GFX7:
+      gpu_type = "gfx700";
+      break;
+   default:
+      unreachable("Invalid chip class!");
+   }
+
+   sprintf(command, "clrxdisasm --gpuType=%s -r %s", gpu_type, path);
 
    p = popen(command, "r");
    if (p) {