xref: /plan9/sys/src/cmd/5i/symbols.c (revision f19e7b749ec99577072cd8e44030fe810f42c7ad)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <mach.h>
57dd7cddfSDavid du Colombier #include "arm.h"
67dd7cddfSDavid du Colombier 
77dd7cddfSDavid du Colombier #define	STRINGSZ	128
87dd7cddfSDavid du Colombier 
97dd7cddfSDavid du Colombier /*
107dd7cddfSDavid du Colombier  *	print the value of dot as file:line
117dd7cddfSDavid du Colombier  */
127dd7cddfSDavid du Colombier void
printsource(long dot)137dd7cddfSDavid du Colombier printsource(long dot)
147dd7cddfSDavid du Colombier {
157dd7cddfSDavid du Colombier 	char str[STRINGSZ];
167dd7cddfSDavid du Colombier 
177dd7cddfSDavid du Colombier 	if (fileline(str, STRINGSZ, dot))
187dd7cddfSDavid du Colombier 		Bprint(bioout, "%s", str);
197dd7cddfSDavid du Colombier }
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier void
printlocals(Symbol * fn,ulong fp)227dd7cddfSDavid du Colombier printlocals(Symbol *fn, ulong fp)
237dd7cddfSDavid du Colombier {
247dd7cddfSDavid du Colombier 	int i;
257dd7cddfSDavid du Colombier 	Symbol s;
267dd7cddfSDavid du Colombier 
277dd7cddfSDavid du Colombier 	s = *fn;
287dd7cddfSDavid du Colombier 	for (i = 0; localsym(&s, i); i++) {
297dd7cddfSDavid du Colombier 		if (s.class != CAUTO)
307dd7cddfSDavid du Colombier 			continue;
317dd7cddfSDavid du Colombier 		Bprint(bioout, "\t%s=#%lux\n", s.name, getmem_4(fp-s.value));
327dd7cddfSDavid du Colombier 	}
337dd7cddfSDavid du Colombier }
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier void
printparams(Symbol * fn,ulong fp)367dd7cddfSDavid du Colombier printparams(Symbol *fn, ulong fp)
377dd7cddfSDavid du Colombier {
387dd7cddfSDavid du Colombier 	int i;
397dd7cddfSDavid du Colombier 	Symbol s;
407dd7cddfSDavid du Colombier 	int first;
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier 	fp += mach->szreg;			/* skip saved pc */
437dd7cddfSDavid du Colombier 	s = *fn;
447dd7cddfSDavid du Colombier 	for (first = i = 0; localsym(&s, i); i++) {
457dd7cddfSDavid du Colombier 		if (s.class != CPARAM)
467dd7cddfSDavid du Colombier 			continue;
477dd7cddfSDavid du Colombier 		if (first++)
487dd7cddfSDavid du Colombier 			Bprint(bioout, ", ");
497dd7cddfSDavid du Colombier 		Bprint(bioout, "%s=#%lux", s.name, getmem_4(fp+s.value));
507dd7cddfSDavid du Colombier 	}
517dd7cddfSDavid du Colombier 	Bprint(bioout, ") ");
527dd7cddfSDavid du Colombier }
537dd7cddfSDavid du Colombier #define STARTSYM	"_main"
547dd7cddfSDavid du Colombier #define	FRAMENAME	".frame"
557dd7cddfSDavid du Colombier 
567dd7cddfSDavid du Colombier void
stktrace(int modif)577dd7cddfSDavid du Colombier stktrace(int modif)
587dd7cddfSDavid du Colombier {
597dd7cddfSDavid du Colombier 	ulong pc, sp;
607dd7cddfSDavid du Colombier 	Symbol s, f;
617dd7cddfSDavid du Colombier 	int i;
627dd7cddfSDavid du Colombier 	char buf[512];
637dd7cddfSDavid du Colombier 
647dd7cddfSDavid du Colombier 	pc = reg.r[15];
657dd7cddfSDavid du Colombier 	sp = reg.r[13];
667dd7cddfSDavid du Colombier 	i = 0;
677dd7cddfSDavid du Colombier 	while (findsym(pc, CTEXT, &s)) {
687dd7cddfSDavid du Colombier 		if(strcmp(STARTSYM, s.name) == 0) {
69*f19e7b74SDavid du Colombier 			Bprint(bioout, "%s() at #%llux\n", s.name, s.value);
707dd7cddfSDavid du Colombier 			break;
717dd7cddfSDavid du Colombier 		}
727dd7cddfSDavid du Colombier 		if (pc == s.value)	/* at first instruction */
737dd7cddfSDavid du Colombier 			f.value = 0;
747dd7cddfSDavid du Colombier 		else if (findlocal(&s, FRAMENAME, &f) == 0)
757dd7cddfSDavid du Colombier 			break;
767dd7cddfSDavid du Colombier 		if (s.type == 'L' || s.type == 'l' || pc <= s.value+4)
777dd7cddfSDavid du Colombier 			pc = reg.r[14];
787dd7cddfSDavid du Colombier 		else pc = getmem_4(sp);
797dd7cddfSDavid du Colombier 		sp += f.value;
807dd7cddfSDavid du Colombier 		Bprint(bioout, "%s(", s.name);
817dd7cddfSDavid du Colombier 		printparams(&s, sp);
827dd7cddfSDavid du Colombier 		printsource(s.value);
837dd7cddfSDavid du Colombier 		Bprint(bioout, " called from ");
847dd7cddfSDavid du Colombier 		symoff(buf, sizeof(buf), pc-8, CTEXT);
857dd7cddfSDavid du Colombier 		Bprint(bioout, buf);
867dd7cddfSDavid du Colombier 		printsource(pc-8);
877dd7cddfSDavid du Colombier 		Bprint(bioout, "\n");
887dd7cddfSDavid du Colombier 		if(modif == 'C')
897dd7cddfSDavid du Colombier 			printlocals(&s, sp);
907dd7cddfSDavid du Colombier 		if(++i > 40){
917dd7cddfSDavid du Colombier 			Bprint(bioout, "(trace truncated)\n");
927dd7cddfSDavid du Colombier 			break;
937dd7cddfSDavid du Colombier 		}
947dd7cddfSDavid du Colombier 	}
957dd7cddfSDavid du Colombier }
96