implement \A as per db(1), and expose it externally. Reference: /n/atom/patch/applied/acidaddrsz Date: Fri Feb 14 17:49:46 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/acid/acid6 Thu Jan 1 00:00:00 1970 +++ /sys/src/cmd/acid/acid6 Fri Feb 14 17:43:36 2014 @@ -0,0 +1,1183 @@ +sizeof_1_ = 8; +aggr _1_ +{ + 'U' 0 lo; + 'U' 4 hi; +}; + +defn +_1_(addr) { + complex _1_ addr; + print(" lo ", addr.lo, "\n"); + print(" hi ", addr.hi, "\n"); +}; + +sizeofFPdbleword = 8; +aggr FPdbleword +{ + 'F' 0 x; + { + 'U' 0 lo; + 'U' 4 hi; + }; +}; + +defn +FPdbleword(addr) { + complex FPdbleword addr; + print(" x ", addr.x, "\n"); + print("_1_ {\n"); + _1_(addr+0); + print("}\n"); +}; + +UTFmax = 4; +Runesync = 128; +Runeself = 128; +Runeerror = 65533; +Runemax = 1114111; +sizeofFmt = 48; +aggr Fmt +{ + 'b' 0 runes; + 'X' 4 start; + 'X' 8 to; + 'X' 12 stop; + 'X' 16 flush; + 'X' 20 farg; + 'D' 24 nfmt; + 'X' 28 args; + 'D' 32 r; + 'D' 36 width; + 'D' 40 prec; + 'U' 44 flags; +}; + +defn +Fmt(addr) { + complex Fmt addr; + print(" runes ", addr.runes, "\n"); + print(" start ", addr.start\X, "\n"); + print(" to ", addr.to\X, "\n"); + print(" stop ", addr.stop\X, "\n"); + print(" flush ", addr.flush\X, "\n"); + print(" farg ", addr.farg\X, "\n"); + print(" nfmt ", addr.nfmt, "\n"); + print(" args ", addr.args\X, "\n"); + print(" r ", addr.r, "\n"); + print(" width ", addr.width, "\n"); + print(" prec ", addr.prec, "\n"); + print(" flags ", addr.flags, "\n"); +}; + +FmtWidth = 1; +FmtLeft = 2; +FmtPrec = 4; +FmtSharp = 8; +FmtSpace = 16; +FmtSign = 32; +FmtZero = 64; +FmtUnsigned = 128; +FmtShort = 256; +FmtLong = 512; +FmtVLong = 1024; +FmtComma = 2048; +FmtByte = 4096; +FmtFlag = 8192; +sizeofTm = 40; +aggr Tm +{ + 'D' 0 sec; + 'D' 4 min; + 'D' 8 hour; + 'D' 12 mday; + 'D' 16 mon; + 'D' 20 year; + 'D' 24 wday; + 'D' 28 yday; + 'a' 32 zone; + 'D' 36 tzoff; +}; + +defn +Tm(addr) { + complex Tm addr; + print(" sec ", addr.sec, "\n"); + print(" min ", addr.min, "\n"); + print(" hour ", addr.hour, "\n"); + print(" mday ", addr.mday, "\n"); + print(" mon ", addr.mon, "\n"); + print(" year ", addr.year, "\n"); + print(" wday ", addr.wday, "\n"); + print(" yday ", addr.yday, "\n"); + print(" zone ", addr.zone, "\n"); + print(" tzoff ", addr.tzoff, "\n"); +}; + +PNPROC = 1; +PNGROUP = 2; +Profoff = 0; +Profuser = 1; +Profkernel = 2; +Proftime = 3; +Profsample = 4; +sizeofLock = 4; +aggr Lock +{ + 'D' 0 val; +}; + +defn +Lock(addr) { + complex Lock addr; + print(" val ", addr.val, "\n"); +}; + +sizeofQLp = 12; +aggr QLp +{ + 'D' 0 inuse; + 'A' QLp 4 next; + 'C' 8 state; +}; + +defn +QLp(addr) { + complex QLp addr; + print(" inuse ", addr.inuse, "\n"); + print(" next ", addr.next\X, "\n"); + print(" state ", addr.state, "\n"); +}; + +sizeofQLock = 16; +aggr QLock +{ + Lock 0 lock; + 'D' 4 locked; + 'A' QLp 8 $head; + 'A' QLp 12 $tail; +}; + +defn +QLock(addr) { + complex QLock addr; + print("Lock lock {\n"); + Lock(addr.lock); + print("}\n"); + print(" locked ", addr.locked, "\n"); + print(" $head ", addr.$head\X, "\n"); + print(" $tail ", addr.$tail\X, "\n"); +}; + +sizeofRWLock = 20; +aggr RWLock +{ + Lock 0 lock; + 'D' 4 readers; + 'D' 8 writer; + 'A' QLp 12 $head; + 'A' QLp 16 $tail; +}; + +defn +RWLock(addr) { + complex RWLock addr; + print("Lock lock {\n"); + Lock(addr.lock); + print("}\n"); + print(" readers ", addr.readers, "\n"); + print(" writer ", addr.writer, "\n"); + print(" $head ", addr.$head\X, "\n"); + print(" $tail ", addr.$tail\X, "\n"); +}; + +sizeofRendez = 12; +aggr Rendez +{ + 'A' QLock 0 l; + 'A' QLp 4 $head; + 'A' QLp 8 $tail; +}; + +defn +Rendez(addr) { + complex Rendez addr; + print(" l ", addr.l\X, "\n"); + print(" $head ", addr.$head\X, "\n"); + print(" $tail ", addr.$tail\X, "\n"); +}; + +sizeofNetConnInfo = 36; +aggr NetConnInfo +{ + 'X' 0 dir; + 'X' 4 root; + 'X' 8 spec; + 'X' 12 lsys; + 'X' 16 lserv; + 'X' 20 rsys; + 'X' 24 rserv; + 'X' 28 laddr; + 'X' 32 raddr; +}; + +defn +NetConnInfo(addr) { + complex NetConnInfo addr; + print(" dir ", addr.dir\X, "\n"); + print(" root ", addr.root\X, "\n"); + print(" spec ", addr.spec\X, "\n"); + print(" lsys ", addr.lsys\X, "\n"); + print(" lserv ", addr.lserv\X, "\n"); + print(" rsys ", addr.rsys\X, "\n"); + print(" rserv ", addr.rserv\X, "\n"); + print(" laddr ", addr.laddr\X, "\n"); + print(" raddr ", addr.raddr\X, "\n"); +}; + +RFNAMEG = 1; +RFENVG = 2; +RFFDG = 4; +RFNOTEG = 8; +RFPROC = 16; +RFMEM = 32; +RFNOWAIT = 64; +RFCNAMEG = 1024; +RFCENVG = 2048; +RFCFDG = 4096; +RFREND = 8192; +RFNOMNT = 16384; +sizeofQid = 16; +aggr Qid +{ + 'W' 0 path; + 'U' 8 vers; + 'b' 12 type; +}; + +defn +Qid(addr) { + complex Qid addr; + print(" path ", addr.path, "\n"); + print(" vers ", addr.vers, "\n"); + print(" type ", addr.type, "\n"); +}; + +sizeofDir = 60; +aggr Dir +{ + 'u' 0 type; + 'U' 4 dev; + Qid 8 qid; + 'U' 24 mode; + 'U' 28 atime; + 'U' 32 mtime; + 'V' 36 length; + 'X' 44 name; + 'X' 48 uid; + 'X' 52 gid; + 'X' 56 muid; +}; + +defn +Dir(addr) { + complex Dir addr; + print(" type ", addr.type, "\n"); + print(" dev ", addr.dev, "\n"); + print("Qid qid {\n"); + Qid(addr.qid); + print("}\n"); + print(" mode ", addr.mode, "\n"); + print(" atime ", addr.atime, "\n"); + print(" mtime ", addr.mtime, "\n"); + print(" length ", addr.length, "\n"); + print(" name ", addr.name\X, "\n"); + print(" uid ", addr.uid\X, "\n"); + print(" gid ", addr.gid\X, "\n"); + print(" muid ", addr.muid\X, "\n"); +}; + +sizeofWaitmsg = 20; +aggr Waitmsg +{ + 'D' 0 pid; + 'a' 4 time; + 'X' 16 msg; +}; + +defn +Waitmsg(addr) { + complex Waitmsg addr; + print(" pid ", addr.pid, "\n"); + print(" time ", addr.time, "\n"); + print(" msg ", addr.msg\X, "\n"); +}; + +sizeofIOchunk = 8; +aggr IOchunk +{ + 'X' 0 addr; + 'U' 4 len; +}; + +defn +IOchunk(addr) { + complex IOchunk addr; + print(" addr ", addr.addr\X, "\n"); + print(" len ", addr.len, "\n"); +}; + +Bsize = 8192; +Bungetsize = 4; +Bmagic = 3227993; +Beof = -1; +Bbad = -2; +Binactive = 0; +Bractive = 1; +Bwactive = 2; +Bracteof = 3; +sizeofBiobufhdr = 52; +aggr Biobufhdr +{ + 'D' 0 icount; + 'D' 4 ocount; + 'D' 8 rdline; + 'D' 12 runesize; + 'D' 16 state; + 'D' 20 fid; + 'D' 24 flag; + 'V' 28 offset; + 'D' 36 bsize; + 'X' 40 bbuf; + 'X' 44 ebuf; + 'X' 48 gbuf; +}; + +defn +Biobufhdr(addr) { + complex Biobufhdr addr; + print(" icount ", addr.icount, "\n"); + print(" ocount ", addr.ocount, "\n"); + print(" rdline ", addr.rdline, "\n"); + print(" runesize ", addr.runesize, "\n"); + print(" state ", addr.state, "\n"); + print(" fid ", addr.fid, "\n"); + print(" flag ", addr.flag, "\n"); + print(" offset ", addr.offset, "\n"); + print(" bsize ", addr.bsize, "\n"); + print(" bbuf ", addr.bbuf\X, "\n"); + print(" ebuf ", addr.ebuf\X, "\n"); + print(" gbuf ", addr.gbuf\X, "\n"); +}; + +sizeofBiobuf = 8248; +aggr Biobuf +{ + { + 'D' 0 icount; + 'D' 4 ocount; + 'D' 8 rdline; + 'D' 12 runesize; + 'D' 16 state; + 'D' 20 fid; + 'D' 24 flag; + 'V' 28 offset; + 'D' 36 bsize; + 'X' 40 bbuf; + 'X' 44 ebuf; + 'X' 48 gbuf; + }; + 'a' 52 b; +}; + +defn +Biobuf(addr) { + complex Biobuf addr; + print("Biobufhdr {\n"); + Biobufhdr(addr+0); + print("}\n"); + print(" b ", addr.b, "\n"); +}; + +sizeofExec = 32; +aggr Exec +{ + 'D' 0 magic; + 'D' 4 text; + 'D' 8 data; + 'D' 12 bss; + 'D' 16 syms; + 'D' 20 entry; + 'D' 24 spsz; + 'D' 28 pcsz; +}; + +defn +Exec(addr) { + complex Exec addr; + print(" magic ", addr.magic, "\n"); + print(" text ", addr.text, "\n"); + print(" data ", addr.data, "\n"); + print(" bss ", addr.bss, "\n"); + print(" syms ", addr.syms, "\n"); + print(" entry ", addr.entry, "\n"); + print(" spsz ", addr.spsz, "\n"); + print(" pcsz ", addr.pcsz, "\n"); +}; + +sizeofSym = 20; +aggr Sym +{ + 'V' 0 value; + 'U' 8 sig; + 'C' 12 type; + 'X' 16 name; +}; + +defn +Sym(addr) { + complex Sym addr; + print(" value ", addr.value, "\n"); + print(" sig ", addr.sig, "\n"); + print(" type ", addr.type, "\n"); + print(" name ", addr.name\X, "\n"); +}; + +MMIPS = 0; +MSPARC = 1; +M68020 = 2; +MI386 = 3; +MI960 = 4; +M3210 = 5; +MMIPS2 = 6; +NMIPS2 = 7; +M29000 = 8; +MARM = 9; +MPOWER = 10; +MALPHA = 11; +NMIPS = 12; +MSPARC64 = 13; +MAMD64 = 14; +MPOWER64 = 15; +MARM64 = 16; +FNONE = 0; +FMIPS = 1; +FMIPSB = 2; +FSPARC = 3; +FSPARCB = 4; +F68020 = 5; +F68020B = 6; +FNEXTB = 7; +FI386 = 8; +FI386B = 9; +FI960 = 10; +FI960B = 11; +F3210 = 12; +FMIPS2BE = 13; +F29000 = 14; +FARM = 15; +FARMB = 16; +FPOWER = 17; +FPOWERB = 18; +FMIPS2LE = 19; +FALPHA = 20; +FALPHAB = 21; +FMIPSLE = 22; +FSPARC64 = 23; +FAMD64 = 24; +FAMD64B = 25; +FPOWER64 = 26; +FPOWER64B = 27; +FARM64 = 28; +FARM64B = 29; +ANONE = 0; +AMIPS = 1; +AMIPSCO = 2; +ASPARC = 3; +ASUNSPARC = 4; +A68020 = 5; +AI386 = 6; +AI8086 = 7; +AI960 = 8; +A29000 = 9; +AARM = 10; +APOWER = 11; +AALPHA = 12; +ASPARC64 = 13; +AAMD64 = 14; +APOWER64 = 15; +AARM64 = 16; +Obj68020 = 0; +ObjSparc = 1; +ObjMips = 2; +Obj386 = 3; +Obj960 = 4; +Obj3210 = 5; +ObjMips2 = 6; +Obj29000 = 7; +ObjArm = 8; +ObjPower = 9; +ObjMips2le = 10; +ObjAlpha = 11; +ObjSparc64 = 12; +ObjAmd64 = 13; +ObjSpim = 14; +ObjPower64 = 15; +ObjArm64 = 16; +Maxobjtype = 17; +CNONE = 0; +CAUTO = 1; +CPARAM = 2; +CSTAB = 3; +CTEXT = 4; +CDATA = 5; +CANY = 6; +sizeofsegment = 40; +aggr segment +{ + 'X' 0 name; + 'D' 4 fd; + 'D' 8 inuse; + 'D' 12 cache; + 'W' 16 b; + 'W' 24 e; + 'V' 32 f; +}; + +defn +segment(addr) { + complex segment addr; + print(" name ", addr.name\X, "\n"); + print(" fd ", addr.fd, "\n"); + print(" inuse ", addr.inuse, "\n"); + print(" cache ", addr.cache, "\n"); + print(" b ", addr.b, "\n"); + print(" e ", addr.e, "\n"); + print(" f ", addr.f, "\n"); +}; + +sizeofMap = 48; +aggr Map +{ + 'D' 0 kernel; + 'D' 4 nsegs; + 'a' 8 seg; +}; + +defn +Map(addr) { + complex Map addr; + print(" kernel ", addr.kernel, "\n"); + print(" nsegs ", addr.nsegs, "\n"); + print(" seg ", addr.seg, "\n"); +}; + +sizeof_2_ = 20; +aggr _2_ +{ + 'X' 0 name; + 'V' 4 value; + 'C' 12 type; + 'C' 13 class; + 'D' 16 index; +}; + +defn +_2_(addr) { + complex _2_ addr; + print(" name ", addr.name\X, "\n"); + print(" value ", addr.value, "\n"); + print(" type ", addr.type, "\n"); + print(" class ", addr.class, "\n"); + print(" index ", addr.index, "\n"); +}; + +sizeofSymbol = 24; +aggr Symbol +{ + 'X' 0 handle; + { + 'X' 4 name; + 'V' 8 value; + 'C' 16 type; + 'C' 17 class; + 'D' 20 index; + }; +}; + +defn +Symbol(addr) { + complex Symbol addr; + print(" handle ", addr.handle\X, "\n"); + print("_2_ {\n"); + _2_(addr+4); + print("}\n"); +}; + +sizeofReglist = 8; +aggr Reglist +{ + 'X' 0 rname; + 'd' 4 roffs; + 'C' 6 rflags; + 'C' 7 rformat; +}; + +defn +Reglist(addr) { + complex Reglist addr; + print(" rname ", addr.rname\X, "\n"); + print(" roffs ", addr.roffs, "\n"); + print(" rflags ", addr.rflags, "\n"); + print(" rformat ", addr.rformat, "\n"); +}; + +RINT = 0; +RFLT = 1; +RRDONLY = 2; +sizeofMach = 92; +aggr Mach +{ + 'X' 0 name; + 'D' 4 mtype; + 'A' Reglist 8 reglist; + 'D' 12 regsize; + 'D' 16 fpregsize; + 'X' 20 pc; + 'X' 24 sp; + 'X' 28 link; + 'X' 32 sbreg; + 'W' 36 sb; + 'D' 44 pgsize; + 'W' 48 kbase; + 'W' 56 ktmask; + 'W' 64 utop; + 'D' 72 pcquant; + 'D' 76 szaddr; + 'D' 80 szreg; + 'D' 84 szfloat; + 'D' 88 szdouble; +}; + +defn +Mach(addr) { + complex Mach addr; + print(" name ", addr.name\X, "\n"); + print(" mtype ", addr.mtype, "\n"); + print(" reglist ", addr.reglist\X, "\n"); + print(" regsize ", addr.regsize, "\n"); + print(" fpregsize ", addr.fpregsize, "\n"); + print(" pc ", addr.pc\X, "\n"); + print(" sp ", addr.sp\X, "\n"); + print(" link ", addr.link\X, "\n"); + print(" sbreg ", addr.sbreg\X, "\n"); + print(" sb ", addr.sb, "\n"); + print(" pgsize ", addr.pgsize, "\n"); + print(" kbase ", addr.kbase, "\n"); + print(" ktmask ", addr.ktmask, "\n"); + print(" utop ", addr.utop, "\n"); + print(" pcquant ", addr.pcquant, "\n"); + print(" szaddr ", addr.szaddr, "\n"); + print(" szreg ", addr.szreg, "\n"); + print(" szfloat ", addr.szfloat, "\n"); + print(" szdouble ", addr.szdouble, "\n"); +}; + +complex Mach mach; +sizeofMachdata = 60; +aggr Machdata +{ + 'a' 0 bpinst; + 'd' 4 bpsize; + 'X' 8 swab; + 'X' 12 swal; + 'X' 16 swav; + 'X' 20 ctrace; + 'X' 24 findframe; + 'X' 28 excep; + 'X' 32 bpfix; + 'X' 36 sftos; + 'X' 40 dftos; + 'X' 44 foll; + 'X' 48 das; + 'X' 52 hexinst; + 'X' 56 instsize; +}; + +defn +Machdata(addr) { + complex Machdata addr; + print(" bpinst ", addr.bpinst, "\n"); + print(" bpsize ", addr.bpsize, "\n"); + print(" swab ", addr.swab\X, "\n"); + print(" swal ", addr.swal\X, "\n"); + print(" swav ", addr.swav\X, "\n"); + print(" ctrace ", addr.ctrace\X, "\n"); + print(" findframe ", addr.findframe\X, "\n"); + print(" excep ", addr.excep\X, "\n"); + print(" bpfix ", addr.bpfix\X, "\n"); + print(" sftos ", addr.sftos\X, "\n"); + print(" dftos ", addr.dftos\X, "\n"); + print(" foll ", addr.foll\X, "\n"); + print(" das ", addr.das\X, "\n"); + print(" hexinst ", addr.hexinst\X, "\n"); + print(" instsize ", addr.instsize\X, "\n"); +}; + +sizeofFhdr = 100; +aggr Fhdr +{ + 'X' 0 name; + 'b' 4 type; + 'b' 5 hdrsz; + 'b' 6 _magic; + 'b' 7 spare; + 'D' 8 magic; + 'W' 12 txtaddr; + 'V' 20 txtoff; + 'W' 28 dataddr; + 'V' 36 datoff; + 'V' 44 symoff; + 'W' 52 entry; + 'V' 60 sppcoff; + 'V' 68 lnpcoff; + 'D' 76 txtsz; + 'D' 80 datsz; + 'D' 84 bsssz; + 'D' 88 symsz; + 'D' 92 sppcsz; + 'D' 96 lnpcsz; +}; + +defn +Fhdr(addr) { + complex Fhdr addr; + print(" name ", addr.name\X, "\n"); + print(" type ", addr.type, "\n"); + print(" hdrsz ", addr.hdrsz, "\n"); + print(" _magic ", addr._magic, "\n"); + print(" spare ", addr.spare, "\n"); + print(" magic ", addr.magic, "\n"); + print(" txtaddr ", addr.txtaddr, "\n"); + print(" txtoff ", addr.txtoff, "\n"); + print(" dataddr ", addr.dataddr, "\n"); + print(" datoff ", addr.datoff, "\n"); + print(" symoff ", addr.symoff, "\n"); + print(" entry ", addr.entry, "\n"); + print(" sppcoff ", addr.sppcoff, "\n"); + print(" lnpcoff ", addr.lnpcoff, "\n"); + print(" txtsz ", addr.txtsz, "\n"); + print(" datsz ", addr.datsz, "\n"); + print(" bsssz ", addr.bsssz, "\n"); + print(" symsz ", addr.symsz, "\n"); + print(" sppcsz ", addr.sppcsz, "\n"); + print(" lnpcsz ", addr.lnpcsz, "\n"); +}; + +complex Machdata machdata; +Eof = -1; +Strsize = 4096; +Hashsize = 128; +Maxarg = 512; +Maxproc = 400; +NFD = 420; +Maxval = 10; +Mempergc = 1048576; +complex Fhdr fhdr; +complex Biobuf bout; +complex Map cormap; +complex Map symmap; +TINT = 0; +TFLOAT = 1; +TSTRING = 2; +TLIST = 3; +TCODE = 4; +sizeofType = 24; +aggr Type +{ + 'A' Type 0 next; + 'D' 4 offset; + 'C' 8 fmt; + 'C' 9 depth; + 'X' 12 type; + 'X' 16 tag; + 'X' 20 base; +}; + +defn +Type(addr) { + complex Type addr; + print(" next ", addr.next\X, "\n"); + print(" offset ", addr.offset, "\n"); + print(" fmt ", addr.fmt, "\n"); + print(" depth ", addr.depth, "\n"); + print(" type ", addr.type\X, "\n"); + print(" tag ", addr.tag\X, "\n"); + print(" base ", addr.base\X, "\n"); +}; + +sizeofFrtype = 12; +aggr Frtype +{ + 'X' 0 var; + 'A' Type 4 type; + 'A' Frtype 8 next; +}; + +defn +Frtype(addr) { + complex Frtype addr; + print(" var ", addr.var\X, "\n"); + print(" type ", addr.type\X, "\n"); + print(" next ", addr.next\X, "\n"); +}; + +sizeofPtab = 8; +aggr Ptab +{ + 'D' 0 pid; + 'D' 4 ctl; +}; + +defn +Ptab(addr) { + complex Ptab addr; + print(" pid ", addr.pid, "\n"); + print(" ctl ", addr.ctl, "\n"); +}; + +sizeofRplace = 24; +aggr Rplace +{ + 'a' 0 rlab; + 'X' 8 stak; + 'X' 12 val; + 'X' 16 $local; + 'X' 20 $tail; +}; + +defn +Rplace(addr) { + complex Rplace addr; + print(" rlab ", addr.rlab, "\n"); + print(" stak ", addr.stak\X, "\n"); + print(" val ", addr.val\X, "\n"); + print(" $local ", addr.$local\X, "\n"); + print(" $tail ", addr.$tail\X, "\n"); +}; + +sizeofGc = 8; +aggr Gc +{ + 'C' 0 gcmark; + 'A' Gc 4 gclink; +}; + +defn +Gc(addr) { + complex Gc addr; + print(" gcmark ", addr.gcmark, "\n"); + print(" gclink ", addr.gclink\X, "\n"); +}; + +sizeof_3_ = 8; +aggr _3_ +{ + 'V' 0 ival; + 'F' 0 fval; + 'X' 0 string; + 'X' 0 l; + 'X' 0 cc; +}; + +defn +_3_(addr) { + complex _3_ addr; + print(" ival ", addr.ival, "\n"); + print(" fval ", addr.fval, "\n"); + print(" string ", addr.string\X, "\n"); + print(" l ", addr.l\X, "\n"); + print(" cc ", addr.cc\X, "\n"); +}; + +sizeofStore = 16; +aggr Store +{ + 'C' 0 fmt; + 'A' Type 4 comt; + { + 'V' 8 ival; + 'F' 8 fval; + 'X' 8 string; + 'X' 8 l; + 'X' 8 cc; + }; +}; + +defn +Store(addr) { + complex Store addr; + print(" fmt ", addr.fmt, "\n"); + print(" comt ", addr.comt\X, "\n"); + print("_3_ {\n"); + _3_(addr+8); + print("}\n"); +}; + +sizeofList = 32; +aggr List +{ + { + 'C' 0 gcmark; + 'A' Gc 4 gclink; + }; + 'A' List 8 next; + 'C' 12 type; + { + 'C' 16 fmt; + 'A' Type 20 comt; + { + 'V' 24 ival; + 'F' 24 fval; + 'X' 24 string; + 'A' List 24 l; + 'X' 24 cc; + }; + }; +}; + +defn +List(addr) { + complex List addr; + print("Gc {\n"); + Gc(addr+0); + print("}\n"); + print(" next ", addr.next\X, "\n"); + print(" type ", addr.type, "\n"); + print("Store {\n"); + Store(addr+16); + print("}\n"); +}; + +complex Rplace ret; +sizeofValue = 32; +aggr Value +{ + 'C' 0 set; + 'C' 1 type; + { + 'C' 4 fmt; + 'A' Type 8 comt; + { + 'V' 12 ival; + 'F' 12 fval; + 'X' 12 string; + 'A' List 12 l; + 'X' 12 cc; + }; + }; + 'A' Value 20 pop; + 'X' 24 scope; + 'A' Rplace 28 ret; +}; + +defn +Value(addr) { + complex Value addr; + print(" set ", addr.set, "\n"); + print(" type ", addr.type, "\n"); + print("Store {\n"); + Store(addr+4); + print("}\n"); + print(" pop ", addr.pop\X, "\n"); + print(" scope ", addr.scope\X, "\n"); + print(" ret ", addr.ret\X, "\n"); +}; + +sizeofLsym = 32; +aggr Lsym +{ + 'X' 0 name; + 'D' 4 lexval; + 'A' Lsym 8 hash; + 'A' Value 12 v; + 'A' Type 16 lt; + 'X' 20 proc; + 'A' Frtype 24 $local; + 'X' 28 $builtin; +}; + +defn +Lsym(addr) { + complex Lsym addr; + print(" name ", addr.name\X, "\n"); + print(" lexval ", addr.lexval, "\n"); + print(" hash ", addr.hash\X, "\n"); + print(" v ", addr.v\X, "\n"); + print(" lt ", addr.lt\X, "\n"); + print(" proc ", addr.proc\X, "\n"); + print(" $local ", addr.$local\X, "\n"); + print(" $builtin ", addr.$builtin\X, "\n"); +}; + +sizeofNode = 44; +aggr Node +{ + { + 'C' 0 gcmark; + 'A' Gc 4 gclink; + }; + 'C' 8 op; + 'C' 9 type; + 'A' Node 12 left; + 'A' Node 16 right; + 'A' Lsym 20 sym; + 'D' 24 $builtin; + { + 'C' 28 fmt; + 'A' Type 32 comt; + { + 'V' 36 ival; + 'F' 36 fval; + 'X' 36 string; + 'A' List 36 l; + 'A' Node 36 cc; + }; + }; +}; + +defn +Node(addr) { + complex Node addr; + print("Gc {\n"); + Gc(addr+0); + print("}\n"); + print(" op ", addr.op, "\n"); + print(" type ", addr.type, "\n"); + print(" left ", addr.left\X, "\n"); + print(" right ", addr.right\X, "\n"); + print(" sym ", addr.sym\X, "\n"); + print(" $builtin ", addr.$builtin, "\n"); + print("Store {\n"); + Store(addr+28); + print("}\n"); +}; + +sizeofString = 16; +aggr String +{ + { + 'C' 0 gcmark; + 'A' Gc 4 gclink; + }; + 'X' 8 string; + 'D' 12 len; +}; + +defn +String(addr) { + complex String addr; + print("Gc {\n"); + Gc(addr+0); + print("}\n"); + print(" string ", addr.string\X, "\n"); + print(" len ", addr.len, "\n"); +}; + +ONAME = 0; +OCONST = 1; +OMUL = 2; +ODIV = 3; +OMOD = 4; +OADD = 5; +OSUB = 6; +ORSH = 7; +OLSH = 8; +OLT = 9; +OGT = 10; +OLEQ = 11; +OGEQ = 12; +OEQ = 13; +ONEQ = 14; +OLAND = 15; +OXOR = 16; +OLOR = 17; +OCAND = 18; +OCOR = 19; +OASGN = 20; +OINDM = 21; +OEDEC = 22; +OEINC = 23; +OPINC = 24; +OPDEC = 25; +ONOT = 26; +OIF = 27; +ODO = 28; +OLIST = 29; +OCALL = 30; +OCTRUCT = 31; +OWHILE = 32; +OELSE = 33; +OHEAD = 34; +OTAIL = 35; +OAPPEND = 36; +ORET = 37; +OINDEX = 38; +OINDC = 39; +ODOT = 40; +OLOCAL = 41; +OFRAME = 42; +OCOMPLEX = 43; +ODELETE = 44; +OCAST = 45; +OFMT = 46; +OEVAL = 47; +OWHAT = 48; +sizeof_4_ = 8; +aggr _4_ +{ + 'A' Node 0 node; + 'A' Lsym 0 sym; + 'W' 0 ival; + 'f' 0 fval; + 'A' String 0 string; +}; + +defn +_4_(addr) { + complex _4_ addr; + print(" node ", addr.node\X, "\n"); + print(" sym ", addr.sym\X, "\n"); + print(" ival ", addr.ival, "\n"); + print(" fval ", addr.fval, "\n"); + print(" string ", addr.string\X, "\n"); +}; + +complex _4_ yylval; +complex Biobuf bioout; +complex Lsym main:l; +complex Node main:n; +complex Lsym die:s; +complex List die:f; +complex Lsym userinit:l; +complex Node userinit:n; +complex Dir readtext:d; +complex Lsym readtext:l; +complex Value readtext:v; +complex Symbol readtext:sym; +complex Machdata mipsmach; +complex Node an:l; +complex Node an:r; +complex Node an:n; +complex List al:l; +complex Node con:n; +complex Node marktree:n; +complex List marklist:l; +complex Lsym gc:f; +complex Value gc:v; +complex Gc gc:m; +complex Gc gc:p; +complex Gc gc:next; +complex Dir checkqid:d1; +complex Dir checkqid:d2; +complex Fmt xfmt:f; --- /sys/src/cmd/acid/builtin.c Fri Feb 14 17:43:38 2014 +++ /sys/src/cmd/acid/builtin.c Fri Feb 14 17:43:39 2014 @@ -89,7 +89,7 @@ 0 }; -char vfmt[] = "aBbcCdDfFgGiIoOqQrRsSuUVWxXYZ38"; +char vfmt[] = "aABbcCdDfFgGiIoOqQrRsSuUVWxXYZ38"; void mkprint(Lsym *s) @@ -1068,9 +1068,6 @@ case 'V': Bprint(bout, "%lld", res->ival); break; - case 'W': - Bprint(bout, "%.8llux", res->ival); - break; case 'Y': Bprint(bout, "%.16llux", res->ival); break; @@ -1080,6 +1077,25 @@ case 'O': Bprint(bout, "0%.6uo", (int)res->ival); break; + case 'A': + case 'W': + switch(mach->szaddr){ + default: + sysfatal("acid: szaddr %d unhandled", mach->szaddr); + case 1: + Bprint(bout, "%.2uhhx", (uchar)res->ival); + break; + case 2: + Bprint(bout, "%.4uhx", (ushort)res->ival); + break; + case 4: + Bprint(bout, "%.8ux", (uint)res->ival); + break; + case 8: + Bprint(bout, "%.16llux", res->ival); + break; + } + break; case 'q': Bprint(bout, "0%.11ho", (short)(res->ival&0xffff)); break; @@ -1110,7 +1126,6 @@ Bprint(bout, "%S", (Rune*)res->string->string); break; case 'a': - case 'A': symoff(buf, sizeof(buf), res->ival, CANY); Bprint(bout, "%s", buf); break; --- /sys/src/cmd/acid/expr.c Fri Feb 14 17:43:40 2014 +++ /sys/src/cmd/acid/expr.c Fri Feb 14 17:43:41 2014 @@ -8,7 +8,7 @@ int fsize[] = { - ['A'] 4, +// ['A'] 4, ['B'] 4, ['C'] 1, ['D'] 4, @@ -20,11 +20,11 @@ ['S'] 4, ['U'] 4, ['V'] 8, - ['W'] 8, +// ['W'] 8, ['X'] 4, ['Y'] 8, ['Z'] 8, - ['a'] 4, +// ['a'] 4, ['b'] 1, ['c'] 1, ['d'] 2, @@ -48,7 +48,13 @@ switch(v->fmt) { default: assert(v->fmt < nelem(fsize)); - return fsize[v->fmt]; + ret = fsize[v->fmt]; + assert(ret>0 && ret<32); + return ret; + case 'a': + case 'A': + case 'W': + return mach->szaddr; case 'i': case 'I': if(v->type != TINT || machdata == 0) --- /sys/src/cmd/acid/util.c Fri Feb 14 17:43:42 2014 +++ /sys/src/cmd/acid/util.c Fri Feb 14 17:43:43 2014 @@ -183,6 +183,34 @@ l->v->type = TLIST; } +int +getn(Map *map, uvlong addr, uvlong *u, int n) +{ + uchar b[1]; + int r; + ushort s; + ulong l; + + switch(n){ + default: + sysfatal("acid: getn: bad n %d", n); + case 1: + r = get1(map, addr, b, 1); + *u = b[0]; + return r; + case 2: + r = get2(map, addr, &s); + *u = s; + return r; + case 4: + r = get4(map, addr, &l); + *u = l; + return r; + case 8: + return get8(map, addr, u); + } +} + uvlong rget(Map *map, char *reg) { @@ -200,8 +228,12 @@ ret = get4(map, s->v->ival, &x); v = x; break; - case 'V': + case 'a': + case 'A': case 'W': + ret = getn(map, s->v->ival, &v, fmtsize(s->v)); + break; + case 'V': case 'Y': case 'Z': ret = get8(map, s->v->ival, &v);