X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=exec.c;h=8df96f01145007c37dc4ca4d9bc23c1bcab1109d;hb=359ba5f728af7498fb7c6952edd75ef62534bd8f;hp=dc5980dc4e27cde690c81c58e92a1bb2032124dc;hpb=ee7051c5a471dbf201eea6ab7444c71894403a51;p=xonotic%2Fgmqcc.git diff --git a/exec.c b/exec.c index dc5980d..8df96f0 100644 --- a/exec.c +++ b/exec.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Wolfgang Bumiller * Dale Weiler * @@ -359,7 +359,7 @@ static void trace_print_global(qc_program *prog, unsigned int glob, int vtype) done: if (len < (int)sizeof(spaces)-1) { spaces[sizeof(spaces)-1-len] = 0; - printf(spaces); + file_puts(stdout, spaces); spaces[sizeof(spaces)-1-len] = ' '; } } @@ -475,7 +475,8 @@ static qcint prog_enterfunction(qc_program *prog, prog_section_function *func) st.function = func; if (prog->xflags & VMXF_TRACE) { - vec_push(prog->function_stack, prog_getstring(prog, func->name)); + const char *str = prog_getstring(prog, func->name); + vec_push(prog->function_stack, str); } #ifdef QCVM_BACKUP_STRATEGY_CALLER_VARS @@ -824,14 +825,17 @@ 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" + " -v be verbose\n" + " -vv be even more verbose\n"); printf("parameters:\n"); printf(" -vector pass a vector parameter to main()\n" " -float pass a float parameter to main()\n" @@ -889,6 +893,8 @@ int main(int argc, char **argv) bool opts_info = false; bool noexec = false; const char *progsfile = NULL; + const char **dis_list = NULL; + int opts_v = 0; arg0 = argv[0]; @@ -905,8 +911,25 @@ int main(int argc, char **argv) usage(); exit(0); } - else if (!strcmp(argv[1], "-v") || - !strcmp(argv[1], "-version") || + else if (!strcmp(argv[1], "-v")) { + ++opts_v; + --argc; + ++argv; + } + else if (!strncmp(argv[1], "-vv", 3)) { + const char *av = argv[1]+1; + for (; *av; ++av) { + if (*av == 'v') + ++opts_v; + else { + usage(); + exit(1); + } + } + --argc; + ++argv; + } + else if (!strcmp(argv[1], "-version") || !strcmp(argv[1], "--version")) { version(); @@ -934,6 +957,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 +1083,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); @@ -1080,9 +1126,32 @@ int main(int argc, char **argv) for (a = 0; a < prog->functions[i].nargs; ++a) { printf(" %i", prog->functions[i].argsize[a]); } - printf(") locals: %i + %i\n", - prog->functions[i].firstlocal, - prog->functions[i].locals); + if (opts_v > 1) { + int32_t start = prog->functions[i].entry; + if (start < 0) + printf(") builtin %i\n", (int)-start); + else { + size_t funsize = 0; + prog_section_statement *st = prog->code + start; + for (;st->opcode != INSTR_DONE; ++st) + ++funsize; + printf(") - %lu instructions", (unsigned long)funsize); + if (opts_v > 2) { + printf(" - locals: %i + %i\n", + prog->functions[i].firstlocal, + prog->functions[i].locals); + } + else + printf("\n"); + } + } + else if (opts_v) { + printf(") locals: %i + %i\n", + prog->functions[i].firstlocal, + prog->functions[i].locals); + } + else + printf(")\n"); } } if (!noexec) {