FreeCalypso > hg > freecalypso-reveng
changeset 150:df01a4f4c272
tiobjd disasm -g: dump of function locals implemented
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Tue, 29 Apr 2014 07:51:28 +0000 |
parents | fdf3137c703a |
children | 6fe08feee018 |
files | leo-obj/tool/disasm.c leo-obj/tool/richsym.c |
diffstat | 2 files changed, 82 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/leo-obj/tool/disasm.c Tue Apr 29 07:11:33 2014 +0000 +++ b/leo-obj/tool/disasm.c Tue Apr 29 07:51:28 2014 +0000 @@ -97,6 +97,8 @@ } if (sym->class == C_FCN && !strcmp(sym->name, ".bf")) { printf("; Begin function\n"); + if (disasm_richsym) + richsym_function_locals(sym); return; } switch (sym->class) {
--- a/leo-obj/tool/richsym.c Tue Apr 29 07:11:33 2014 +0000 +++ b/leo-obj/tool/richsym.c Tue Apr 29 07:51:28 2014 +0000 @@ -203,7 +203,19 @@ char *buf; int isund, len; - isund = (sym->name[0] == '_'); + switch (sym->name[0]) { + case '_': + isund = 1; + break; + case '$': + if ((sym->type & 0x30) == 0x20) + isund = 1; + else + isund = 0; + break; + default: + isund = 0; + } len = strlen(sym->name) + 1; if (isund) len--; @@ -396,3 +408,70 @@ } exit(0); } + +static int +localsym_sanity_check(sym) + struct internal_syment *sym; +{ + if (!sym->aux) { + printf("; symbol #%u of class %s has no aux record\n", + sym->number, storage_class_to_string(sym->class, 0)); + return(-1); + } + if (sym->scnum != -1) { + printf("; symbol #%u of class %s: section != ABS\n", + sym->number, storage_class_to_string(sym->class, 0)); + return(-1); + } + return(0); +} + +void +richsym_function_locals(headsym) + struct internal_syment *headsym; +{ + unsigned n; + struct internal_syment *sym; + char classbuf[8]; + + for (n = headsym->number + 1; n < nsymtab; n++) { + sym = symtab[n]; + if (!sym) + continue; + switch (sym->class) { + case C_REG: + case C_REGPARM: + if (localsym_sanity_check(sym) < 0) + continue; + if (sym->value > 0xF) { + printf( + "; symbol #%u of class %s: value is not a valid register number\n", + sym->number, + storage_class_to_string(sym->class, 0)); + continue; + } + printf("; %s r%u: ", + storage_class_to_string(sym->class, 0), + sym->value); + richsym_print_in_c("", sym, 0); + continue; + case C_ARG: + case C_AUTO: + if (localsym_sanity_check(sym) < 0) + continue; + printf("; %s at 0x%x: ", + storage_class_to_string(sym->class, 0), + sym->value); + richsym_print_in_c("", sym, 0); + continue; + case C_FCN: + return; + default: + printf( + "; presumed local symbol #%u: unexpected class %s\n", + sym->number, + storage_class_to_string(sym->class, classbuf)); + return; + } + } +}