1 ! Copyright (C) 2008, 2010 Slava Pestov, Jorge Acereda Macia.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: tools.disassembler namespaces combinators alien
4 alien.syntax alien.c-types lexer parser kernel sequences layouts
5 math math.order alien.libraries math.parser system make fry
6 arrays libc destructors tools.memory tools.disassembler.utils
7 tools.disassembler.private splitting alien.data classes.struct ;
8 IN: tools.disassembler.udis
12 { [ os macosx? ] [ "libudis86.0.dylib" ] }
13 { [ os unix? ] [ "libudis86.so.0" ] }
14 { [ os winnt? ] [ "libudis86.dll" ] }
15 } cond "cdecl" add-library
36 { inp_buff_end uchar* }
39 { insn_offset ulonglong }
40 { insn_hexcode char[32] }
41 { insn_buffer char[64] }
48 { operand ud_operand[3] }
64 { implicit_addr uchar }
68 { inp_cache uchar[256] }
69 { inp_sess uchar[64] }
70 { itab_entry void* } ;
72 FUNCTION: void ud_translate_intel ( ud* u ) ;
73 FUNCTION: void ud_translate_att ( ud* u ) ;
75 : UD_SYN_INTEL ( -- addr ) &: ud_translate_intel ; inline
76 : UD_SYN_ATT ( -- addr ) &: ud_translate_att ; inline
79 CONSTANT: UD_INP_CACHE_SZ 32
80 CONSTANT: UD_VENDOR_AMD 0
81 CONSTANT: UD_VENDOR_INTEL 1
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 ) ;
101 ud malloc-struct &free
103 dup cell-bits ud_set_mode
104 dup UD_SYN_INTEL ud_set_syntax ;
106 : with-ud ( quot: ( ud -- ) -- )
107 [ [ [ <ud> ] dip call ] with-destructors ] with-code-blocks ; inline
109 SINGLETON: udis-disassembler
111 : buf/len ( from to -- buf len ) [ drop <alien> ] [ swap - ] 2bi ;
113 : resolve-call ( str -- str' ) "0x" split1-last [ resolve-xt append ] when* ;
115 : format-disassembly ( lines -- lines' )
116 dup [ second length ] [ max ] map-reduce
119 [ first >hex cell 2 * CHAR: 0 pad-head % ": " % ]
120 [ second _ CHAR: \s pad-tail % " " % ]
121 [ third resolve-call % ]
126 : (disassemble) ( ud -- lines )
140 M: udis-disassembler disassemble* ( from to -- buffer )
144 [ buf/len ud_set_input_buffer ]
145 [ 2drop (disassemble) format-disassembly ]
149 udis-disassembler disassembler-backend set-global