Commit Diff


commit - d9c2aa3a3366b60d5054c575801692579162a47f
commit + 7284df18a883c64721720276dac4f4540440e74c
blob - 252ece8ee490a83e07c847baba33db18201c6482
blob + bc04560173d90d4e72d0e419d39fec332064b8bd
--- acid/386
+++ acid/386
@@ -173,7 +173,7 @@ linkdebug()
 }
 
 defn
-acidmap()
+dynamicmap()
 {
 	if systype == "linux" then {
 		local r, m, n;
@@ -192,19 +192,13 @@ acidmap()
 			}
 		}
 	}
+}
 
-	local syms;
-	local l;
-
-	l = textfile();
-	if l != {} then {
-		syms = "acidtypes";
-		while l != {} do {
-			syms = syms + " " + ((head l)[0]);
-			l = tail l;
-		}
-		includepipe(syms);
-	}
+defn
+acidmap()
+{
+	dynamicmap();
+	acidtypes();
 }
 
 print(acidfile);
blob - d0d9107d0e6892b5f58f51bcfc4f1d5505c942cf
blob + 1e49453034933cbf91e788d0b7a0f39eccfe77c9
--- acid/port
+++ acid/port
@@ -33,10 +33,10 @@ notelstk(addr)
 	_stk({"PC", pc, "SP", sp, linkreg(addr)}, 1);
 }
 
-defn labstk(l)				// trace from a label
-{
-	_stk({"PC", *(l+4), "SP", *l, linkreg(0)}, 0);
-}
+// defn labstk(l)				// trace from a label
+// {
+// 	_stk({"PC", *(l+4), "SP", *l, linkreg(0)}, 0);
+// }
 
 defn params(param)
 {
@@ -64,8 +64,11 @@ defn locals(l)
 	}	
 }
 
-defn _stkign(file)
+defn _stkign(frame)
 {
+	local file;
+
+	file = pcfile(frame[0]);
 	s = stkignore;
 	while s do {
 		if regexp(head s, file) then
@@ -85,7 +88,7 @@ defn _stk(regs, dolocals)
 
 	stk = strace(regs);
 	if stkignore then {
-		while stk && tail stk && _stkign((head tail stk)[1]) do
+		while stk && tail stk && _stkign(head tail stk) do
 			stk = tail stk;
 	}
 
@@ -595,5 +598,21 @@ defn spsrch(len)
 	}
 }
 
+defn acidtypes()
+{
+	local syms;
+	local l;
+
+	l = textfile();
+	if l != {} then {
+		syms = "acidtypes";
+		while l != {} do {
+			syms = syms + " " + ((head l)[0]);
+			l = tail l;
+		}
+		includepipe(syms);
+	}
+}
+
 progargs="";
 print(acidfile);
blob - ac4cce8a9b3d3d9f20332de40c98eed5e2f058c5
blob + 1bc723caa6421abb755abeeb7bf6faf46686f19a
--- acid/thread
+++ acid/thread
@@ -1,24 +1,29 @@
 
 defn labpc(l)
 {
-	if objtype == "386" then
-		return longjmp;
-	return *(l+4);
+	complex Label l;
+
+	return l.pc;
 }
 
-defn labsp(l)
+defn label(l)
 {
-	return *l;
+	complex Label l;
+
+	if objtype == "386" then
+		return {"PC", l.pc, "BX", l.bx, "SP", l.sp, "BP", l.bp, "SI", l.si, "DI", l.di};
+	return {};
 }
 
+
 defn labstk(l)
 {
-	_stk(labpc(l), labsp(l), 0, 0);
+	_stk(label(l), 0);
 }
 
 defn lablstk(l)
 {
-	_stk(labpc(l), labsp(l), 0, 1);
+	_stk(label(l), 1);
 }
 
 defn altfmt(A){
@@ -57,8 +62,8 @@ defn alt(A){
 }
 
 threadignsrc = {
-	"^/sys/src/libc",
-	"^/sys/src/libthread",
+	"plan9/src/libc",
+	"plan9/src/libthread",
 };
 
 defn fnname(a){
@@ -81,32 +86,24 @@ defn stkignore(s){
 }
 
 defn threadstkline(T){
-	local stk, frame, pc, pc0, file, lastpc0, s, sym, i, stop;
+	local stk, frame, pc, pc0, file, s, sym, i, stop;
 
-	if T.state == Running then{
-		pc = *PC;
-		stk = strace(*PC, *SP, linkreg(0));
-	}else{
-		pc = labpc(T.sched);
-		stk = strace(labpc(T.sched), labsp(T.sched), 0);
-	}
-	lastpc0 = 0;
-	pc0 = 0;
+	if T.state == Running then
+		stk = strace({});
+	else
+		stk = strace(label(T.sched));
+
 	stop = 0;
 	while stk && !stop do {
+		frame = head stk;
+		stk = tail stk;
+		pc = frame[2];
+		pc0 = frame[0];
 		file = pcfile(pc);
-		if !regexp("^/sys/src/libc/", file)
-		&& !regexp("^/sys/src/libthread/", file) 
+		if !regexp("plan9/src/libc/", file)
+		&& !regexp("plan9/src/libthread/", file) 
 		&& match(file, stkignore)==-1 then
 			stop = 1;
-		else{
-			lastpc0 = pc0;
-			frame = head stk;
-			stk = tail stk;
-			nextframe = head stk;
-			pc = frame[1];
-			pc0 = nextframe[0];
-		}
 	}
 	file = pcfile(pc);
 	s = file+":"+itoa(pcline(pc), "%d");
@@ -165,7 +162,7 @@ defn pthreads(P){
 	while T != 0 do{
 		print("\t");
 		thread(T);
-		T = T.nextt;
+		T = (Thread)T.nextt;
 	}
 	setproc(mainpid);
 }
@@ -173,6 +170,7 @@ defn pthreads(P){
 defn threads(){
 	local P;
 
+	complex Pqueue _threadpq;
 	P = (Proc)_threadpq.$head;
 	while P != 0 do{
 		if P != (Proc)_threadpq.$head then print("\n");
@@ -184,6 +182,7 @@ defn threads(){
 defn stacks(){
 	local P, mainpid;
 
+	stkprefix = "";
 	mainpid = pid;
 	P = (Proc)_threadpq.$head;
 	while P != 0 do{
@@ -195,7 +194,7 @@ defn stacks(){
 	//	}
 	//	print("threadstks(", P\X, ")\n");
 		threadstks(P);
-		P = P.next;
+		P = (Proc)P.next;
 		print("\n");
 	}
 	setproc(mainpid);
@@ -219,7 +218,7 @@ defn stacksizes(){
 			}
 			sp = *(T.sched);
 			print(top-sp\D, "\n");
-			T = T.nextt;
+			T = (Thread)T.nextt;
 		}
 		P = P.next;
 	}
@@ -240,8 +239,8 @@ defn threadstks(P){
 	stkprefix = pref+"\t\t";
 	ign = stkignore;
 	stkignore = {
-		"^/sys/src/libthread/",
-		"^/sys/src/libc/(386|arm|alpha|sparc|power|mips)/"
+		"plan9/src/libthread/",
+		"plan9/src/libc/(386|arm|alpha|sparc|power|mips)/"
 	};
 	setproc(P.pid);
 	Tq = (Tqueue)P.threads;
@@ -252,7 +251,7 @@ defn threadstks(P){
 		print("\t");
 		thread(T);
 		threadstk(T);
-		T = T.nextt;
+		T = (Thread)T.nextt;
 		print("\n");
 	}
 	setproc(mainpid);