Mercurial > repos > blastem
comparison debug.h @ 2362:b6c5a0fa3dfc
Refactor debugger a bit. Allow types other than integers to be passed in expressions and stored in arrays. Better namespace support
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 06 Nov 2023 22:41:33 -0800 |
parents | 3350b3c8faa8 |
children | b865f33fd47e |
comparison
equal
deleted
inserted
replaced
2361:3350b3c8faa8 | 2362:b6c5a0fa3dfc |
---|---|
37 EXPR_NONE, | 37 EXPR_NONE, |
38 EXPR_SCALAR, | 38 EXPR_SCALAR, |
39 EXPR_UNARY, | 39 EXPR_UNARY, |
40 EXPR_BINARY, | 40 EXPR_BINARY, |
41 EXPR_SIZE, | 41 EXPR_SIZE, |
42 EXPR_MEM | 42 EXPR_MEM, |
43 EXPR_NAMESPACE | |
43 } expr_type; | 44 } expr_type; |
44 | 45 |
45 typedef struct expr expr; | 46 typedef struct expr expr; |
46 | 47 |
47 struct expr { | 48 struct expr { |
49 expr *left; | 50 expr *left; |
50 expr *right; | 51 expr *right; |
51 token op; | 52 token op; |
52 }; | 53 }; |
53 | 54 |
55 enum { | |
56 DBG_VAL_U32, | |
57 DBG_VAL_F32, | |
58 DBG_VAL_ARRAY, | |
59 DBG_VAL_STRING, | |
60 DBG_VAL_FUNC | |
61 }; | |
62 | |
54 typedef struct { | 63 typedef struct { |
55 char *raw; | 64 union { |
56 expr *parsed; | 65 uint32_t u32; |
57 uint32_t value; | 66 float f32; |
67 } v; | |
68 uint32_t type; | |
69 } debug_val; | |
70 | |
71 typedef struct { | |
72 char *raw; | |
73 expr *parsed; | |
74 debug_val value; | |
58 } command_arg; | 75 } command_arg; |
59 | 76 |
60 typedef struct debug_root debug_root; | 77 typedef struct debug_root debug_root; |
61 typedef struct parsed_command parsed_command; | 78 typedef struct parsed_command parsed_command; |
62 typedef uint8_t (*cmd_fun)(debug_root *root, parsed_command *cmd); | 79 typedef uint8_t (*cmd_fun)(debug_root *root, parsed_command *cmd); |
115 uint32_t mask; | 132 uint32_t mask; |
116 uint8_t type; | 133 uint8_t type; |
117 } bp_def; | 134 } bp_def; |
118 | 135 |
119 typedef struct debug_array debug_array; | 136 typedef struct debug_array debug_array; |
120 typedef uint32_t (*debug_array_get)(debug_root *root, debug_array *array, uint32_t index); | 137 typedef debug_val (*debug_array_get)(debug_array *array, uint32_t index); |
121 typedef void (*debug_array_set)(debug_root *root, debug_array *array, uint32_t index, uint32_t value); | 138 typedef void (*debug_array_set)(debug_array *array, uint32_t index, debug_val value); |
122 typedef void (*debug_array_append)(debug_root *root, debug_array *array, uint32_t value); | 139 typedef void (*debug_array_append)(debug_array *array, debug_val value); |
123 | 140 |
124 struct debug_array{ | 141 struct debug_array{ |
125 debug_array_get get; | 142 debug_array_get get; |
126 debug_array_set set; | 143 debug_array_set set; |
127 debug_array_append append; | 144 debug_array_append append; |
128 uint32_t *data; | 145 void *base; |
129 uint32_t size; | 146 uint32_t size; |
130 uint32_t storage; | 147 uint32_t storage; |
131 }; | 148 }; |
132 | 149 |
133 typedef uint8_t (*resolver)(debug_root *root, const char *name, uint32_t *out); | 150 typedef struct debug_var debug_var; |
134 typedef debug_array* (*array_resolver)(debug_root *root, const char *name); | 151 typedef debug_val (*debug_var_get)(debug_var *var); |
135 typedef uint8_t (*setter)(debug_root *root, const char *name, uint32_t value); | 152 typedef void (*debug_var_set)(debug_var *var, debug_val val); |
153 | |
154 struct debug_var { | |
155 debug_var_get get; | |
156 debug_var_set set; | |
157 void *ptr; | |
158 debug_val val; | |
159 }; | |
160 | |
161 typedef debug_var *(*resolver)(debug_root *root, const char *name); | |
136 typedef uint8_t (*reader)(debug_root *root, uint32_t *out, char size); | 162 typedef uint8_t (*reader)(debug_root *root, uint32_t *out, char size); |
137 typedef uint8_t (*writer)(debug_root *root, uint32_t address, uint32_t value, char size); | 163 typedef uint8_t (*writer)(debug_root *root, uint32_t address, uint32_t value, char size); |
138 | 164 |
139 struct debug_root { | 165 struct debug_root { |
140 void *cpu_context; | 166 void *cpu_context; |
141 bp_def *breakpoints; | 167 bp_def *breakpoints; |
142 disp_def *displays; | 168 disp_def *displays; |
143 tern_node *commands; | 169 tern_node *commands; |
170 tern_node *variables; | |
144 tern_node *symbols; | 171 tern_node *symbols; |
145 tern_node *variables; | 172 tern_node *other_roots; |
146 tern_node *arrays; | |
147 disasm_context *disasm; | 173 disasm_context *disasm; |
148 resolver resolve; | |
149 array_resolver array_resolve; | |
150 reader read_mem; | 174 reader read_mem; |
151 setter set; | |
152 writer write_mem; | 175 writer write_mem; |
153 parsed_command last_cmd; | 176 parsed_command last_cmd; |
154 uint32_t bp_index; | 177 uint32_t bp_index; |
155 uint32_t disp_index; | 178 uint32_t disp_index; |
156 uint32_t branch_t; | 179 uint32_t branch_t; |