mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-16 17:01:53 +00:00
[qfprogs] Create a stack for disassembly of locals
This prevents local variables getting intertwined with globals when disassembling.
This commit is contained in:
parent
d03637ede8
commit
3f93f6b226
2 changed files with 25 additions and 2 deletions
|
@ -79,7 +79,13 @@ disassemble_progs (progs_t *pr)
|
|||
|
||||
Sys_Printf ("%s:\n", PR_GetString (pr, desc->name));
|
||||
pr->pr_xfunction = &func;
|
||||
|
||||
if (pr->pr_depth) {
|
||||
//FIXME assumes 1 is frame
|
||||
//FIXME update when making locals have -ve addresses
|
||||
pr->pr_bases[1] = pr->pr_stack[0].stack_ptr - func.params_start;
|
||||
}
|
||||
}
|
||||
PR_PrintStatement (pr, &pr->pr_statements[i], 2 | (verbosity > 1));
|
||||
PR_PrintStatement (pr, &pr->pr_statements[i], 2 | (verbosity > 0));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -287,6 +287,7 @@ load_progs (const char *name)
|
|||
pr.progs_name = name;
|
||||
pr.max_edicts = 1;
|
||||
pr.zone_size = 0;
|
||||
pr.stack_size = 64*1024;
|
||||
PR_LoadProgsFile (&pr, file, size);
|
||||
Qclose (file);
|
||||
|
||||
|
@ -297,10 +298,26 @@ load_progs (const char *name)
|
|||
PR_LoadStrings (&pr);
|
||||
PR_LoadDebug (&pr);
|
||||
}
|
||||
pr_uint_t max_locals = 0;
|
||||
for (i = 0; i < pr.progs->functions.count; i++) {
|
||||
// don't bother with builtins
|
||||
if (pr.pr_functions[i].first_statement > 0)
|
||||
if (pr.pr_functions[i].first_statement > 0) {
|
||||
Hash_AddElement (func_tab, &pr.pr_functions[i]);
|
||||
if (pr.pr_functions[i].locals > max_locals) {
|
||||
max_locals = pr.pr_functions[i].locals;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pr.stack && pr.globals.stack) {
|
||||
printf ("stack: %x %x %x %d\n", (pr_uint_t)(pr.stack - pr.pr_globals),
|
||||
*pr.globals.stack, pr.stack_bottom, pr.stack_size);
|
||||
*pr.globals.stack -= max_locals;
|
||||
pr.pr_depth = 1;
|
||||
pr.pr_stack[0] = (prstack_t) {
|
||||
.stack_ptr = *pr.globals.stack,
|
||||
.return_ptr = pr.pr_return_buffer,
|
||||
};
|
||||
*pr.globals.stack -= max_locals;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue