blob: c3d0daa318da71f792ba3b0f3b2cab53d78f95d8 [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))
sewardj41f43bc2004-07-08 14:23:22 +000022static
sewardjce605f92004-07-05 14:39:15 +000023void failure_exit ( void )
24{
25 fprintf(stdout, "VEX did failure_exit. Bye.\n");
26 exit(1);
27}
28
sewardj41f43bc2004-07-08 14:23:22 +000029static
sewardjce605f92004-07-05 14:39:15 +000030void log_bytes ( Char* bytes, Int nbytes )
31{
32 fwrite ( bytes, 1, nbytes, stdout );
33}
34
sewardjced9fe52004-07-07 11:55:36 +000035#define N_LINEBUF 10000
sewardj41f43bc2004-07-08 14:23:22 +000036static Char linebuf[N_LINEBUF];
sewardjced9fe52004-07-07 11:55:36 +000037
38#define N_ORIGBUF 200
39#define N_TRANSBUF 1000
40
sewardj41f43bc2004-07-08 14:23:22 +000041static Char origbuf[N_ORIGBUF];
42static Char transbuf[N_TRANSBUF];
sewardjced9fe52004-07-07 11:55:36 +000043
44
45int main ( int argc, char** argv )
sewardjce605f92004-07-05 14:39:15 +000046{
sewardjced9fe52004-07-07 11:55:36 +000047 FILE* f;
48 Int i;
49 UInt u;
50 Addr32 orig_addr;
51 Int bb_number;
52 Int orig_nbytes, trans_used, orig_used;
53 TranslateResult tres;
54
55 if (argc != 2) {
56 fprintf(stderr, "usage: vex file.org\n");
57 exit(1);
58 }
59 f = fopen(argv[1], "r");
60 if (!f) {
61 fprintf(stderr, "can't open `%s'\n", argv[1]);
62 exit(1);
63 }
64
65 LibVEX_Init ( &failure_exit, &log_bytes,
sewardjd733aed2004-07-07 12:00:42 +000066 1, 1, True, 100 );
sewardjced9fe52004-07-07 11:55:36 +000067
68 while (!feof(f)) {
69 fgets(linebuf, N_LINEBUF,f);
70 //printf("%s", linebuf);
71 assert(linebuf[0] != 0);
72 if (linebuf[0] != '.') continue;
73 /* first line is: . bb-number bb-addr n-bytes */
74 assert(3 == sscanf(&linebuf[1], " %d %x %d\n",
75 & bb_number,
76 & orig_addr, & orig_nbytes ));
77 assert(orig_nbytes >= 1);
78 assert(!feof(f));
79 fgets(linebuf, N_LINEBUF,f);
80 assert(linebuf[0] == '.');
81 /* second line is: . byte byte byte etc */
82 //printf("%s", linebuf);
sewardjfbcaf332004-07-08 01:46:01 +000083 printf("\n\n============ Basic Block %d, "
84 "Start %x, nbytes %d ============\n\n",
sewardjced9fe52004-07-07 11:55:36 +000085 bb_number, orig_addr, orig_nbytes);
86 assert(orig_nbytes >= 1 && orig_nbytes <= N_ORIGBUF);
87 for (i = 0; i < orig_nbytes; i++) {
88 assert(1 == sscanf(&linebuf[2 + 3*i], "%x", &u));
89 origbuf[i] = (UChar)u;
90 }
91
92 tres =
93 LibVEX_Translate ( InsnSetX86, InsnSetX86,
94 origbuf, (Addr64)orig_addr, &orig_used,
95 transbuf, N_TRANSBUF, &trans_used,
96 NULL, NULL );
97 assert(tres == TransOK);
98 assert(orig_used == orig_nbytes);
99 }
100
101 fclose(f);
102
103#if 0
sewardjce605f92004-07-05 14:39:15 +0000104 Int* p;
105 Int i, j, n = 0;
sewardj887a11a2004-07-05 17:26:47 +0000106 LibVEX_Init ( &failure_exit, &log_bytes,
sewardjce605f92004-07-05 14:39:15 +0000107 1, 1, False, 10 );
108 for (j = 0; j < 5000; j++) {
sewardj887a11a2004-07-05 17:26:47 +0000109 LibVEX_Clear(False);
sewardjce605f92004-07-05 14:39:15 +0000110 for (i = 0; i < 2000; i++) {
111 n++;
112 p = LibVEX_Alloc(16);
113 p[0] = p[1] = p[2] = p[3] = 44;
114 }
115 }
sewardj887a11a2004-07-05 17:26:47 +0000116 LibVEX_Clear(True);
sewardjce605f92004-07-05 14:39:15 +0000117 printf("Did %d allocs\n", n);
sewardjced9fe52004-07-07 11:55:36 +0000118#endif
sewardjce605f92004-07-05 14:39:15 +0000119 return 0;
120}
121
122/*---------------------------------------------------------------*/
123/*--- Test (old) ---*/
124/*---------------------------------------------------------------*/
125
126#if 0
127
sewardj887a11a2004-07-05 17:26:47 +0000128#include "libvex_basictypes.h"
sewardjce605f92004-07-05 14:39:15 +0000129#include "ir_defs.h"
130#include "host_regs.h"
131#include "x86h_defs.h"
132
133
sewardjc97096c2004-06-30 09:28:04 +0000134/* HACK */
135extern
sewardj2cd80dc2004-07-02 15:20:40 +0000136HInstrArray* /* not really, but for the time being ... */
sewardj194d54a2004-07-03 19:08:18 +0000137 iselBB_X86Instr ( IRBB* bb );
sewardj0ec33252004-07-03 13:30:00 +0000138
sewardjc97096c2004-06-30 09:28:04 +0000139
140int main ( void )
141{
sewardj2cd80dc2004-07-02 15:20:40 +0000142 HInstrArray* vcode;
143 IRBB* bb;
144 IRTypeEnv* env = newIRTypeEnv();
sewardjc97096c2004-06-30 09:28:04 +0000145
sewardj12952ef2004-07-03 14:52:19 +0000146 IRTemp t0 = 0;
sewardjc97096c2004-06-30 09:28:04 +0000147 IRTemp t1 = 1;
148 IRTemp t2 = 2;
149
sewardj12952ef2004-07-03 14:52:19 +0000150 addToIRTypeEnv ( env, t0, Ity_I32 );
sewardjc97096c2004-06-30 09:28:04 +0000151 addToIRTypeEnv ( env, t1, Ity_I32 );
152 addToIRTypeEnv ( env, t2, Ity_I32 );
153
sewardj12952ef2004-07-03 14:52:19 +0000154 IRStmt* s10 = IRStmt_Tmp(t0, IRExpr_Const(IRConst_U32(0x2000)));
155 IRStmt* s11 = IRStmt_Tmp(t1, IRExpr_Const(IRConst_U32(0x2001)));
156 IRStmt* s12 = IRStmt_Tmp(t2, IRExpr_Const(IRConst_U32(0x2002)));
sewardj0ec33252004-07-03 13:30:00 +0000157
sewardjc97096c2004-06-30 09:28:04 +0000158 IRStmt* s1 = IRStmt_Put(8,4, IRExpr_Const(IRConst_U32(99)) );
sewardj12952ef2004-07-03 14:52:19 +0000159#if 0
sewardjc97096c2004-06-30 09:28:04 +0000160 IRStmt* s2 = IRStmt_Put(7,4, IRExpr_Binop(Iop_Add32,
161 IRExpr_Tmp(t1),
162 IRExpr_Const(IRConst_U32(55))));
sewardj12952ef2004-07-03 14:52:19 +0000163#endif
164
165 IRStmt* s2 = IRStmt_Put(9,4,
166 IRExpr_Binop(Iop_Shl32,
167 IRExpr_Tmp(t0),
168 IRExpr_Binop(Iop_Add32,
169 IRExpr_Tmp(t1),
170 IRExpr_Tmp(t2))));
171
172
sewardj0ec33252004-07-03 13:30:00 +0000173 s10->link = s11;
sewardj12952ef2004-07-03 14:52:19 +0000174 s11->link = s12;
175 s12->link = s1;
sewardjc97096c2004-06-30 09:28:04 +0000176 s1->link = s2;
177
sewardj0ec33252004-07-03 13:30:00 +0000178 bb = mk_IRBB(env, s10, IRNext_UJump(IRConst_U32(-65565)));
sewardjc97096c2004-06-30 09:28:04 +0000179
180 printf("bb is ...\n");
181 ppIRBB(stdout, bb);
182 printf("\n");
183
sewardj3b9d65e2004-07-03 19:52:16 +0000184 if (0)
sewardj194d54a2004-07-03 19:08:18 +0000185 vcode = iselBB_X86Instr(bb);
sewardj12952ef2004-07-03 14:52:19 +0000186 else
sewardj2cd80dc2004-07-02 15:20:40 +0000187 {
sewardj0ec33252004-07-03 13:30:00 +0000188 Int i;
189 HReg vr0 = mkHReg(0, HRcInt, True);
190 HReg vr1 = mkHReg(1, HRcInt, True);
191 HReg vr2 = mkHReg(2, HRcInt, True);
192 HReg vr3 = mkHReg(3, HRcInt, True);
193 HReg eax = hregX86_EAX();
194 HReg ebx = hregX86_EBX();
195 HReg ecx = hregX86_ECX();
196 HReg edx = hregX86_EDX();
197 HReg ebp = hregX86_EBP();
198 vcode = newHInstrArray();
sewardj3b9d65e2004-07-03 19:52:16 +0000199 vcode->n_vregs = 4;
sewardj0ec33252004-07-03 13:30:00 +0000200
201 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
202 X86RMI_Imm(0x10001), vr0));
203 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
204 X86RMI_Imm(0x10101), vr1));
205 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
206 X86RMI_Imm(0x10201), vr2));
207 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
208 X86RMI_Imm(0x10301), vr3));
209
210 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
211 X86RMI_Imm(0x99999), eax));
212 addHInstr(vcode, X86Instr_Alu32R(Xalu_MOV,
213 X86RMI_Imm(0x99999), edx));
214
215 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
216 X86RI_Reg(vr0),
217 X86AMode_IR(0x100, ebp)));
218 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
219 X86RI_Reg(vr1),
220 X86AMode_IR(0x101, ebp)));
221 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
222 X86RI_Reg(vr2),
223 X86AMode_IR(0x101, ebp)));
224 addHInstr(vcode, X86Instr_Alu32M(Xalu_MOV,
225 X86RI_Reg(vr3),
226 X86AMode_IR(0x101, ebp)));
227 printf("\nBefore\n");
228 for (i = 0; i < vcode->arr_used; i++) {
229 ppX86Instr(stdout, vcode->arr[i]);
230 printf("\n");
231 }
232 printf("\n");
233 }
234
235 {
236 Int i;
sewardj2cd80dc2004-07-02 15:20:40 +0000237 HInstrArray* rcode;
238 HReg rregs_to_use[4];
239 rregs_to_use[0] = hregX86_EAX();
240 rregs_to_use[1] = hregX86_EBX();
241 rregs_to_use[2] = hregX86_ECX();
242 rregs_to_use[3] = hregX86_EDX();
sewardjc97096c2004-06-30 09:28:04 +0000243
sewardj2cd80dc2004-07-02 15:20:40 +0000244 rcode =
sewardj194d54a2004-07-03 19:08:18 +0000245 doRegisterAllocation(vcode,
sewardj3b9d65e2004-07-03 19:52:16 +0000246 rregs_to_use, 3, /* rregs */
sewardj12952ef2004-07-03 14:52:19 +0000247 isMove_X86Instr,
sewardj2cd80dc2004-07-02 15:20:40 +0000248 getRegUsage_X86Instr,
249 mapRegs_X86Instr,
sewardj0ec33252004-07-03 13:30:00 +0000250 genSpill_X86,
251 genReload_X86
sewardj2cd80dc2004-07-02 15:20:40 +0000252 );
253
sewardj0ec33252004-07-03 13:30:00 +0000254 printf("\nAfter\n");
255 for (i = 0; i < rcode->arr_used; i++) {
sewardjfbcaf332004-07-08 01:46:01 +0000256 ppX86Instr(stdout, rcode->arr[i]);
257 printf("\n");
sewardj2cd80dc2004-07-02 15:20:40 +0000258 }
sewardj0ec33252004-07-03 13:30:00 +0000259 printf("\n");
260 }
261
sewardjc97096c2004-06-30 09:28:04 +0000262 return 0;
263}
sewardjce605f92004-07-05 14:39:15 +0000264#endif