hschumann2/TempleOS-Source-Code
0847
1 2#help_index "Debugging/Dump"3Bool ClassRep2(CDoc *doc,U8 *_d,U8 *class_name=lastclass,4 I64 depth,I64 max_depth,Bool dynamic,I64 types=HTT_CLASS,I64 offset=0)5{//See ::/Demo/LastClass.HC.6 I64 i,j,stars,*ptr;7 CMemberLst *ml;8 CDocEntry *doc_e;9 Bool unlock;10 CHashClass *tmpc,*tmpc2;11 if (depth>=max_depth) return TRUE;12 if (!(tmpc=HashFind(class_name,Fs->hash_table,types))) {13 DocPrint(doc,"Class Not Found.\n");14 return FALSE;15 }16 if (!ChkPtr(_d) || !ChkPtr(_d(U8 *)+tmpc->size)) {17 DocPrint(doc,"Bad Ptr:%016X\n",_d);18 return FALSE;19 }20 if (tmpc->base_class && !ClassRep2(doc,_d,tmpc->base_class->str,21 depth,max_depth,dynamic,types,offset))22 return FALSE;23 unlock=DocLock(doc);24 DocPrint(doc,"Class:\"%s\"\n",class_name);25 ml=tmpc->member_lst_and_root;26 while (ml) {27 tmpc2=ml->member_class;28 ptr=_d(U8 *)+ml->offset;29 DocPrint(doc,"%08X ",ptr(U8 *)+offset);30 stars=tmpc2->ptr_stars_cnt;31 tmpc2=OptClassFwd(tmpc2);32 tmpc2-=tmpc2->ptr_stars_cnt;33 if (tmpc2->type & HTT_INTERNAL_TYPE) {34 DocPrint(doc,"$GREEN$%-20ts:$FG$",ml->str);35 if (stars==1 && (tmpc2->raw_type==RT_I8 || tmpc2->raw_type==RT_U8)) {36 ptr=*ptr;37 if (ChkPtr(ptr)) {38 if (dynamic) {39 doc_e=DocPrint(doc,"$DA-TRM-P+RD,LEN=64,A=\"%%40ts\"$\n");40 doc_e->data=ptr;41 DocDataFmt(doc,doc_e);42 } else43 DocPrint(doc,"%40ts\n",ptr);44 }45 } else if (!stars) {46 j=MinI64(ml->dim.total_cnt,32);47 if (tmpc2->raw_type==RT_I8 || tmpc2->raw_type==RT_U8) {48 if (j==1) {49 if (dynamic) {50 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=U8,A=\"%%c\"$\n");51 doc_e->data=ptr;52 } else53 DocPrint(doc,"%c\n",*ptr(U8 *));54 } else {55 if (dynamic) {56 doc_e=DocPrint(doc,"$DA-TRM-P+RD,LEN=64,A=\"%%40ts\"$\n");57 doc_e->data=ptr;58 DocDataFmt(doc,doc_e);59 } else60 DocPrint(doc,"%40ts\n",ptr);61 }62 }63 for (i=0;i<j;i++) {64 switch (tmpc2->raw_type) {65 case RT_I0:66 case RT_U0:67 break;68 case RT_I8:69 if (dynamic) {70 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=I8,A=\"%%02X\"$ ");71 doc_e->data=ptr(I8 *)++;72 } else73 DocPrint(doc,"%02X ",*ptr(I8 *)++);74 break;75 case RT_U8:76 if (dynamic) {77 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=U8,A=\"%%02X\"$ ");78 doc_e->data=ptr(U8 *)++;79 } else80 DocPrint(doc,"%02X ",*ptr(U8 *)++);81 break;82 case RT_I16:83 if (dynamic) {84 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=I16,A=\"%%04X\"$ ");85 doc_e->data=ptr(I16 *)++;86 } else87 DocPrint(doc,"%04X ",*ptr(I16 *)++);88 break;89 case RT_U16:90 if (dynamic) {91 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=U16,A=\"%%04X\"$ ");92 doc_e->data=ptr(U16 *)++;93 } else94 DocPrint(doc,"%04X ",*ptr(U16 *)++);95 break;96 case RT_I32:97 if (dynamic) {98 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=I32,A=\"%%08X\"$ ");99 doc_e->data=ptr(I32 *)++;100 } else101 DocPrint(doc,"%08X ",*ptr(I32 *)++);102 break;103 case RT_U32:104 if (dynamic) {105 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=U32,A=\"%%08X\"$ ");106 doc_e->data=ptr(U32 *)++;107 } else108 DocPrint(doc,"%08X ",*ptr(U32 *)++);109 break;110 case RT_U64:111 if (dynamic) {112 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=U64,A=\"%%08X\"$ ");113 doc_e->data=ptr(U64 *)++;114 } else115 DocPrint(doc,"%08X ",*ptr(U64 *)++);116 break;117 case RT_F64:118 if (dynamic) {119 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,RT=F64,A=\"%%16g\"$ ");120 doc_e->data=ptr(F64 *)++;121 } else122 DocPrint(doc,"%16g ",*ptr(I64 *)++);123 break;124 default:125 if (dynamic) {126 doc_e=DocPrint(doc,"$DA-TRM+RD+UD,A=\"%%016X\"$ ");127 doc_e->data=ptr(I64 *)++;128 } else129 DocPrint(doc,"%016X ",*ptr(I64 *)++);130 }131 if (dynamic)132 DocDataFmt(doc,doc_e);133 }134 if (j<ml->dim.total_cnt)135 DocPrint(doc,"...");136 } else137 DocPrint(doc,"%016X",*ptr);138 DocPrint(doc,"\n");139 } else {140 if (depth<2) {141 if (stars==1 && !ChkPtr(*ptr))142 DocPrint(doc,"%-20ts:%016X\n",ml->str,*ptr);143 else {144 DocPrint(doc,"$TR,\"%s\"$\n",ml->str);145 DocPrint(doc,"$ID,2$");146 if (!stars)147 ClassRep2(doc,ptr,tmpc2->str,depth+1,max_depth,dynamic);148 else if (stars==1)149 ClassRep2(doc,*ptr,tmpc2->str,depth+1,max_depth,dynamic);150 DocPrint(doc,"$ID,-2$");151 }152 } else153 DocPrint(doc,"%-20ts\n",ml->str);154 }155 ml=ml->next;156 }157 if (unlock)158 DocUnlock(doc);159 return TRUE;160}161 162public U0 ClassRep(U8 *_d,U8 *class_name=lastclass,163 I64 max_depth=2,Bool fun=FALSE,I64 offset=0)164{//Displays members of a record by using the compiler's info.165 CDoc *doc;166 if (IsRaw)167 doc=DocNew;168 else {169 DocMax;170 doc=DocPut;171 }172 if (fun)173 ClassRep2(doc,_d,class_name,0,max_depth,FALSE,HTT_FUN,offset);174 else175 ClassRep2(doc,_d,class_name,0,max_depth,FALSE,HTT_CLASS,offset);176 DocPrint(doc,"\n");177 DocRecalc(doc);178 if (IsRaw) {179 DocDump(doc,100000);180 DocDel(doc);181 }182}183 184public U0 ClassRepD(U8 *_d,U8 *class_name=lastclass,185 I64 max_depth=2,Bool fun=FALSE,I64 offset=0)186{//Dynamic ClassRep. Uses hex_ed widgit for live changes.187 CDoc *doc;188 if (IsRaw)189 doc=DocNew;190 else {191 DocMax;192 doc=DocPut;193 }194 if (fun)195 ClassRep2(doc,_d,class_name,0,max_depth,TRUE,HTT_FUN,offset);196 else197 ClassRep2(doc,_d,class_name,0,max_depth,TRUE,HTT_CLASS,offset);198 DocPrint(doc,"\n");199 DocRecalc(doc);200 if (IsRaw) {201 DocDump(doc,100000);202 DocDel(doc);203 }204}205 206U0 UpdateRegVarImg(CHashFun *tmpf,U8 *_b,CTask *task)207{208 CMemberLst *ml;209 CHashClass *tmpc;210 ml=tmpf->member_lst_and_root;211 while (ml) {212 if (ml->reg!=REG_NONE) {213 tmpc=OptClassFwd(ml->member_class);214 MemCpy(_b+ml->offset,TaskRegAddr(task,ml->reg),tmpc->size);215 }216 ml=ml->next;217 }218}219 220public U0 FunRep(U8 *st,U8 *rbp=NULL,I64 max_depth=2,CTask *task=NULL)221{//Shows names and vals of a fun's local vars using compiler's info.222 I64 size;223 U8 *img;224 CHashFun *tmpf=HashFind(st,Fs->hash_table,HTT_FUN);225 CMemberLst *tmpm;226 if (tmpf) {227 if (rbp) {228 if (task) {229//tmpf->size is negative. It's the bottom230 //of the fun local var space relative to RBP .231 size=tmpf->arg_cnt*8-tmpf->size+16;232 233 img=MAlloc(size);234 MemCpy(img,rbp+tmpf->size,size);235 UpdateRegVarImg(tmpf,img-tmpf->size,task);236 ClassRep(img-tmpf->size,st,max_depth,TRUE,rbp-img+tmpf->size);237 Free(img);238 } else239 ClassRep(rbp,st,max_depth,TRUE);240 } else {241 tmpm=tmpf->member_lst_and_root;242 while (tmpm) {243 if (0<=tmpm->reg<REG_REGS_NUM)244 "%08Z %s\n",tmpm->reg,"ST_U64_REGS",tmpm->str;245 else246 "%08tX %s\n",tmpm->offset,tmpm->str;247 tmpm=tmpm->next;248 }249 "%08tX Stk Size\n",tmpf->size;250 }251 }252}253 254#help_index "Debugging/Unassemble"255public U0 Uf(U8 *st)256{//Unassembles a named fun257 I64 i;258 CHashSrcSym *tmpf;259 CDbgInfo *dbg_info;260 if (tmpf=HashFind(st,Fs->hash_table,HTT_FUN|HTT_EXPORT_SYS_SYM)) {261 if (tmpf->type&HTT_FUN)262 FunRep(st);263 if (dbg_info=tmpf->dbg_info) {264 i=dbg_info->body[dbg_info->max_line+1-dbg_info->min_line]265 -dbg_info->body[0];266 Un(dbg_info->body[0],i);267 "Code Size:%04X\n",i;268 } else269 U(HashVal(tmpf));270 }271}272 