blob: 95e1717b8b4bbd31df842e2a31fdfa3132a88373 [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);
81 printf("Basic Block %d, Start %x, nbytes %d\n",
82 bb_number, orig_addr, orig_nbytes);
83 assert(orig_nbytes >= 1 && orig_nbytes <= N_ORIGBUF);
84 for (i = 0; i < orig_nbytes; i++) {
85 assert(1 == sscanf(&linebuf[2 + 3*i], "%x", &u));
86 origbuf[i] = (UChar)u;
87 }
88
89 tres =
90 LibVEX_Translate ( InsnSetX86, InsnSetX86,
91 origbuf, (Addr64)orig_addr, &orig_used,
92 transbuf, N_TRANSBUF, &trans_used,
93 NULL, NULL );
94 assert(tres == TransOK);
95 assert(orig_used == orig_nbytes);
96 }
97
98 fclose(f);
99
100#if 0
sewardjce605f92004-07-05 14:39:15 +0000101 Int* p;
102 Int i, j, n = 0;
sewardj887a11a2004-07-05 17:26:47 +0000103 LibVEX_Init ( &failure_exit, &log_bytes,
sewardjce605f92004-07-05 14:39:15 +0000104 1, 1, False, 10 );
105 for (j = 0; j < 5000; j++) {
sewardj887a11a2004-07-05 17:26:47 +0000106 LibVEX_Clear(False);
sewardjce605f92004-07-05 14:39:15 +0000107 for (i = 0; i < 2000; i++) {
108 n++;
109 p = LibVEX_Alloc(16);
110 p[0] = p[1] = p[2] = p[3] = 44;
111 }
112 }
sewardj887a11a2004-07-05 17:26:47 +0000113 LibVEX_Clear(True);
sewardjce605f92004-07-05 14:39:15 +0000114 printf("Did %d allocs\n", n);
sewardjced9fe52004-07-07 11:55:36 +0000115#endif
sewardjce605f92004-07-05 14:39:15 +0000116 return 0;
117}
118
119/*---------------------------------------------------------------*/
120/*--- Test (old) ---*/
121/*---------------------------------------------------------------*/
122
123#if 0
124
sewardj887a11a2004-07-05 17:26:47 +0000125#include "libvex_basictypes.h"
sewardjce605f92004-07-05 14:39:15 +0000126#include "ir_defs.h"
127#include "host_regs.h"
128#include "x86h_defs.h"
129
130
sewardjc97096c2004-06-30 09:28:04 +0000131/* HACK */
132extern
sewardj2cd80dc2004-07-02 15:20:40 +0000133HInstrArray* /* not really, but for the time being ... */
sewardj194d54a2004-07-03 19:08:18 +0000134 iselBB_X86Instr ( IRBB* bb );
sewardj0ec33252004-07-03 13:30:00 +0000135
sewardjc97096c2004-06-30 09:28:04 +0000136
137int main ( void )
138{
sewardj2cd80dc2004-07-02 15:20:40 +0000139 HInstrArray* vcode;
140 IRBB* bb;
141 IRTypeEnv* env = newIRTypeEnv();
sewardjc97096c2004-06-30 09:28:04 +0000142
sewardj12952ef2004-07-03 14:52:19 +0000143 IRTemp t0 = 0;
sewardjc97096c2004-06-30 09:28:04 +0000144 IRTemp t1 = 1;
145 IRTemp t2 = 2;
146
sewardj12952ef2004-07-03 14:52:19 +0000147 addToIRTypeEnv ( env, t0, Ity_I32 );
sewardjc97096c2004-06-30 09:28:04 +0000148 addToIRTypeEnv ( env, t1, Ity_I32 );
149 addToIRTypeEnv ( env, t2, Ity_I32 );
150
sewardj12952ef2004-07-03 14:52:19 +0000151 IRStmt* s10 = IRStmt_Tmp(t0, IRExpr_Const(IRConst_U32(0x2000)));
152 IRStmt* s11 = IRStmt_Tmp(t1, IRExpr_Const(IRConst_U32(0x2001)));
153 IRStmt* s12 = IRStmt_Tmp(t2, IRExpr_Const(IRConst_U32(0x2002)));
sewardj0ec33252004-07-03 13:30:00 +0000154
sewardjc97096c2004-06-30 09:28:04 +0000155 IRStmt* s1 = IRStmt_Put(8,4, IRExpr_Const(IRConst_U32(99)) );
sewardj12952ef2004-07-03 14:52:19 +0000156#if 0
sewardjc97096c2004-06-30 09:28:04 +0000157 IRStmt* s2 = IRStmt_Put(7,4, IRExpr_Binop(Iop_Add32,
158 IRExpr_Tmp(t1),
159 IRExpr_Const(IRConst_U32(55))));
sewardj12952ef2004-07-03 14:52:19 +0000160#endif
161
162 IRStmt* s2 = IRStmt_Put(9,4,
163 IRExpr_Binop(Iop_Shl32,
164 IRExpr_Tmp(t0),
165 IRExpr_Binop(Iop_Add32,
166 IRExpr_Tmp(t1),
167 IRExpr_Tmp(t2))));
168
169
sewardj0ec33252004-07-03 13:30:00 +0000170 s10->link = s11;
sewardj12952ef2004-07-03 14:52:19 +0000171 s11->link = s12;
172 s12->link = s1;
sewardjc97096c2004-06-30 09:28:04 +0000173 s1->link = s2;
174
sewardj0ec33252004-07-03 13:30:00 +0000175 bb = mk_IRBB(env, s10, IRNext_UJump(IRConst_U32(-65565)));
sewardjc97096c2004-06-30 09:28:04 +0000176
177 printf("bb is ...\n");
178 ppIRBB(stdout, bb);
179 printf("\n");
180
sewardj3b9d65e2004-07-03 19:52:16 +0000181 if (0)
sewardj194d54a2004-07-03 19:08:18 +0000182 vcode = iselBB_X86Instr(bb);
sewardj12952ef2004-07-03 14:52:19 +0000183 else
sewardj2cd80dc2004-07-02 15:20:40 +0000184 {
sewardj0ec33252004-07-03 13:30:00 +0000185 Int i;
186 HReg vr0 = mkHReg(0, HRcInt, True);
187 HReg vr1 = mkHReg(1, HRcInt, True);
188 HReg vr2 = mkHReg(2, HRcInt, True);
189 HReg vr3 = mkHReg(3, HRcInt, True);
190 HReg eax = hregX86_EAX();
191 HReg ebx = hregX86_EBX();
192 HReg ecx = hregX86_ECX();
193 HReg edx = hregX86_EDX();
194 HReg ebp = hregX86_EBP();
195 vcode = newHInstrArray();
sewardj3b9d65e2004-07-03 19:52:16 +0000196 vcode->n_vregs = 4;
sewardj0ec33252004-07-03 13:30:00 +0000197
198 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
199 X86RMI_Imm(0x10001), vr0));
200 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
201 X86RMI_Imm(0x10101), vr1));
202 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
203 X86RMI_Imm(0x10201), vr2));
204 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
205 X86RMI_Imm(0x10301), vr3));
206
207 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
208 X86RMI_Imm(0x99999), eax));
209 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
210 X86RMI_Imm(0x99999), edx));
211
212 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
213 X86RI_Reg(vr0),
214 X86AMode_IR(0x100, ebp)));
215 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
216 X86RI_Reg(vr1),
217 X86AMode_IR(0x101, ebp)));
218 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
219 X86RI_Reg(vr2),
220 X86AMode_IR(0x101, ebp)));
221 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
222 X86RI_Reg(vr3),
223 X86AMode_IR(0x101, ebp)));
224 printf("\nBefore\n");
225 for (i = 0; i < vcode->arr_used; i++) {
226 ppX86Instr(stdout, vcode->arr[i]);
227 printf("\n");
228 }
229 printf("\n");
230 }
231
232 {
233 Int i;
sewardj2cd80dc2004-07-02 15:20:40 +0000234 HInstrArray* rcode;
235 HReg rregs_to_use[4];
236 rregs_to_use[0] = hregX86_EAX();
237 rregs_to_use[1] = hregX86_EBX();
238 rregs_to_use[2] = hregX86_ECX();
239 rregs_to_use[3] = hregX86_EDX();
sewardjc97096c2004-06-30 09:28:04 +0000240
sewardj2cd80dc2004-07-02 15:20:40 +0000241 rcode =
sewardj194d54a2004-07-03 19:08:18 +0000242 doRegisterAllocation(vcode,
sewardj3b9d65e2004-07-03 19:52:16 +0000243 rregs_to_use, 3, /* rregs */
sewardj12952ef2004-07-03 14:52:19 +0000244 isMove_X86Instr,
sewardj2cd80dc2004-07-02 15:20:40 +0000245 getRegUsage_X86Instr,
246 mapRegs_X86Instr,
sewardj0ec33252004-07-03 13:30:00 +0000247 genSpill_X86,
248 genReload_X86
sewardj2cd80dc2004-07-02 15:20:40 +0000249 );
250
sewardj0ec33252004-07-03 13:30:00 +0000251 printf("\nAfter\n");
252 for (i = 0; i < rcode->arr_used; i++) {
253 ppX86Instr(stdout, rcode->arr[i]);
254 printf("\n");
sewardj2cd80dc2004-07-02 15:20:40 +0000255 }
sewardj0ec33252004-07-03 13:30:00 +0000256 printf("\n");
257 }
258
sewardjc97096c2004-06-30 09:28:04 +0000259 return 0;
260}
sewardjce605f92004-07-05 14:39:15 +0000261#endif