]> gitweb.factorcode.org Git - factor.git/blob - basis/tools/disassembler/udis/udis.factor
factor: more top level forms.
[factor.git] / basis / tools / disassembler / udis / udis.factor
1 ! Copyright (C) 2008, 2010 Slava Pestov, Jorge Acereda Macia.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types alien.libraries alien.syntax arrays
4 combinators destructors kernel layouts libc make math
5 math.order math.parser namespaces sequences splitting system
6 tools.disassembler.private tools.disassembler.utils tools.memory ;
7 IN: tools.disassembler.udis
8
9 LIBRARY-UNIX: libudis86 cdecl "libudis86.so"
10 LIBRARY-MACOSX: libudis86 cdecl "libudis86.dylib"
11 LIBRARY-WINDOWS: libudis86 cdecl "libudis86.dll"
12
13 LIBRARY: libudis86
14
15 TYPEDEF: void ud
16
17 FUNCTION: void ud_translate_intel ( ud* u )
18 FUNCTION: void ud_translate_att ( ud* u )
19
20 : UD_SYN_INTEL ( -- addr ) &: ud_translate_intel ; inline
21 : UD_SYN_ATT ( -- addr ) &: ud_translate_att ; inline
22
23 CONSTANT: UD_EOI          -1
24 CONSTANT: UD_INP_CACHE_SZ 32
25 CONSTANT: UD_VENDOR_AMD   0
26 CONSTANT: UD_VENDOR_INTEL 1
27
28 FUNCTION: void ud_init ( ud* u )
29 FUNCTION: void ud_set_mode ( ud* u, uchar mode )
30 FUNCTION: void ud_set_pc ( ud* u, ulonglong pc )
31 FUNCTION: void ud_set_input_buffer ( ud* u, c-string offset, size_t size )
32 FUNCTION: void ud_set_vendor ( ud* u, uint vendor )
33 FUNCTION: void ud_set_syntax ( ud* u, void* syntax )
34 FUNCTION: void ud_input_skip ( ud* u, size_t size )
35 FUNCTION: int ud_input_end ( ud* u )
36 FUNCTION: uint ud_decode ( ud* u )
37 FUNCTION: uint ud_disassemble ( ud* u )
38 FUNCTION: c-string ud_insn_asm ( ud* u )
39 FUNCTION: void* ud_insn_ptr ( ud* u )
40 FUNCTION: ulonglong ud_insn_off ( ud* u )
41 FUNCTION: c-string ud_insn_hex ( ud* u )
42 FUNCTION: uint ud_insn_len ( ud* u )
43 FUNCTION: c-string ud_lookup_mnemonic ( int c )
44
45 : <ud> ( -- ud )
46     1,000 malloc &free
47     dup ud_init
48     dup cell-bits ud_set_mode
49     dup UD_SYN_INTEL ud_set_syntax ;
50
51 : with-ud ( ..a quot: ( ..a ud -- ..b ) -- ..b )
52     [ [ [ <ud> ] dip call ] with-destructors ] with-code-blocks ; inline
53
54 SINGLETON: udis-disassembler
55
56 : buf/len ( from to -- buf len ) [ drop <alien> ] [ swap - ] 2bi ;
57
58 : resolve-call ( str -- str' ) "0x" split1-last [ resolve-xt append ] when* ;
59
60 : format-disassembly ( lines -- lines' )
61     dup [ second length ] [ max ] map-reduce
62     '[
63         [
64             [ first >hex cell 2 * CHAR: 0 pad-head % ": " % ]
65             [ second _ CHAR: \s pad-tail % "  " % ]
66             [ third resolve-call % ]
67             tri
68         ] "" make
69     ] map ;
70
71 : (disassemble) ( ud -- lines )
72     [
73         dup '[
74             _ ud_disassemble 0 =
75             [ f ] [
76                 _
77                 [ ud_insn_off ]
78                 [ ud_insn_hex ]
79                 [ ud_insn_asm ]
80                 tri 3array , t
81             ] if
82         ] loop
83     ] { } make ;
84
85 M: udis-disassembler disassemble*
86     '[
87         _ _
88         [ drop ud_set_pc ]
89         [ buf/len ud_set_input_buffer ]
90         [ 2drop (disassemble) format-disassembly ]
91         3tri
92     ] with-ud ;
93
94 udis-disassembler disassembler-backend set-global