]> gitweb.factorcode.org Git - factor.git/blob - basis/tools/disassembler/udis/udis.factor
Merge branch 'master' into experimental
[factor.git] / basis / tools / disassembler / udis / udis.factor
1 ! Copyright (C) 2008 Slava Pestov, Jorge Acereda Macia.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: tools.disassembler namespaces combinators
4 alien alien.syntax alien.c-types lexer parser kernel
5 sequences layouts math math.parser system make fry arrays ;
6 IN: tools.disassembler.udis
7
8 <<
9 "libudis86" {
10     { [ os macosx? ] [ "libudis86.0.dylib" ] }
11     { [ os unix? ] [ "libudis86.so.0" ] }
12     { [ os winnt? ] [ "libudis86.dll" ] }
13 } cond "cdecl" add-library
14 >>
15
16 LIBRARY: libudis86
17
18 TYPEDEF: char[592] ud
19
20 FUNCTION: void ud_translate_intel ( ud* u ) ;
21 FUNCTION: void ud_translate_att ( ud* u ) ;
22
23 : UD_SYN_INTEL ( -- addr ) &: ud_translate_intel ; inline
24 : UD_SYN_ATT ( -- addr ) &: ud_translate_att ; inline
25
26 : UD_EOI          -1 ; inline
27 : UD_INP_CACHE_SZ 32 ; inline
28 : UD_VENDOR_AMD   0 ; inline
29 : UD_VENDOR_INTEL 1 ; inline
30
31 FUNCTION: void ud_init ( ud* u ) ;
32 FUNCTION: void ud_set_mode ( ud* u, uint8_t mode ) ;
33 FUNCTION: void ud_set_pc ( ud* u, ulonglong pc ) ;
34 FUNCTION: void ud_set_input_buffer ( ud* u, uint8_t* offset, size_t size ) ;
35 FUNCTION: void ud_set_vendor ( ud* u, uint vendor ) ;
36 FUNCTION: void ud_set_syntax ( ud* u, void* syntax ) ;
37 FUNCTION: void ud_input_skip ( ud* u, size_t size ) ;
38 FUNCTION: int ud_input_end ( ud* u ) ;
39 FUNCTION: uint ud_decode ( ud* u ) ;
40 FUNCTION: uint ud_disassemble ( ud* u ) ;
41 FUNCTION: char* ud_insn_asm ( ud* u ) ;
42 FUNCTION: void* ud_insn_ptr ( ud* u ) ;
43 FUNCTION: ulonglong ud_insn_off ( ud* u ) ;
44 FUNCTION: char* ud_insn_hex ( ud* u ) ;
45 FUNCTION: uint ud_insn_len ( ud* u ) ;
46 FUNCTION: char* ud_lookup_mnemonic ( int c ) ;
47
48 : <ud> ( -- ud )
49     "ud" <c-object>
50     dup ud_init
51     dup cell-bits ud_set_mode
52     dup UD_SYN_INTEL ud_set_syntax ;
53
54 SINGLETON: udis-disassembler
55
56 : buf/len ( from to -- buf len ) [ drop <alien> ] [ swap - ] 2bi ;
57
58 : format-disassembly ( lines -- lines' )
59     dup [ second length ] map supremum
60     '[
61         [
62             [ first >hex cell 2 * CHAR: 0 pad-left % ": " % ]
63             [ second _ CHAR: \s pad-right % "  " % ]
64             [ third % ]
65             tri
66         ] "" make
67     ] map ;
68
69 : (disassemble) ( ud -- lines )
70     [
71         dup '[
72             _ ud_disassemble 0 =
73             [ f ] [
74                 _
75                 [ ud_insn_off ]
76                 [ ud_insn_hex ]
77                 [ ud_insn_asm ]
78                 tri 3array , t
79             ] if
80         ] loop
81     ] { } make ;
82
83 M: udis-disassembler disassemble* ( from to -- buffer )
84     [ <ud> ] 2dip {
85         [ drop ud_set_pc ]
86         [ buf/len ud_set_input_buffer ]
87         [ 2drop (disassemble) format-disassembly ]
88     } 3cleave ;
89
90 udis-disassembler disassembler-backend set-global