shithub: sl

Download patch

ref: 2eb7a06d08964c0da9beefa3d75cd03382b7235b
parent: c0e57a711517201e3b3bcd621b47c367a3fcd39f
author: spew <spew@cbza.org>
date: Sat Apr 19 16:53:10 EDT 2025

lsd: fix some things

runes are still broken for symbols

--- a/src/plan9/lsd.c
+++ b/src/plan9/lsd.c
@@ -6,7 +6,7 @@
 #include "io.h"
 
 static char aout[1024];
-static sl_v lsd_gpregsym, lsd_fpregsym, lsd_regsym, lsd_symsym, lsd_framesym;
+static sl_v gpregsym, fpregsym, mkregsym, mksymbolsym, mkframesym;
 static Map* coremap;
 static Fhdr fhdr;
 static ios *proc_stdin;
@@ -14,11 +14,11 @@
 void
 lsd_init(void)
 {
-	lsd_gpregsym = mk_csym(":gpreg");
-	lsd_fpregsym = mk_csym(":fpreg");
-	lsd_symsym = mk_csym("symbol");
-	lsd_regsym = mk_csym("reg");
-	lsd_framesym = mk_csym("frame");
+	gpregsym = mk_csym(":gpreg");
+	fpregsym = mk_csym(":fpreg");
+	mksymbolsym = mk_csym("mk-symbol");
+	mkregsym = mk_csym("mk-reg");
+	mkframesym = mk_csym("mk-frame");
 }
 
 sl_v
@@ -67,20 +67,13 @@
 static sl_v
 mk_symbol(Symbol *s)
 {
-	sl_v v;
 	Rune r;
 	static char b[2];
 
 	b[0] = s->type;
 	chartorune(&r, b);
-	v = alloc_vec(4, 0);
-	sl_gc_handle(&v);
-	vec_elt(v, 0) = lsd_symsym;
-	vec_elt(v, 1) = str_from_cstr(s->name);
-	vec_elt(v, 2) = mk_rune(r);
-	vec_elt(v, 3) = mk_lsdptr(s->value);
-	sl_free_gc_handles(1);
-	return v;
+	fprint(2, "rune is %C\n", r);
+	return sl_applyn(3, sym_value(mksymbolsym), str_from_cstr(s->name), mk_rune(r), mk_lsdptr(s->value));
 }
 
 static sl_v
@@ -227,18 +220,8 @@
 static void
 trlist(Map *map, uvlong retpc, uvlong sp, Symbol *fn)
 {
-	sl_v v;
-
 	USED(map);
-	v = alloc_vec(5, 0);
-	sl_gc_handle(&v);
-	vec_elt(v, 0) = lsd_framesym;
-	vec_elt(v, 1) = mk_symbol(fn);
-	vec_elt(v, 2) = mk_lsdptr(retpc);
-	vec_elt(v, 3) = mk_lsdptr(sp);
-	vec_elt(v, 4) = localslist(fn, sp);
-	sl_free_gc_handles(1);
-	tracelist = mk_cons(v, tracelist);
+	tracelist = mk_cons(sl_applyn(4, sym_value(mkframesym), mk_symbol(fn), mk_lsdptr(retpc), mk_lsdptr(sp), localslist(fn, sp)), tracelist);
 }
 
 BUILTIN("lsd-ctrace", lsd_ctrace)
