freedreno/afuc: Add raw mode for disasm
authorRob Clark <robdclark@chromium.org>
Mon, 6 Mar 2023 23:14:16 +0000 (15:14 -0800)
committerMarge Bot <emma+marge@anholt.net>
Sat, 25 Mar 2023 16:21:28 +0000 (16:21 +0000)
Add a mode which doesn't try to find/process a jmptable.  Useful for
looking at zap shaders.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21748>

src/freedreno/afuc/disasm.c

index 5be0670..9b19645 100644 (file)
@@ -830,6 +830,15 @@ disasm(struct emu *emu)
    }
 }
 
+static void
+disasm_raw(uint32_t *instrs, int sizedwords)
+{
+   setup_labels(instrs, sizedwords);
+
+   for (int i = 0; i < sizedwords; i++) {
+      disasm_instr(instrs, i);
+   }
+}
 
 static void
 disasm_legacy(uint32_t *buf, int sizedwords)
@@ -876,11 +885,13 @@ static void
 usage(void)
 {
    fprintf(stderr, "Usage:\n"
-                   "\tdisasm [-g GPUVER] [-v] [-c] filename.asm\n"
-                   "\t\t-g - specify GPU version (5, etc)\n"
+                   "\tdisasm [-g GPUVER] [-v] [-c] [-r] filename.asm\n"
                    "\t\t-c - use colors\n"
+                   "\t\t-e - emulator mode\n"
+                   "\t\t-g - specify GPU version (5, etc)\n"
+                   "\t\t-r - raw disasm, don't try to find jumptable\n"
                    "\t\t-v - verbose output\n"
-                   "\t\t-e - emulator mode\n");
+           );
    exit(2);
 }
 
@@ -894,16 +905,11 @@ main(int argc, char **argv)
    size_t sz;
    int c, ret;
    bool unit_test = false;
+   bool raw = false;
 
    /* Argument parsing: */
-   while ((c = getopt(argc, argv, "g:vceu")) != -1) {
+   while ((c = getopt(argc, argv, "ceg:rvu")) != -1) {
       switch (c) {
-      case 'g':
-         gpu_id = atoi(optarg);
-         break;
-      case 'v':
-         verbose = true;
-         break;
       case 'c':
          colors = true;
          break;
@@ -911,7 +917,19 @@ main(int argc, char **argv)
          emulator = true;
          verbose  = true;
          break;
+      case 'g':
+         gpu_id = atoi(optarg);
+         break;
+      case 'r':
+         raw = true;
+         break;
+      case 'v':
+         verbose = true;
+         break;
       case 'u':
+         /* special "hidden" flag for unit tests, to avoid file paths (which
+          * can differ from reference output)
+          */
          unit_test = true;
          break;
       default:
@@ -964,7 +982,9 @@ main(int argc, char **argv)
       printf("; Disassembling microcode: %s\n", file);
    printf("; Version: %08x\n\n", buf[1]);
 
-   if (gpuver < 6) {
+   if (raw) {
+      disasm_raw(buf, sz / 4);
+   } else if (gpuver < 6) {
       disasm_legacy(&buf[1], sz / 4 - 1);
    } else {
       struct emu emu = {