]> gitweb.factorcode.org Git - factor.git/blob - basis/tools/disassembler/udis/udis.factor
move some allocation words that don't really have much to do with c types out of...
[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.order alien.libraries
6 math.parser system make fry arrays libc destructors
7 tools.disassembler.utils splitting alien.data ;
8 IN: tools.disassembler.udis
9
10 <<
11 "libudis86" {
12     { [ os macosx? ] [ "libudis86.0.dylib" ] }
13     { [ os unix? ] [ "libudis86.so.0" ] }
14     { [ os winnt? ] [ "libudis86.dll" ] }
15 } cond "cdecl" add-library
16 >>
17
18 LIBRARY: libudis86
19
20 C-STRUCT: ud_operand
21     { "int" "type" }
22     { "uchar" "size" }
23     { "ulonglong" "lval" }
24     { "int" "base" }
25     { "int" "index" }
26     { "uchar" "offset" }
27     { "uchar" "scale" } ;
28
29 C-STRUCT: ud
30     { "void*" "inp_hook" }
31     { "uchar" "inp_curr" }
32     { "uchar" "inp_fill" }
33     { "FILE*" "inp_file" }
34     { "uchar" "inp_ctr" }
35     { "uchar*" "inp_buff" }
36     { "uchar*" "inp_buff_end" }
37     { "uchar" "inp_end" }
38     { "void*" "translator" }
39     { "ulonglong" "insn_offset" }
40     { "char[32]" "insn_hexcode" }
41     { "char[64]" "insn_buffer" }
42     { "uint" "insn_fill" }
43     { "uchar" "dis_mode" }
44     { "ulonglong" "pc" }
45     { "uchar" "vendor" }
46     { "struct map_entry*" "mapen" }
47     { "int" "mnemonic" }
48     { "ud_operand[3]" "operand" }
49     { "uchar" "error" }
50     { "uchar" "pfx_rex" }
51     { "uchar" "pfx_seg" }
52     { "uchar" "pfx_opr" }
53     { "uchar" "pfx_adr" }
54     { "uchar" "pfx_lock" }
55     { "uchar" "pfx_rep" }
56     { "uchar" "pfx_repe" }
57     { "uchar" "pfx_repne" }
58     { "uchar" "pfx_insn" }
59     { "uchar" "default64" }
60     { "uchar" "opr_mode" }
61     { "uchar" "adr_mode" }
62     { "uchar" "br_far" }
63     { "uchar" "br_near" }
64     { "uchar" "implicit_addr" }
65     { "uchar" "c1" }
66     { "uchar" "c2" }
67     { "uchar" "c3" }
68     { "uchar[256]" "inp_cache" }
69     { "uchar[64]" "inp_sess" }
70     { "ud_itab_entry*" "itab_entry" } ;
71
72 FUNCTION: void ud_translate_intel ( ud* u ) ;
73 FUNCTION: void ud_translate_att ( ud* u ) ;
74
75 : UD_SYN_INTEL ( -- addr ) &: ud_translate_intel ; inline
76 : UD_SYN_ATT ( -- addr ) &: ud_translate_att ; inline
77
78 CONSTANT: UD_EOI          -1
79 CONSTANT: UD_INP_CACHE_SZ 32
80 CONSTANT: UD_VENDOR_AMD   0
81 CONSTANT: UD_VENDOR_INTEL 1
82
83 FUNCTION: void ud_init ( ud* u ) ;
84 FUNCTION: void ud_set_mode ( ud* u, uchar mode ) ;
85 FUNCTION: void ud_set_pc ( ud* u, ulonglong pc ) ;
86 FUNCTION: void ud_set_input_buffer ( ud* u, uchar* offset, size_t size ) ;
87 FUNCTION: void ud_set_vendor ( ud* u, uint vendor ) ;
88 FUNCTION: void ud_set_syntax ( ud* u, void* syntax ) ;
89 FUNCTION: void ud_input_skip ( ud* u, size_t size ) ;
90 FUNCTION: int ud_input_end ( ud* u ) ;
91 FUNCTION: uint ud_decode ( ud* u ) ;
92 FUNCTION: uint ud_disassemble ( ud* u ) ;
93 FUNCTION: char* ud_insn_asm ( ud* u ) ;
94 FUNCTION: void* ud_insn_ptr ( ud* u ) ;
95 FUNCTION: ulonglong ud_insn_off ( ud* u ) ;
96 FUNCTION: char* ud_insn_hex ( ud* u ) ;
97 FUNCTION: uint ud_insn_len ( ud* u ) ;
98 FUNCTION: char* ud_lookup_mnemonic ( int c ) ;
99
100 : <ud> ( -- ud )
101     "ud" malloc-object &free
102     dup ud_init
103     dup cell-bits ud_set_mode
104     dup UD_SYN_INTEL ud_set_syntax ;
105
106 : with-ud ( quot: ( ud -- ) -- )
107     [ [ [ <ud> ] dip call ] with-destructors ] with-words-xt ; inline
108
109 SINGLETON: udis-disassembler
110
111 : buf/len ( from to -- buf len ) [ drop <alien> ] [ swap - ] 2bi ;
112
113 : resolve-call ( str -- str' ) "0x" split1-last [ resolve-xt append ] when* ;
114
115 : format-disassembly ( lines -- lines' )
116     dup [ second length ] [ max ] map-reduce
117     '[
118         [
119             [ first >hex cell 2 * CHAR: 0 pad-head % ": " % ]
120             [ second _ CHAR: \s pad-tail % "  " % ]
121             [ third resolve-call % ]
122             tri
123         ] "" make
124     ] map ;
125
126 : (disassemble) ( ud -- lines )
127     [
128         dup '[
129             _ ud_disassemble 0 =
130             [ f ] [
131                 _
132                 [ ud_insn_off ]
133                 [ ud_insn_hex ]
134                 [ ud_insn_asm ]
135                 tri 3array , t
136             ] if
137         ] loop
138     ] { } make ;
139
140 M: udis-disassembler disassemble* ( from to -- buffer )
141     '[
142         _ _
143         [ drop ud_set_pc ]
144         [ buf/len ud_set_input_buffer ]
145         [ 2drop (disassemble) format-disassembly ]
146         3tri
147     ] with-ud ;
148
149 udis-disassembler disassembler-backend set-global