@@ -275,13 +258,13 @@
 BUILTIN("lsd-load", lsd_load)
 {
 	Reglist *r;
-	sl_v v, registers;
+	sl_v v, registers, ptrsz;
 	int pid, len;
 
 	pid = -1;
 	argcount(nargs, 1);
 	if(sl_unlikely(!isstr(args[0]) && !isnum(args[0])))
-		bthrow(type_error("program", "(or str num)", args[0]));
+		bthrow(type_error(nil, "str|num", args[0]));
 
 	if(isnum(args[0])){
 		pid = tosize(args[0]);
@@ -301,19 +284,15 @@
 	sl_gc_handle(&registers);
 	sl_gc_handle(&v);
 	for(r = mach->reglist; r->rname != nil; r++){
-		v = alloc_vec(5, 0);
-		vec_elt(v, 0) = lsd_regsym;
-		vec_elt(v, 1) = str_from_cstr(r->rname);
-		vec_elt(v, 2) = r->rflags == RINT ? lsd_gpregsym : lsd_fpregsym;
-		vec_elt(v, 3) = size_wrap(r->roffs);
 		switch(r->rformat){
 		default:
-			vec_elt(v, 4) = sl_u32sym;
+			ptrsz = sl_u32sym;
 			break;
 		case 'V': case 'W': case 'Y': case 'Z':
-			vec_elt(v, 4) = sl_u64sym;
+			ptrsz = sl_u64sym;
 			break;
 		}
+		v = sl_applyn(4, sym_value(mkregsym), str_from_cstr(r->rname), r->rflags == RINT ? gpregsym : fpregsym, size_wrap(r->roffs), ptrsz);
 		set(mk_sym(r->rname, true), v);
 		registers = mk_cons(v, registers);
 	}
@@ -372,7 +351,7 @@
 
 	argcount(nargs, 1);
 	if(sl_unlikely(!isnum(args[0])))
-		bthrow(type_error("addr", "num", args[0]));
+		bthrow(type_error(nil, "num", args[0]));
 	addr = tosize(args[0]);
 
 	n = machdata->foll(coremap, addr, rget, f);
@@ -394,7 +373,7 @@
 
 	argcount(nargs, 1);
 	if(sl_unlikely(!isnum(args[0])))
-		bthrow(type_error("addr", "num", args[0]));
+		bthrow(type_error(nil, "num", args[0]));
 
 	addr = tosize(args[0]);
 	if(machdata->das(coremap, addr, 'i', buf, sizeof(buf)) < 0)
@@ -409,7 +388,7 @@
 
 	argcount(nargs, 1);
 	if(sl_unlikely(!isnum(args[0])))
-		bthrow(type_error("addr", "num", args[0]));
+		bthrow(type_error(nil, "num", args[0]));
 
 	addr = tosize(args[0]);
 	sz = machdata->instsize(coremap, addr);
@@ -425,7 +404,7 @@
 
 	argcount(nargs, 1);
 	if(sl_unlikely(!isnum(args[0])))
-		bthrow(type_error("addr", "num", args[0]));
+		bthrow(type_error(nil, "num", args[0]));
 
 	addr = tosize(args[0]);
 	if(!fileline(buf, sizeof(buf), addr))
@@ -441,9 +420,9 @@
 
 	argcount(nargs, 2);
 	if(sl_unlikely(!isstr(args[0])))
-		bthrow(type_error("file", "str", args[0]));
+		bthrow(type_error(nil, "str", args[0]));
 	if(sl_unlikely(!isfixnum(args[1])))
-		bthrow(type_error("line", "num", args[1]));
+		bthrow(type_error(nil, "num", args[1]));
 
 	file = cvalue_data(args[0]);
 	line = numval(args[1]);
@@ -460,7 +439,7 @@
 
 	argcount(nargs, 1);
 	if(sl_unlikely(!isnum(args[0])))
-		bthrow(type_error("addr", "num", args[0]));
+		bthrow(type_error(nil, "num", args[0]));
 
 	addr = tosize(args[0]);
 	if(!findsym(addr, CTEXT, &s))
--- a/src/plan9/lsd.sl
+++ b/src/plan9/lsd.sl
@@ -16,6 +16,7 @@
   :doc-group lsd
   :doc-see reg-read
   :doc-see registers
+  :constructor (mk-reg name type addr size)
   name type addr size)
 
 (defstruct symbol
@@ -25,6 +26,7 @@
    described in a.out(6), and address is the location of the symbol in
    the process address space"
   :doc-group lsd
+  :constructor (mk-symbol name type addr)
   name type addr)
 
 (defstruct global
@@ -43,6 +45,7 @@
    pointer value.  Locals are all the local symbols."
   :doc-group lsd
   :doc-see symbol
+  :constructor (mk-frame sym retpc sp locals)
   sym retpc sp locals)
 
 (def tracers (table