[gamecode] Show containing def and relative offset

No more guessing when accessing structure field members. Next is ivars,
I guess.
This commit is contained in:
Bill Currie 2020-03-15 02:51:29 +09:00
parent 3d62a7f253
commit 99f89840f9
2 changed files with 43 additions and 29 deletions

View file

@ -1649,7 +1649,7 @@ pr_lineno_t *PR_Find_Lineno (progs_t *pr, pr_uint_t addr) __attribute__((pure));
const char *PR_Get_Source_File (progs_t *pr, pr_lineno_t *lineno) __attribute__((pure)); const char *PR_Get_Source_File (progs_t *pr, pr_lineno_t *lineno) __attribute__((pure));
const char *PR_Get_Source_Line (progs_t *pr, pr_uint_t addr); const char *PR_Get_Source_Line (progs_t *pr, pr_uint_t addr);
pr_def_t *PR_Get_Param_Def (progs_t *pr, dfunction_t *func, unsigned parm) __attribute__((pure)); pr_def_t *PR_Get_Param_Def (progs_t *pr, dfunction_t *func, unsigned parm) __attribute__((pure));
pr_def_t *PR_Get_Local_Def (progs_t *pr, pointer_t offs) __attribute__((pure)); pr_def_t *PR_Get_Local_Def (progs_t *pr, pointer_t *offs) __attribute__((pure));
void PR_PrintStatement (progs_t *pr, dstatement_t *s, int contents); void PR_PrintStatement (progs_t *pr, dstatement_t *s, int contents);
void PR_DumpState (progs_t *pr); void PR_DumpState (progs_t *pr);
void PR_StackTrace (progs_t *pr); void PR_StackTrace (progs_t *pr);

View file

