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 fry kernel layouts libc make math
5 math.order math.parser namespaces sequences splitting system
6 tools.disassembler.private tools.disassembler.utils tools.memory
8 IN: tools.disassembler.udis
11 { [ os windows? ] [ "libudis86.dll" ] }
12 { [ os macosx? ] [ "libudis86.dylib" ] }
13 { [ os unix? ] [ "libudis86.so" ] }
14 } cond cdecl add-library >>
20 FUNCTION: void ud_translate_intel ( ud* u ) ;
21 FUNCTION: void ud_translate_att ( ud* u ) ;
23 : UD_SYN_INTEL ( -- addr ) &: ud_translate_intel ; inline
24 : UD_SYN_ATT ( -- addr ) &: ud_translate_att ; inline
27 CONSTANT: UD_INP_CACHE_SZ 32
28 CONSTANT: UD_VENDOR_AMD 0
29 CONSTANT: UD_VENDOR_INTEL 1
31 FUNCTION: void ud_init ( ud* u ) ;
32 FUNCTION: void ud_set_mode ( ud* u, uchar mode ) ;
33 FUNCTION: void ud_set_pc ( ud* u, ulonglong pc ) ;
34 FUNCTION: void ud_set_input_buffer ( ud* u, c-string 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: c-string ud_insn_asm ( ud* u ) ;
42 FUNCTION: void* ud_insn_ptr ( ud* u ) ;
43 FUNCTION: ulonglong ud_insn_off ( ud* u ) ;
44 FUNCTION: c-string ud_insn_hex ( ud* u ) ;
45 FUNCTION: uint ud_insn_len ( ud* u ) ;
46 FUNCTION: c-string ud_lookup_mnemonic ( int c ) ;
51 dup cell-bits ud_set_mode
52 dup UD_SYN_INTEL ud_set_syntax ;
54 : with-ud ( ..a quot: ( ..a ud -- ..b ) -- ..b )
55 [ [ [ <ud> ] dip call ] with-destructors ] with-code-blocks ; inline
57 SINGLETON: udis-disassembler
59 : buf/len ( from to -- buf len ) [ drop <alien> ] [ swap - ] 2bi ;
61 : resolve-call ( str -- str' ) "0x" split1-last [ resolve-xt append ] when* ;
63 : format-disassembly ( lines -- lines' )
64 dup [ second length ] [ max ] map-reduce
67 [ first >hex cell 2 * CHAR: 0 pad-head % ": " % ]
68 [ second _ CHAR: \s pad-tail % " " % ]
69 [ third resolve-call % ]
74 : (disassemble) ( ud -- lines )
88 M: udis-disassembler disassemble* ( from to -- buffer )
92 [ buf/len ud_set_input_buffer ]
93 [ 2drop (disassemble) format-disassembly ]
97 udis-disassembler disassembler-backend set-global