RPA Toolkit
Build system cleanup...
[rpatk.git] / rvm / rvmreg.h
1 /*
2  *  Regular Pattern Analyzer (RPA)
3  *  Copyright (c) 2009-2010 Martin Stoilov
4  *
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  *  Martin Stoilov <martin@rpasearch.com>
19  */
20
21 #ifndef _RVMREG_H_
22 #define _RVMREG_H_
23
24 //#include "rvm/rvmcpu.h"
25 #include "rlib/robject.h"
26 #include "rlib/rarray.h"
27 #include "rlib/rharray.h"
28 #include "rlib/rcarray.h"
29 #include "rlib/rmap.h"
30 #include "rlib/rstring.h"
31
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 #define RVM_DTYPE_NONE 0
38 #define RVM_DTYPE_UWORD RVM_DTYPE_NONE
39 #define RVM_DTYPE_UNSIGNED RVM_DTYPE_NONE
40 #define RVM_DTYPE_SIGNED 1
41 #define RVM_DTYPE_POINTER 2                     /* Generic pointer, it can point to any memory object */
42 #define RVM_DTYPE_BOOLEAN 3
43 #define RVM_DTYPE_DOUBLE 4
44 #define RVM_DTYPE_PAIR 5
45 #define RVM_DTYPE_UNDEF 6
46 #define RVM_DTYPE_STRPTR 7
47 #define RVM_DTYPE_STRING 8
48 #define RVM_DTYPE_ARRAY 9
49 #define RVM_DTYPE_HARRAY 10
50 #define RVM_DTYPE_NAN 11
51 #define RVM_DTYPE_NULL RVM_DTYPE_NAN
52 #define RVM_DTYPE_MAP 12
53 #define RVM_DTYPE_FUNCTION 13
54 #define RVM_DTYPE_SWIID 14
55 #define RVM_DTYPE_OPHANDLER 15
56 #define RVM_DTYPE_PROPHANDLER 16
57 #define RVM_DTYPE_USER 17
58 #define RVM_DTYPE_SIZE (1 << 5)
59 #define RVM_DTYPE_MASK (RVM_DTYPE_SIZE - 1)
60 #define RVM_DTYPE_MAX (RVM_DTYPE_MASK)
61 #define RVM_DTYPE_USERDEF(__n__) (RVM_DTYPE_USER + (__n__))
62
63 #define RVM_INFOBIT_ROBJECT (1 << 0)
64 #define RVM_INFOBIT_GLOBAL (1 << 1)
65 #define RVM_INFOBIT_LAST (1 << 15)
66 #define RVM_INFOBIT_ALL (RVM_INFOBIT_ROBJECT | RVM_INFOBIT_LAST)
67
68
69 #define RVM_CPUREG_R_PTR(__cpu__, __r__) (&(__cpu__)->r[(__r__)])
70 #define RVM_CPUREG_PTR(__cpu__, __r__) RVM_CPUREG_R_PTR(__cpu__, __r__)
71 #define RVM_CPUREG_GET(__cpu__, __r__) *(RVM_CPUREG_PTR(__cpu__, __r__))
72 #define RVM_CPUREG_SET(__cpu__, __r__, __val__) do { *(RVM_CPUREG_PTR(__cpu__, __r__)) = (__val__); } while (0)
73
74 #define RVM_REG_GETTYPE(__r__) (__r__)->type
75 #define RVM_REG_SETTYPE(__r__, __val__) do { (__r__)->type = (__val__); } while(0);
76 #define RVM_CPUREG_GETTYPE(__cpu__, __r__) RVM_REG_GETTYPE(RVM_CPUREG_PTR(__cpu__, __r__))
77 #define RVM_CPUREG_SETTYPE(__cpu__, __r__, __val__) RVM_REG_SETTYPE(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
78
79 #define RVM_REG_TSTFLAG(__r__, __flag__) ((__r__)->flags & (__flag__)) ? TRUE : FALSE
80 #define RVM_REG_SETFLAG(__r__, __flag__) do { (__r__)->flags |= (__flag__); } while (0)
81 #define RVM_REG_GETFLAGS(__r__) (__r__)->flags
82 #define RVM_REG_CLRFLAG(__r__, __flag__) do { (__r__)->flags &= ~(__flag__); } while (0)
83 #define RVM_REG_ASSIGNFLAGS(__r__, __flags__) do { (__r__)->flags = (__flags__); } while (0)
84 #define RVM_CPUREG_TSTFLAG(__cpu__, __r__, __flag__) RVM_REG_TSTFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
85 #define RVM_CPUREG_SETFLAG(__cpu__, __r__, __flag__) RVM_REG_SETFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
86 #define RVM_CPUREG_GETFLAGS(__cpu__, __r__) RVM_REG_GETFLAGS(RVM_CPUREG_PTR(__cpu__, __r__))
87 #define RVM_CPUREG_CLRFLAG(__cpu__, __r__, __flag__) RVM_REG_CLRFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
88 #define RVM_CPUREG_ASSIGNFLAGS(__cpu__, __r__, __flags__) RVM_REG_ASSIGNFLAGS(RVM_CPUREG_PTR(__cpu__, __r__), __flags__)
89
90
91 #define RVM_REG_GETU(__r__) (__r__)->v.w
92 #define RVM_REG_SETU(__r__, __val__) do { (__r__)->v.w = (ruword)(__val__); } while (0)
93 #define RVM_CPUREG_GETU(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.w
94 #define RVM_CPUREG_SETU(__cpu__, __r__, __val__) RVM_REG_SETU(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
95
96 #define RVM_REG_GETL(__r__) (__r__)->v.l
97 #define RVM_REG_SETL(__r__, __val__) do { (__r__)->v.l = (rword)(__val__); } while (0)
98 #define RVM_CPUREG_GETL(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.l
99 #define RVM_CPUREG_SETL(__cpu__, __r__, __val__) RVM_REG_SETL(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
100
101 #define RVM_REG_GETP(__r__) (__r__)->v.p
102 #define RVM_REG_SETP(__r__, __val__) do { (__r__)->v.p = (rpointer)(__val__); } while (0)
103 #define RVM_CPUREG_GETP(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.p
104 #define RVM_CPUREG_SETP(__cpu__, __r__, __val__) RVM_REG_SETP(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
105
106 #define RVM_REG_GETD(__r__) (__r__)->v.d
107 #define RVM_REG_SETD(__r__, __val__) do { (__r__)->v.d = (double)(__val__); } while (0)
108 #define RVM_CPUREG_GETD(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.d
109 #define RVM_CPUREG_SETD(__cpu__, __r__, __val__) RVM_REG_SETD(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
110
111 #define RVM_REG_GETU64(__r__) (__r__)->v.u64
112 #define RVM_REG_SETU64(__r__, __val__) do { (__r__)->v.u64 = (ruint64)(__val__); } while (0)
113 #define RVM_CPUREG_GETU64(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.u64
114 #define RVM_CPUREG_SETU64(__cpu__, __r__, __val__) RVM_REG_SETU64(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
115
116 #define RVM_REG_GETPAIR(__r__) (__r__)->v.pair
117 #define RVM_REG_SETPAIR(__r__, __val1__, __val2__) do { (__r__)->v.pair.p1 = (__val1__); (__r__)->v.pair.p2 = (__val2__);} while (0)
118 #define RVM_CPUREG_GETPAIR(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.pair
119 #define RVM_CPUREG_SETPAIR(__cpu__, __r__, __val1__, __val2__) RVM_REG_SETPAIR(RVM_CPUREG_PTR(__cpu__, __r__), __val1__, __val2__)
120
121 #define RVM_REG_GETSTR(__r__) (__r__)->v.s
122 #define RVM_REG_SETSTR(__r__, __str__, __size__) do { (__r__)->v.s = (__str__); if ((__size__) == (unsigned int)-1) (__r__)->size = r_strlen(__str__); else (__r__)->size = (__size__);} while (0)
123 #define RVM_CPUREG_GETSTR(__cpu__, __r__) RVM_REG_GETSTR(RVM_CPUREG_PTR(__cpu__, __r__))
124 #define RVM_CPUREG_SETSTR(__cpu__, __r__, __str__, __size__) RVM_REG_SETSTR(RVM_CPUREG_PTR(__cpu__, __r__), __str__, __size__)
125
126
127 #define RVM_REG_GETIP(__r__) (rvm_asmins_t*)((__r__)->v.p)
128 #define RVM_REG_SETIP(__r__, __val__) do { (__r__)->v.p = (rpointer)(__val__); } while (0)
129 #define RVM_REG_INCIP(__r__, __val__) do {rvm_asmins_t *p = RVM_REG_GETIP(__r__); (__r__)->v.p = (rpointer)(p + (__val__)); } while (0)
130 #define RVM_CPUREG_GETIP(__cpu__, __r__) ((rvm_asmins_t*)RVM_CPUREG_PTR(__cpu__, __r__)->v.p)
131 #define RVM_CPUREG_SETIP(__cpu__, __r__, __val__) RVM_REG_SETIP(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
132 #define RVM_CPUREG_INCIP(__cpu__, __r__, __val__) do {rvm_asmins_t *p = RVM_CPUREG_GETIP(__cpu__, __r__); (RVM_CPUREG_PTR(__cpu__, __r__))->v.p = (rpointer)(p + (__val__)); } while (0)
133
134 #define RVM_REG_GETSIZE(__r__) (__r__)->size
135 #define RVM_CPUREG_GETSIZE(__cpu__, __r__) RVM_REG_GETSIZE(RVM_CPUREG_PTR(__cpu__, __r__))
136
137 #define RVM_REG_CLEAR(__r__) do { (__r__)->v.w = 0UL; (__r__)->type = 0; (__r__)->flags = 0;  } while (0)
138 #define RVM_CPUREG_CLEAR(__cpu__, __r__) RVM_REG_CLEAR(RVM_CPUREG_PTR(__cpu__, __r__))
139
140
141
142 #define RVM_MIN_REGSIZE (sizeof(ruword))
143
144 typedef ruint16 rvmreg_type_t;
145 typedef ruint16 rvmreg_flags_t;
146
147 typedef struct rvmreg_s {
148         union {
149                 ruint64 u64;
150                 ruword w;
151                 rword l;
152                 rpointer p;
153                 double d;
154                 char *s;
155                 rpair_t pair;
156                 ruint8 c[RVM_MIN_REGSIZE];
157         } v;
158         ruint32 size;
159         rvmreg_type_t type;
160         rvmreg_flags_t flags;
161 } rvmreg_t;
162
163 rvmreg_t rvm_reg_create_swi(ruword swiid);
164 rvmreg_t rvm_reg_create_string_ansi(const char *s);
165 rvmreg_t rvm_reg_create_string(const rstr_t *s);
166 rvmreg_t rvm_reg_create_array();
167 rvmreg_t rvm_reg_create_harray();
168 rvmreg_t rvm_reg_create_double(double d);
169 rvmreg_t rvm_reg_create_signed(rword l);
170 rvmreg_t rvm_reg_create_pair(ruint32 p1, ruint32 p2);
171 rvmreg_t rvm_reg_create_strptr(char *s, unsigned int size);
172 rvmreg_t rvm_reg_create_pointer(rpointer p);
173 rvmreg_t rvm_reg_create_ophandler(rpointer p);
174 rvmreg_t rvm_reg_create_prophandler(rpointer p);
175 rvmreg_type_t rvm_reg_gettype(const rvmreg_t *r);
176 rboolean rvm_reg_tstflag(const rvmreg_t *r, ruint16 flag);
177 void rvm_reg_init(rvmreg_t *reg);
178 void rvm_reg_cleanup(rvmreg_t *reg);
179 void rvm_reg_array_unref_gcdata(robject_t *obj);
180 void rvm_reg_settype(rvmreg_t *r, unsigned int type);
181 void rvm_reg_setflag(rvmreg_t *r, ruint16 flag);
182 void rvm_reg_clrflag(rvmreg_t *r, ruint16 flag);
183 void rvm_reg_setundef(rvmreg_t *r);
184 void rvm_reg_setunsigned(rvmreg_t *r, ruword u);
185 void rvm_reg_setboolean(rvmreg_t *r, rboolean b);
186 void rvm_reg_setsigned(rvmreg_t *r, rword l);
187 void rvm_reg_setdouble(rvmreg_t *r, double d);
188 void rvm_reg_setpointer(rvmreg_t *r, rpointer p);
189 void rvm_reg_setophandler(rvmreg_t *r, rpointer p);
190 void rvm_reg_setprophandler(rvmreg_t *r, rpointer p);
191 void rvm_reg_setpair(rvmreg_t *r, ruint32 p1, ruint32 p2);
192 void rvm_reg_setstrptr(rvmreg_t *r, char *s, unsigned int size);
193 void rvm_reg_setstring(rvmreg_t *r, rstring_t *ptr);
194 void rvm_reg_setarray(rvmreg_t *r, robject_t *ptr);
195 void rvm_reg_setharray(rvmreg_t *r, robject_t *ptr);
196 void rvm_reg_setjsobject(rvmreg_t *r, robject_t *ptr);
197 void rvm_reg_setmap(rvmreg_t *r, robject_t *ptr);
198 void rvm_reg_setswi(rvmreg_t *r, ruword swiid);
199 int rvm_reg_str2num(rvmreg_t *dst, const rvmreg_t *src);
200 int rvm_reg_str2signed(rvmreg_t *dst, const rvmreg_t *ssrc);
201 int rvm_reg_str2double(rvmreg_t *dst, const rvmreg_t *ssrc);
202
203 int rvm_reg_int(const rvmreg_t *src);
204 rword rvm_reg_signed(const rvmreg_t *src);
205 rboolean rvm_reg_boolean(const rvmreg_t *src);
206 double rvm_reg_double(const rvmreg_t *src);
207 rpointer rvm_reg_pointer(const rvmreg_t *src);
208 rstring_t *rvm_reg_string(const rvmreg_t *src);
209 rmap_t *rvm_reg_jsobject(const rvmreg_t *src);
210
211
212 #ifdef __cplusplus
213 }
214 #endif
215
216 #endif