]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
dump jump tables
authorAleksey Demakov <ademakov@gmail.com>
Mon, 28 Aug 2006 19:52:48 +0000 (19:52 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Mon, 28 Aug 2006 19:52:48 +0000 (19:52 +0000)
ChangeLog
include/jit/jit-opcode.h
jit/jit-dump.c
jit/jit-opcode.c

index 1ed6549ee33bb6d8e2325cadda467ef14592c92c..b444d69c44145484d98c4f1de436e3e333a5b60e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-08-29  Aleksey Demakov  <ademakov@gmail.com>
+
+       * include/jit/jit-opcode.h:
+       * jit/jit-opcode.c: add JIT_OPCODE_IS_JUMP_TABLE flag to mark the
+       JIT_OP_JUMP_TABLE opcode.
+
+       * jit/jit-dump.c (jit_dump_insn, dump_interp_code): add jump table
+       dumping.
 
 2006-08-28  Klaus Treichel  <ktreichel@web.de>
 
index 7006eadec45108a078941ae80d8b5469d604b4d2..3bc2226e07c746e93847826f1b9366a582c3c109 100644 (file)
@@ -568,6 +568,7 @@ struct jit_opcode_info
 #define        JIT_OPCODE_IS_CALL_EXTERNAL             0x00004000
 #define        JIT_OPCODE_IS_REG                               0x00008000
 #define        JIT_OPCODE_IS_ADDROF_LABEL              0x00010000
+#define JIT_OPCODE_IS_JUMP_TABLE               0x00020000
 #define        JIT_OPCODE_OPER_MASK                    0x01F00000
 #define        JIT_OPCODE_OPER_NONE                    0x00000000
 #define        JIT_OPCODE_OPER_ADD                             0x00100000
index 439e60ff12e626d9e2954825da129c3bc65b107c..5c3d7b51ba3ddfc94bf5814daa356e1ce1c572bf 100644 (file)
@@ -419,6 +419,22 @@ void jit_dump_insn(FILE *stream, jit_function_t func, jit_insn_t insn)
                                (long)(jit_insn_get_label(insn)));
                return;
        }
+       else if((flags & JIT_OPCODE_IS_JUMP_TABLE) != 0)
+       {
+               jit_label_t *labels;
+               jit_nint num_labels, label;
+               labels = (jit_label_t *)jit_value_get_nint_constant(jit_insn_get_value1(insn));
+               num_labels = jit_value_get_nint_constant(jit_insn_get_value2(insn));
+               fprintf(stream, "jump_table ");
+               dump_value(stream, func, jit_insn_get_dest(insn), flags & JIT_OPCODE_DEST_MASK);
+               printf(" : {");
+               for(label = 0; label < num_labels; label++)
+               {
+                       printf(" .L%ld", (long) labels[label]);
+               }
+               printf(" }");
+               return;
+       }
 
        /* Output the destination information */
        if((flags & JIT_OPCODE_DEST_MASK) != JIT_OPCODE_DEST_EMPTY &&
@@ -629,6 +645,17 @@ static void dump_interp_code(FILE *stream, void **pc, void **end)
                                                        (long)(jit_nint)(pc[1]), (long)(jit_nint)(pc[2]));
                                        pc += 3;
                                }
+                               else if((info->flags & JIT_OPCODE_IS_JUMP_TABLE) != 0)
+                               {
+                                       jit_nint label, num_labels;
+                                       num_labels = (jit_nint)pc[0];
+                                       for(label = 1; label <= num_labels; label++)
+                                       {
+                                               fprintf(stream, " %lX",
+                                                       (long)(jit_nint)pc[label]);
+                                       }
+                                       pc += 1 + num_labels;
+                               }
                        }
                        break;
                }
index adacfaa4f87fdb3acb5baa048ae2c19ba9f9ecaf..a80c5ccc51668980df07577ea000047231504d6c 100644 (file)
@@ -539,7 +539,7 @@ jit_opcode_info_t const jit_opcodes[JIT_OP_NUM_OPCODES] = {
        /*
         * Switch statement support.
         */
-       {"jump_table",                                  F_(PTR, PTR, INT)},
+       {"jump_table",                          F_(ANY, PTR, INT)|JIT_OPCODE_IS_JUMP_TABLE},
 };
 
 #if defined(JIT_BACKEND_INTERP)