[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

disassembler



[Sorry if you've already received a copy of this; the mail bottleneck
between the UK and the US is apparently about 12000 messages behind, and is
bouncing things left and right...]

Ok, I've (or rather I will very soon) put a file in my home dir on ardath
called disassem.tar.Z

It contains:
    disassem.lisp	The stuff
    assembler.diff	Diffs for a modified version of
			compiler/assembler.lisp with hooks for the
			disassembler.  I *did* make some non-strictly-
			necessary changes that didn't seem too dangerous,
			like adding a :default-type keyword for format
			fields.
    miles-backend.lisp	A function that pretends the backend structure has a
			disassem-params field.
    sparc-insts.diff	Diffs for a modified version of
			compiler/sparc/insts.lisp that works with the
			disassembler.  Mostly adding printing templates, but
			I did move some stuff around.

What I do is roughly:

  (compile-file "miles-backend" :load t)
  (compile-file "disassem" :load t)
  (compile-file "assembler" :load t)
  (compile-file "sparc-insts" :load t)

  (disassemble 'car) ; or whatever

WARNING!  I've only used versions of the files assembler & sparc-insts with
the package names changed, since I don't want to deal with the overwriting-
the-compiler-in-use bit.

I wimped out and didn't use any of the assembler data structures-- they
didn't hold what I needed, and I didn't want to have to deal with making sure
I didn't break anything, so I just put hooks into top-level macros in the
assembler, and keep my own parallel data structures.

The one problem I think is that it's a bit bloated, and does lots of consing
when works, but I suppose that's mostly bignum consing to get those top two
bits...  When you disassemble something in a code object, it detects that
fact that a GC has moved it and deals (for purposes of output, it pretends
that it's in the old location).

The magic things it finds are: function headers, LRAs, CODE indexed constant
references, NIL indexed references, NIL indexed symbol-slot references,
assembler-routine addresses and some of the breaks (and the args for errors).
I couldn't see any other other ones that would be easy, except for places
where it loads the address of LRAs, which is obvious anyway, since there's
usually a ".LRA" somewhere near.

What I want to see now is how it works with another processor.  I have some
changes to the mips description that worked a while ago, but I have to bring
it up to date.  The RT, what with multiple instruction sizes, etc., should
be a good test...

-Miles

--
Miles Bader  --  HCRC, University of Edinburgh  --  Miles.Bader@ed.ac.uk
99% of everything is grunge