@ -763,12 +763,13 @@ get_type (prdeb_resources_t *res, int typeptr)
} }
pr_def_t * pr_def_t *
PR_Get_Local_Def (progs_t *pr, pointer_t offs) PR_Get_Local_Def (progs_t *pr, pointer_t *offset)
{ {
prdeb_resources_t *res = pr->pr_debug_resources; prdeb_resources_t *res = pr->pr_debug_resources;
pr_uint_t i;
dfunction_t *func; dfunction_t *func;
pr_auxfunction_t *aux_func; pr_auxfunction_t *aux_func;
pointer_t offs = *offset;
pr_def_t *def;
if (!pr->pr_xfunction) if (!pr->pr_xfunction)
return 0; return 0;
@ -781,10 +782,11 @@ PR_Get_Local_Def (progs_t *pr, pointer_t offs)
offs -= func->parm_start; offs -= func->parm_start;
if (offs >= func->locals) if (offs >= func->locals)
return 0; return 0;
for (i = 0; i < aux_func->num_locals; i++) if ((def = PR_SearchDefs (res->local_defs + aux_func->local_defs,
if (res->local_defs[aux_func->local_defs + i].ofs == offs) aux_func->num_locals, offs))) {
return &res->local_defs[aux_func->local_defs + i]; *offset = offs - def->ofs;
return 0; }
return def;
} }
VISIBLE void VISIBLE void
@ -886,20 +888,28 @@ value_string (pr_debug_data_t *data, qfot_type_t *type, pr_type_t *value)
} }
static pr_def_t * static pr_def_t *
pr_debug_find_def (progs_t *pr, pr_int_t ofs) pr_debug_find_def (progs_t *pr, pointer_t *ofs)
{ {
prdeb_resources_t *res = pr->pr_debug_resources; prdeb_resources_t *res = pr->pr_debug_resources;
pr_def_t *def = 0; pr_def_t *def = 0;
if (pr_debug->int_val && res->debug) if (*ofs >= pr->progs->numglobals) {
return 0;
}
if (pr_debug->int_val && res->debug) {
def = PR_Get_Local_Def (pr, ofs); def = PR_Get_Local_Def (pr, ofs);
if (!def) }
def = PR_GlobalAtOfs (pr, ofs); if (!def) {
def = PR_GlobalAtOfs (pr, *ofs);
if (def) {
*ofs -= def->ofs;
}
}
return def; return def;
} }
static const char * static const char *
global_string (pr_debug_data_t *data, pointer_t ofs, qfot_type_t *type, global_string (pr_debug_data_t *data, pointer_t offset, qfot_type_t *type,
int contents) int contents)
{ {
progs_t *pr = data->pr; progs_t *pr = data->pr;
@ -908,29 +918,34 @@ global_string (pr_debug_data_t *data, pointer_t ofs, qfot_type_t *type,
pr_def_t *def = NULL; pr_def_t *def = NULL;
qfot_type_t dummy_type = { }; qfot_type_t dummy_type = { };
const char *name = 0; const char *name = 0;
pointer_t offs = offset;
dstring_clearstr (dstr); dstring_clearstr (dstr);
if (type && type->meta == ty_basic && type->t.type == ev_short) { if (type && type->meta == ty_basic && type->t.type == ev_short) {
dsprintf (dstr, "%04x", (short) ofs); dsprintf (dstr, "%04x", (short) offset);
return dstr->str; return dstr->str;
} }
if (ofs > pr->globals_size) { if (offset > pr->globals_size) {
dsprintf (dstr, "%08x out of bounds", ofs); dsprintf (dstr, "%08x out of bounds", offset);
return dstr->str; return dstr->str;
} }
def = pr_debug_find_def (pr, ofs); def = pr_debug_find_def (pr, &offs);
if (!def || !PR_StringValid (pr, def->name) if (!def || !PR_StringValid (pr, def->name)
|| !*(name = PR_GetString (pr, def->name))) { || !*(name = PR_GetString (pr, def->name))) {
dsprintf (dstr, "[$%x]", ofs); dsprintf (dstr, "[$%x]", offset);
} }
if (name) { if (name) {
if (strequal (name, "IMMEDIATE") || strequal (name, ".imm")) { if (strequal (name, "IMMEDIATE") || strequal (name, ".imm")) {
contents = 1; contents = 1;
} else { } else {
dsprintf (dstr, "%s", name); if (offs) {
dsprintf (dstr, "{%s + %u}", name, offs);
} else {
dsprintf (dstr, "%s", name);
}
} }
} }
if (contents) { if (contents) {
@ -949,7 +964,7 @@ global_string (pr_debug_data_t *data, pointer_t ofs, qfot_type_t *type,
type = &res->void_type; type = &res->void_type;
} }
} }
value_string (data, type, pr->pr_globals + ofs); value_string (data, type, pr->pr_globals + offset);
if (name) { if (name) {
dstring_appendstr (dstr, ")"); dstring_appendstr (dstr, ")");
} }
@ -1084,21 +1099,20 @@ pr_debug_pointer_view (qfot_type_t *type, pr_type_t *value, void *_data)
{ {
__auto_type data = (pr_debug_data_t *) _data; __auto_type data = (pr_debug_data_t *) _data;
progs_t *pr = data->pr; progs_t *pr = data->pr;
prdeb_resources_t *res = pr->pr_debug_resources; //FIXME
dstring_t *dstr = data->dstr; dstring_t *dstr = data->dstr;
pointer_t ofs = value->integer_var; pointer_t offset = value->integer_var;
pointer_t offs = offset;
pr_def_t *def = 0; pr_def_t *def = 0;
if (pr_debug->int_val && res->debug) { def = pr_debug_find_def (pr, &offs);
def = PR_Get_Local_Def (pr, ofs);
}
if (!def) {
def = PR_GlobalAtOfs (pr, ofs);
}
if (def && def->name) { if (def && def->name) {
dasprintf (dstr, "&%s", PR_GetString (pr, def->name)); if (offs) {
dasprintf (dstr, "&%s + %u", PR_GetString (pr, def->name), offs);
} else {
dasprintf (dstr, "&%s", PR_GetString (pr, def->name));
}
} else { } else {
dasprintf (dstr, "[$%x]", ofs); dasprintf (dstr, "[$%x]", offset);
} }
} }