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(®isters);
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