blob: 568333db7f7bb54d7ac81f3c10652333acda4dbe [file] [log] [blame]
sewardjc97096c2004-06-30 09:28:04 +00001
2/*---------------------------------------------------------------*/
3/*--- ---*/
4/*--- This file (test_main.c) is ---*/
5/*--- Copyright (c) 2004 OpenWorks LLP. All rights reserved. ---*/
6/*--- ---*/
7/*---------------------------------------------------------------*/
8
9#include <stdio.h>
10#include <stdlib.h>
sewardjced9fe52004-07-07 11:55:36 +000011#include <assert.h>
sewardjc97096c2004-06-30 09:28:04 +000012
sewardjced9fe52004-07-07 11:55:36 +000013#include "libvex_basictypes.h"
14#include "libvex.h"
sewardjc97096c2004-06-30 09:28:04 +000015
16/*---------------------------------------------------------------*/
17/*--- Test ---*/
18/*---------------------------------------------------------------*/
19
sewardjce605f92004-07-05 14:39:15 +000020
sewardj2b515872004-07-05 20:50:45 +000021__attribute__ ((noreturn))
sewardjce605f92004-07-05 14:39:15 +000022void failure_exit ( void )
23{
24 fprintf(stdout, "VEX did failure_exit. Bye.\n");
25 exit(1);
26}
27
28void log_bytes ( Char* bytes, Int nbytes )
29{
30 fwrite ( bytes, 1, nbytes, stdout );
31}
32
sewardjced9fe52004-07-07 11:55:36 +000033#define N_LINEBUF 10000
34Char linebuf[N_LINEBUF];
35
36#define N_ORIGBUF 200
37#define N_TRANSBUF 1000
38
39UChar origbuf[N_ORIGBUF];
40UChar transbuf[N_TRANSBUF];
41
42
43int main ( int argc, char** argv )
sewardjce605f92004-07-05 14:39:15 +000044{
sewardjced9fe52004-07-07 11:55:36 +000045 FILE* f;
46 Int i;
47 UInt u;
48 Addr32 orig_addr;
49 Int bb_number;
50 Int orig_nbytes, trans_used, orig_used;
51 TranslateResult tres;
52
53 if (argc != 2) {
54 fprintf(stderr, "usage: vex file.org\n");
55 exit(1);
56 }
57 f = fopen(argv[1], "r");
58 if (!f) {
59 fprintf(stderr, "can't open `%s'\n", argv[1]);
60 exit(1);
61 }
62
63 LibVEX_Init ( &failure_exit, &log_bytes,
sewardjd733aed2004-07-07 12:00:42 +000064 1, 1, True, 100 );
sewardjced9fe52004-07-07 11:55:36 +000065
66 while (!feof(f)) {
67 fgets(linebuf, N_LINEBUF,f);
68 //printf("%s", linebuf);
69 assert(linebuf[0] != 0);
70 if (linebuf[0] != '.') continue;
71 /* first line is: . bb-number bb-addr n-bytes */
72 assert(3 == sscanf(&linebuf[1], " %d %x %d\n",
73 & bb_number,
74 & orig_addr, & orig_nbytes ));
75 assert(orig_nbytes >= 1);
76 assert(!feof(f));
77 fgets(linebuf, N_LINEBUF,f);
78 assert(linebuf[0] == '.');
79 /* second line is: . byte byte byte etc */
80 //printf("%s", linebuf);
sewardjfbcaf332004-07-08 01:46:01 +000081 printf("\n\n============ Basic Block %d, "
82 "Start %x, nbytes %d ============\n\n",
sewardjced9fe52004-07-07 11:55:36 +000083 bb_number, orig_addr, orig_nbytes);
84 assert(orig_nbytes >= 1 && orig_nbytes <= N_ORIGBUF);
85 for (i = 0; i < orig_nbytes; i++) {
86 assert(1 == sscanf(&linebuf[2 + 3*i], "%x", &u));
87 origbuf[i] = (UChar)u;
88 }
89
90 tres =
91 LibVEX_Translate ( InsnSetX86, InsnSetX86,
92 origbuf, (Addr64)orig_addr, &orig_used,
93 transbuf, N_TRANSBUF, &trans_used,
94 NULL, NULL );
95 assert(tres == TransOK);
96 assert(orig_used == orig_nbytes);
97 }
98
99 fclose(f);
100
101#if 0
sewardjce605f92004-07-05 14:39:15 +0000102 Int* p;
103 Int i, j, n = 0;
sewardj887a11a2004-07-05 17:26:47 +0000104 LibVEX_Init ( &failure_exit, &log_bytes,
sewardjce605f92004-07-05 14:39:15 +0000105 1, 1, False, 10 );
106 for (j = 0; j < 5000; j++) {
sewardj887a11a2004-07-05 17:26:47 +0000107 LibVEX_Clear(False);
sewardjce605f92004-07-05 14:39:15 +0000108 for (i = 0; i < 2000; i++) {
109 n++;
110 p = LibVEX_Alloc(16);
111 p[0] = p[1] = p[2] = p[3] = 44;
112 }
113 }
sewardj887a11a2004-07-05 17:26:47 +0000114 LibVEX_Clear(True);
sewardjce605f92004-07-05 14:39:15 +0000115 printf("Did %d allocs\n", n);
sewardjced9fe52004-07-07 11:55:36 +0000116#endif
sewardjce605f92004-07-05 14:39:15 +0000117 return 0;
118}
119
120/*---------------------------------------------------------------*/
121/*--- Test (old) ---*/
122/*---------------------------------------------------------------*/
123
124#if 0
125
sewardj887a11a2004-07-05 17:26:47 +0000126#include "libvex_basictypes.h"
sewardjce605f92004-07-05 14:39:15 +0000127#include "ir_defs.h"
128#include "host_regs.h"
129#include "x86h_defs.h"
130
131
sewardjc97096c2004-06-30 09:28:04 +0000132/* HACK */
133extern
sewardj2cd80dc2004-07-02 15:20:40 +0000134HInstrArray* /* not really, but for the time being ... */
sewardj194d54a2004-07-03 19:08:18 +0000135 iselBB_X86Instr ( IRBB* bb );
sewardj0ec33252004-07-03 13:30:00 +0000136
sewardjc97096c2004-06-30 09:28:04 +0000137
138int main ( void )
139{
sewardj2cd80dc2004-07-02 15:20:40 +0000140 HInstrArray* vcode;
141 IRBB* bb;
142 IRTypeEnv* env = newIRTypeEnv();
sewardjc97096c2004-06-30 09:28:04 +0000143
sewardj12952ef2004-07-03 14:52:19 +0000144 IRTemp t0 = 0;
sewardjc97096c2004-06-30 09:28:04 +0000145 IRTemp t1 = 1;
146 IRTemp t2 = 2;
147
sewardj12952ef2004-07-03 14:52:19 +0000148 addToIRTypeEnv ( env, t0, Ity_I32 );
sewardjc97096c2004-06-30 09:28:04 +0000149 addToIRTypeEnv ( env, t1, Ity_I32 );
150 addToIRTypeEnv ( env, t2, Ity_I32 );
151
sewardj12952ef2004-07-03 14:52:19 +0000152 IRStmt* s10 = IRStmt_Tmp(t0, IRExpr_Const(IRConst_U32(0x2000)));
153 IRStmt* s11 = IRStmt_Tmp(t1, IRExpr_Const(IRConst_U32(0x2001)));
154 IRStmt* s12 = IRStmt_Tmp(t2, IRExpr_Const(IRConst_U32(0x2002)));
sewardj0ec33252004-07-03 13:30:00 +0000155
sewardjc97096c2004-06-30 09:28:04 +0000156 IRStmt* s1 = IRStmt_Put(8,4, IRExpr_Const(IRConst_U32(99)) );
sewardj12952ef2004-07-03 14:52:19 +0000157#if 0
sewardjc97096c2004-06-30 09:28:04 +0000158 IRStmt* s2 = IRStmt_Put(7,4, IRExpr_Binop(Iop_Add32,
159 IRExpr_Tmp(t1),
160 IRExpr_Const(IRConst_U32(55))));
sewardj12952ef2004-07-03 14:52:19 +0000161#endif
162
163 IRStmt* s2 = IRStmt_Put(9,4,
164 IRExpr_Binop(Iop_Shl32,
165 IRExpr_Tmp(t0),
166 IRExpr_Binop(Iop_Add32,
167 IRExpr_Tmp(t1),
168 IRExpr_Tmp(t2))));
169
170
sewardj0ec33252004-07-03 13:30:00 +0000171 s10->link = s11;
sewardj12952ef2004-07-03 14:52:19 +0000172 s11->link = s12;
173 s12->link = s1;
sewardjc97096c2004-06-30 09:28:04 +0000174 s1->link = s2;
175
sewardj0ec33252004-07-03 13:30:00 +0000176 bb = mk_IRBB(env, s10, IRNext_UJump(IRConst_U32(-65565)));
sewardjc97096c2004-06-30 09:28:04 +0000177
178 printf("bb is ...\n");
179 ppIRBB(stdout, bb);
180 printf("\n");
181
sewardj3b9d65e2004-07-03 19:52:16 +0000182 if (0)
sewardj194d54a2004-07-03 19:08:18 +0000183 vcode = iselBB_X86Instr(bb);
sewardj12952ef2004-07-03 14:52:19 +0000184 else
sewardj2cd80dc2004-07-02 15:20:40 +0000185 {
sewardj0ec33252004-07-03 13:30:00 +0000186 Int i;
187 HReg vr0 = mkHReg(0, HRcInt, True);
188 HReg vr1 = mkHReg(1, HRcInt, True);
189 HReg vr2 = mkHReg(2, HRcInt, True);
190 HReg vr3 = mkHReg(3, HRcInt, True);
191 HReg eax = hregX86_EAX();
192 HReg ebx = hregX86_EBX();
193 HReg ecx = hregX86_ECX();
194 HReg edx = hregX86_EDX();
195 HReg ebp = hregX86_EBP();
196 vcode = newHInstrArray();
sewardj3b9d65e2004-07-03 19:52:16 +0000197 vcode->n_vregs = 4;
sewardj0ec33252004-07-03 13:30:00 +0000198
199 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
200 X86RMI_Imm(0x10001), vr0));
201 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
202 X86RMI_Imm(0x10101), vr1));
203 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
204 X86RMI_Imm(0x10201), vr2));
205 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
206 X86RMI_Imm(0x10301), vr3));
207
208 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
209 X86RMI_Imm(0x99999), eax));
210 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
211 X86RMI_Imm(0x99999), edx));
212
213 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
214 X86RI_Reg(vr0),
215 X86AMode_IR(0x100, ebp)));
216 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
217 X86RI_Reg(vr1),
218 X86AMode_IR(0x101, ebp)));
219 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
220 X86RI_Reg(vr2),
221 X86AMode_IR(0x101, ebp)));
222 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
223 X86RI_Reg(vr3),
224 X86AMode_IR(0x101, ebp)));
225 printf("\nBefore\n");
226 for (i = 0; i < vcode->arr_used; i++) {
227 ppX86Instr(stdout, vcode->arr[i]);
228 printf("\n");
229 }
230 printf("\n");
231 }
232
233 {
234 Int i;
sewardj2cd80dc2004-07-02 15:20:40 +0000235 HInstrArray* rcode;
236 HReg rregs_to_use[4];
237 rregs_to_use[0] = hregX86_EAX();
238 rregs_to_use[1] = hregX86_EBX();
239 rregs_to_use[2] = hregX86_ECX();
240 rregs_to_use[3] = hregX86_EDX();
sewardjc97096c2004-06-30 09:28:04 +0000241
sewardj2cd80dc2004-07-02 15:20:40 +0000242 rcode =
sewardj194d54a2004-07-03 19:08:18 +0000243 doRegisterAllocation(vcode,
sewardj3b9d65e2004-07-03 19:52:16 +0000244 rregs_to_use, 3, /* rregs */
sewardj12952ef2004-07-03 14:52:19 +0000245 isMove_X86Instr,
sewardj2cd80dc2004-07-02 15:20:40 +0000246 getRegUsage_X86Instr,
247 mapRegs_X86Instr,
sewardj0ec33252004-07-03 13:30:00 +0000248 genSpill_X86,
249 genReload_X86
sewardj2cd80dc2004-07-02 15:20:40 +0000250 );
251
sewardj0ec33252004-07-03 13:30:00 +0000252 printf("\nAfter\n");
253 for (i = 0; i < rcode->arr_used; i++) {
sewardjfbcaf332004-07-08 01:46:01 +0000254 ppX86Instr(stdout, rcode->arr[i]);
255 printf("\n");
sewardj2cd80dc2004-07-02 15:20:40 +0000256 }
sewardj0ec33252004-07-03 13:30:00 +0000257 printf("\n");
258 }
259
sewardjc97096c2004-06-30 09:28:04 +0000260 return 0;
261}
sewardjce605f92004-07-05 14:39:15 +0000262#endif