]> gitweb.factorcode.org Git - factor.git/blob - basis/tools/disassembler/udis/udis.factor
Switch to https urls
[factor.git] / basis / tools / disassembler / udis / udis.factor
1 ! Copyright (C) 2008, 2010 Slava Pestov, Jorge Acereda Macia.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types alien.libraries alien.syntax arrays
4 combinators destructors io kernel layouts libc make math
5 math.order math.parser namespaces sequences system
6 tools.disassembler.private tools.memory ;
7 IN: tools.disassembler.udis
8
9 << "libudis86" {
10     { [ os windows? ] [ "libudis86.dll" ] }
11     { [ os macosx? ] [ "libudis86.dylib" ] }
12     { [ os unix? ] [ "libudis86.so" ] }
13 } cond cdecl add-library >>
14
15 LIBRARY: libudis86
16
17 TYPEDEF: void ud
18
19 FUNCTION: void ud_translate_intel ( ud* u )
20 FUNCTION: void ud_translate_att ( ud* u )
21
22 : UD_SYN_INTEL ( -- addr ) &: ud_translate_intel ; inline
23 : UD_SYN_ATT ( -- addr ) &: ud_translate_att ; inline
24
25 CONSTANT: UD_EOI          -1
26 CONSTANT: UD_INP_CACHE_SZ 32
27 CONSTANT: UD_VENDOR_AMD   0
28 CONSTANT: UD_VENDOR_INTEL 1
29
30 FUNCTION: void ud_init ( ud* u )
31 FUNCTION: void ud_set_mode ( ud* u, uchar mode )
32 FUNCTION: void ud_set_pc ( ud* u, ulonglong pc )
33 FUNCTION: void ud_set_input_buffer ( ud* u, c-string offset, size_t size )
34 FUNCTION: void ud_set_vendor ( ud* u, uint vendor )
35 FUNCTION: void ud_set_syntax ( ud* u, void* syntax )
36 FUNCTION: void ud_input_skip ( ud* u, size_t size )
37 FUNCTION: int ud_input_end ( ud* u )
38 FUNCTION: uint ud_decode ( ud* u )
39 FUNCTION: uint ud_disassemble ( ud* u )
40 FUNCTION: c-string ud_insn_asm ( ud* u )
41 FUNCTION: void* ud_insn_ptr ( ud* u )
42 FUNCTION: ulonglong ud_insn_off ( ud* u )
43 FUNCTION: c-string ud_insn_hex ( ud* u )
44 FUNCTION: uint ud_insn_len ( ud* u )
45 FUNCTION: c-string ud_lookup_mnemonic ( int c )
46
47 : <ud> ( -- ud )
48     1,000 malloc &free
49     dup ud_init
50     dup cell-bits ud_set_mode
51     dup UD_SYN_INTEL ud_set_syntax ;
52
53 : with-ud ( ..a quot: ( ..a ud -- ..b ) -- ..b )
54     [ [ [ <ud> ] dip call ] with-destructors ] with-code-blocks ; inline
55
56 SINGLETON: udis-disassembler
57
58 <PRIVATE
59
60 : buf/len ( from to -- buf len ) [ drop <alien> ] [ swap - ] 2bi ;
61
62 : make-disassembly ( ud -- lines )
63     [
64         [ dup ud_disassemble 0 = ] [
65             dup
66             [ ud_insn_off ]
67             [ ud_insn_hex ]
68             [ ud_insn_asm ]
69             tri 3array ,
70         ] until drop
71     ] { } make ;
72
73 PRIVATE>
74
75 M: udis-disassembler disassemble*
76     '[
77         _ _
78         [ drop ud_set_pc ]
79         [ buf/len ud_set_input_buffer ]
80         [ 2drop make-disassembly write-disassembly ]
81         3tri
82     ] with-ud ;
83
84 udis-disassembler disassembler-backend set-global