added -disasm-func to the qcvm

This commit is contained in:
Wolfgang Bumiller 2012-12-23 20:45:43 +01:00
parent ee7051c5a4
commit 890ca3c782
2 changed files with 36 additions and 8 deletions

View file

@ -32,6 +32,9 @@ Print information from the program's header instead of executing.
.B "-disasm"
Disassemble the program by function instead of executing.
.TP
.BI "-disasm-func" function
Search for and disassemble the given function.
.TP
.B "-printdefs"
List all entries from the program's defs-section. Effectively
listing all the global variables of the program.

41
exec.c
View file

@ -824,14 +824,15 @@ static void usage()
{
printf("usage: %s [options] [parameters] file\n", arg0);
printf("options:\n");
printf(" -h, --help print this message\n"
" -trace trace the execution\n"
" -profile perform profiling during execution\n"
" -info print information from the prog's header\n"
" -disasm disassemble and exit\n"
" -printdefs list the defs section\n"
" -printfields list the field section\n"
" -printfuns list functions information\n");
printf(" -h, --help print this message\n"
" -trace trace the execution\n"
" -profile perform profiling during execution\n"
" -info print information from the prog's header\n"
" -disasm disassemble and exit\n"
" -disasm-func func disassemble and exit\n"
" -printdefs list the defs section\n"
" -printfields list the field section\n"
" -printfuns list functions information\n");
printf("parameters:\n");
printf(" -vector <V> pass a vector parameter to main()\n"
" -float <f> pass a float parameter to main()\n"
@ -889,6 +890,7 @@ int main(int argc, char **argv)
bool opts_info = false;
bool noexec = false;
const char *progsfile = NULL;
const char **dis_list = NULL;
arg0 = argv[0];
@ -934,6 +936,18 @@ int main(int argc, char **argv)
opts_disasm = true;
noexec = true;
}
else if (!strcmp(argv[1], "-disasm-func")) {
--argc;
++argv;
if (argc <= 1) {
usage();
exit(1);
}
vec_push(dis_list, argv[1]);
--argc;
++argv;
noexec = true;
}
else if (!strcmp(argv[1], "-printdefs")) {
--argc;
++argv;
@ -1048,6 +1062,17 @@ int main(int argc, char **argv)
prog_delete(prog);
return 0;
}
for (i = 0; i < vec_size(dis_list); ++i) {
size_t k;
printf("Looking for `%s`\n", dis_list[i]);
for (k = 1; k < vec_size(prog->functions); ++k) {
const char *name = prog_getstring(prog, prog->functions[k].name);
if (!strcmp(name, dis_list[i])) {
prog_disasm_function(prog, k);
break;
}
}
}
if (opts_disasm) {
for (i = 1; i < vec_size(prog->functions); ++i)
prog_disasm_function(prog, i);