aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2023-10-22 18:04:13 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2023-10-22 18:07:41 +0100
commit36bcd90c81f7dc0d7ab268a30768c80ff53eb93d (patch)
tree62b68065c74ff06fd7391c5e54840e7426a93d47
parent936971c1a3abe4bd5f197bad65dc8330fb4a22dc (diff)
downloadovm-36bcd90c81f7dc0d7ab268a30768c80ff53eb93d.tar.gz
ovm-36bcd90c81f7dc0d7ab268a30768c80ff53eb93d.tar.bz2
ovm-36bcd90c81f7dc0d7ab268a30768c80ff53eb93d.zip
When VEROBSE flag is set greater than 0, print traces in vm_execute_all
For each cycle, print the cycle and any changes. We track changes on the stack by remembering the previous stack pointer. For registers, I remember the previous array of registers and do a byte level compare of the current registers and the remembered ones. Produces pretty log messages and an easy way to track execution.
-rw-r--r--src/runtime.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/runtime.c b/src/runtime.c
index 77af177..77ad109 100644
--- a/src/runtime.c
+++ b/src/runtime.c
@@ -114,8 +114,52 @@ void vm_execute(vm_t *vm)
void vm_execute_all(vm_t *vm)
{
struct Program *program = &vm->program;
+#if VERBOSE == 1
+ struct Registers prev_registers = vm->registers;
+ size_t cycles = 0;
+ size_t prev_sptr = 0;
+#endif
while (program->instructions[program->ptr].opcode != OP_HALT)
+ {
+#if VERBOSE >= 1
+ fprintf(stdout, "[vm_execute_all]: Trace(Cycle %lu)\n", cycles);
+ fputs(
+ "----------------------------------------------------------------------"
+ "----------\n",
+ stdout);
+ vm_print_program(vm, stdout);
+ fputs(
+ "----------------------------------------------------------------------"
+ "----------\n",
+ stdout);
+ if (memcmp(prev_registers.reg, vm->registers.reg,
+ ARR_SIZE(vm->registers.reg)) != 0)
+ {
+ vm_print_registers(vm, stdout);
+ prev_registers = vm->registers;
+ fputs("------------------------------------------------------------------"
+ "----"
+ "----------\n",
+ stdout);
+ }
+ if (prev_sptr != vm->stack.ptr)
+ {
+ vm_print_stack(vm, stdout);
+ prev_sptr = vm->stack.ptr;
+ fputs("------------------------------------------------------------------"
+ "----"
+ "----------\n",
+ stdout);
+ }
+ ++cycles;
+#endif
vm_execute(vm);
+ }
+
+#if VERBOSE >= 1
+ fprintf(stdout, "[vm_execute_all]: Final VM state(Cycle %lu)\n", cycles);
+ vm_print_all(vm, stdout);
+#endif
}
void vm_load_stack(vm_t *vm, byte *bytes, size_t size)