211280e0aa22d243bbbba0ab8c9efa4921c7f480
[mono.git] / mono / jit / jit.h
1 #ifndef _MONO_JIT_JIT_H_
2 #define _MONO_JIT_JIT_H_
3
4 #include <signal.h>
5
6 #include <mono/metadata/loader.h>
7 #include <mono/metadata/object.h>
8
9 #include "regset.h"
10 #include "mempool.h"
11
12 typedef struct _MBTree MBTree;
13
14 typedef enum {
15         VAL_UNKNOWN,
16         VAL_I32,
17         VAL_I64,
18         VAL_POINTER,
19         VAL_DOUBLE, // must be the last - do not reorder
20 } MonoValueType;
21
22 typedef enum {
23         MONO_ARGVAR,
24         MONO_LOCALVAR,
25         MONO_TEMPVAR,
26 } MonoValueKind;
27
28 typedef struct {
29         MonoValueType type;
30         MonoValueKind kind;
31         int offset;
32         int size;
33 } MonoVarInfo;
34
35 typedef struct {
36         unsigned block_id:15;
37         unsigned is_block_start:1;
38 } MonoBytecodeInfo;
39
40 typedef struct {
41         unsigned reached:1;
42         unsigned finished:1;
43
44         gint32        cli_addr;  /* start instruction */
45         gint32        length;    /* length of stream */
46         GPtrArray    *forest;
47         MBTree      **instack;
48         gint32        indepth;
49         MBTree      **outstack;
50         gint32        outdepth;
51         gint32        addr;
52 } MonoBBlock;
53
54 typedef struct {
55         unsigned          has_vtarg:1;
56         MonoMethod       *method;
57         MonoBytecodeInfo *bcinfo;
58         MonoBBlock       *bblocks;
59         int               block_count;
60         GArray           *varinfo;
61         gint32            locals_size;
62         gint32            args_size;
63         guint16          *intvars;
64         guint16           excvar;
65
66         MonoMemPool      *mp;
67         guint8           *start;
68         guint8           *code;
69         gint32            code_size;
70         MonoRegSet       *rs;
71         guint32           epilog;
72         guint32           args_start_index;
73         guint32           locals_start_index;
74         gint              invalid;
75 } MonoFlowGraph;
76
77 typedef struct {
78         MonoMethod *m;
79         int args_size;
80         int vtype_num;
81 } MethodCallInfo;
82
83 typedef struct {
84         guint32  flags;
85         gpointer try_start;
86         gpointer try_end;
87         gpointer handler_start;
88         guint32  token_or_filter;
89 } MonoJitExceptionInfo;
90
91 typedef struct {
92         MonoMethod *method;
93         gpointer code_start;
94         int      code_size;
95         guint32  used_regs;
96         unsigned num_clauses;
97         MonoJitExceptionInfo *clauses;
98
99 } MonoJitInfo;
100
101 typedef GArray MonoJitInfoTable;
102
103 extern gboolean mono_jit_dump_asm;
104 extern gboolean mono_jit_dump_forest;
105 extern gboolean mono_jit_trace_calls;
106 extern MonoJitInfoTable *mono_jit_info_table;
107 extern gpointer mono_end_of_stack;
108
109 MonoJitInfoTable *
110 mono_jit_info_table_new    (void);
111
112 int
113 mono_jit_info_table_index  (MonoJitInfoTable *table, gpointer addr);
114
115 void
116 mono_jit_info_table_add    (MonoJitInfoTable *table, MonoJitInfo *ji);
117
118 MonoJitInfo *
119 mono_jit_info_table_find   (MonoJitInfoTable *table, gpointer addr);
120
121 void
122 arch_handle_exception      (struct sigcontext *ctx, gpointer obj);
123
124 void
125 mono_jit_abort             (MonoObject *obj);
126
127 MonoFlowGraph *
128 mono_cfg_new               (MonoMethod *method, MonoMemPool *mp);
129
130 void
131 mono_cfg_free              (MonoFlowGraph *cfg);
132
133 MBTree *
134 mono_ctree_new             (MonoMemPool *mp, int op, MBTree *left, 
135                             MBTree *right);
136 MBTree *
137 mono_ctree_new_leaf        (MonoMemPool *mp, int op);
138
139 void
140 mono_analyze_flow          (MonoFlowGraph *cfg);
141
142 void
143 mono_analyze_stack         (MonoFlowGraph *cfg);
144
145 void
146 mono_disassemble_code      (guint8 *code, int size);
147
148 gpointer 
149 arch_compile_method        (MonoMethod *method);
150
151 gpointer
152 arch_create_jit_trampoline (MonoMethod *method);
153
154 gpointer
155 arch_create_simple_jit_trampoline (MonoMethod *method);
156
157 /* some handy debugging functions */
158
159 void
160 mono_print_ctree           (MBTree *tree);
161
162 void
163 mono_print_forest          (GPtrArray *forest);
164
165 #endif