Windows fixes: there are 4 more calls on Windows than Unix in test6LS. These write...
[dyninst.git] / testsuite / src / dyninst / test_mem_2.C
1 /*
2  * Copyright (c) 1996-2004 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 // $Id: test_mem_2.C,v 1.1 2008/10/30 19:21:53 legendre Exp $
43 /*
44  * #Name: test6_2
45  * #Desc: Store Instrumentation
46  * #Dep: 
47  * #Arch: !(sparc_sun_solaris2_4_test,,rs6000_ibm_aix4_1_test,i386_unknown_linux2_0_test,x86_64_unknown_linux2_4_test,i386_unknown_nt4_0_test,ia64_unknown_linux2_4_test)
48  * #Notes:
49  */
50
51 #include "BPatch.h"
52 #include "BPatch_Vector.h"
53 #include "BPatch_thread.h"
54 #include "BPatch_snippet.h"
55
56 #include "test_lib.h"
57 #include "test6.h"
58
59 #include "dyninst_comp.h"
60 class test_mem_2_Mutator : public DyninstMutator {
61 public:
62   virtual test_results_t executeTest();
63 };
64 extern "C" DLLEXPORT TestMutator *test_mem_2_factory() {
65   return new test_mem_2_Mutator();
66 }
67
68 #ifdef arch_sparc_test
69 static const unsigned int nstores = 13;
70 static BPatch_memoryAccess* storeList[nstores];
71
72 static void init_test_data()
73 {
74   int k=-1;
75
76   storeList[++k] = MK_LS(3,17,-1,1); // ldstub
77   storeList[++k] = MK_LS(0,17,-1,4); // cas
78   storeList[++k] = MK_LS(0,17,-1,8); // casx
79   storeList[++k] = MK_LS(0,17,0,4);  // swap
80
81   storeList[++k] = MK_ST(7,21,-1,1);
82   storeList[++k] = MK_ST(6,21,-1,2);
83   storeList[++k] = MK_ST(4,21,-1,4);
84   storeList[++k] = MK_ST(0,21,0,8);
85   storeList[++k] = MK_ST(0,17,0,4);
86   storeList[++k] = MK_ST(0,17,0,8);
87   storeList[++k] = MK_ST(0,18,0,16);
88   storeList[++k] = MK_ST(4,21,-1,4);
89   storeList[++k] = MK_ST(0,21,0,8);
90 }
91 #endif
92
93 #ifdef arch_power_test
94 static const unsigned int nstores = 32;
95 static BPatch_memoryAccess* storeList[nstores];
96
97 static void init_test_data()
98 {
99   int k=-1;
100
101   storeList[++k] = MK_ST(3, 7, -1, 1);
102   storeList[++k] = MK_ST(1, 7, -1, 1);
103   storeList[++k] = MK_ST(0, 3, 8, 1);
104   storeList[++k] = MK_ST(0, 8, 3, 1);
105
106   storeList[++k] = MK_ST(2, 7, -1, 2);
107   storeList[++k] = MK_ST(6, 7, -1, 2);
108   storeList[++k] = MK_ST(0, 3, 9, 2);
109   storeList[++k] = MK_ST(0, 9, 3, 2);
110
111   storeList[++k] = MK_ST(0, 7, -1, 4);
112   storeList[++k] = MK_ST(4, 7, -1, 4);
113   storeList[++k] = MK_ST(0, 3, 9, 4);
114   storeList[++k] = MK_ST(0, 9, 3, 4);
115
116   storeList[++k] = MK_ST(0, 7, -1, 8);
117   storeList[++k] = MK_ST(0, 7, -1, 8);
118   storeList[++k] = MK_ST(0, 7, 8, 8);
119   storeList[++k] = MK_ST(0, 8, 7, 8);
120
121   storeList[++k] = MK_ST(0, 8, 7, 2);
122   storeList[++k] = MK_ST(0, 9, 7, 4);
123
124   storeList[++k] = MK_ST(-76, 1, -1, 76);
125   storeList[++k] = MK_ST(0, 4, -1, 20);
126
127   storeList[++k] = new BPatch_memoryAccess(NULL,0,
128                                     false, true,
129                                     (long)0, 1, 9,
130                                     (long)0, POWER_XER2531, -1);
131
132   storeList[++k] = MK_ST(0, -1, 3, 4); // 0 means -1 (no register) in ra
133   storeList[++k] = MK_ST(0, -1, 7, 8);
134
135   storeList[++k] = MK_ST(4, 4, -1, 4); // s24
136   storeList[++k] = MK_ST(0, 4, 0, 4);
137   storeList[++k] = MK_ST(0, 4, -1, 4);
138   storeList[++k] = MK_ST(0, -1, 4, 4);  // 0 means -1 (no register) in ra
139   storeList[++k] = MK_ST(0, 6, -1, 8);
140   storeList[++k] = MK_ST(0, 6, 9, 8);
141   storeList[++k] = MK_ST(8, 6, -1, 8);
142   storeList[++k] = MK_ST(0, 9, 7, 8);
143
144   storeList[++k] = MK_ST(0, -1, 4, 4);  // 0 means -1 (no register) in ra
145 }
146 #endif
147
148 static void *divarwp, *dfvarsp, *dfvardp, *dfvartp, *dlargep;
149
150 static void get_vars_addrs(BPatch_image* bip) // from mutatee
151 {
152   BPatch_variableExpr* bpvep_diwarw = bip->findVariable("divarw");
153   BPatch_variableExpr* bpvep_diwars = bip->findVariable("dfvars");
154   BPatch_variableExpr* bpvep_diward = bip->findVariable("dfvard");
155   BPatch_variableExpr* bpvep_diwart = bip->findVariable("dfvart");
156   BPatch_variableExpr* bpvep_dlarge = bip->findVariable("dlarge");
157   
158   divarwp = bpvep_diwarw->getBaseAddr();
159   dfvarsp = bpvep_diwars->getBaseAddr();
160   dfvardp = bpvep_diward->getBaseAddr();
161   dfvartp = bpvep_diwart->getBaseAddr();
162   dlargep = bpvep_dlarge->getBaseAddr();
163 }
164
165
166 #if arch_x86_test
167 #if defined(i386_unknown_nt4_0_test)
168 static const unsigned int nstores = 31;
169 #else
170 static const unsigned int nstores = 27;
171 #endif
172 static BPatch_memoryAccess* storeList[nstores];
173
174 static void init_test_data()
175 {
176   int k=-1;
177
178   storeList[++k] = MK_ST(-4,4,-1,4);
179   storeList[++k] = MK_ST(-4,4,-1,4);
180   storeList[++k] = MK_ST(-4,4,-1,4);
181   storeList[++k] = MK_ST(-4,4,-1,4);
182   storeList[++k] = MK_ST(-4,4,-1,4);
183
184   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // s6
185   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
186   storeList[++k] = MK_LS((long)divarwp,-1,-1,4);
187   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4);
188   storeList[++k] = MK_ST((long)divarwp,-1,-1,4);   // s10
189   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4);
190   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
191 #if defined(i386_unknown_nt4_0_test)
192   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
193 #endif
194   storeList[++k] = MK_STnt((long)divarwp,-1,-1,8); // s12
195   //storeList[++k] = MK_ST(0,7,-1,4);
196   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
197 #if defined(i386_unknown_nt4_0_test)
198   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
199 #endif
200   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
201 #if defined(i386_unknown_nt4_0_test)
202   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
203 #endif
204   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
205 #if defined(i386_unknown_nt4_0_test)
206   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
207 #endif
208   storeList[++k] = new BPatch_memoryAccess(NULL,0,
209                                            false, true,
210                                            0, 7, -1, 0,
211                                            0, -1, 1, 2,
212                                            -1, false);
213   storeList[++k] = MK_ST(0,7,-1,4);
214   //storeList[++k] = MK_SL2(0,7,-1,4,0,6,-1,4); // s15
215   storeList[++k] = MK_SL2vECX(0,7,-1,0,6,-1,2);
216   
217   storeList[++k] = MK_ST((long)dfvarsp,-1,-1,4);
218   storeList[++k] = MK_ST((long)dfvardp,-1,-1,8);
219   storeList[++k] = MK_ST((long)dfvartp,-1,-1,10);
220   storeList[++k] = MK_ST((long)divarwp+2,-1,-1,2);
221   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
222   storeList[++k] = MK_ST((long)divarwp+8,-1,-1,8);
223
224   storeList[++k] = MK_ST((long)divarwp,-1,-1,2);
225   storeList[++k] = MK_ST((long)dlargep,-1,-1,28);
226 }
227 #endif
228
229 #ifdef arch_ia64_test
230 static const unsigned int nstores = 3;
231 static BPatch_memoryAccess* storeList[nstores];
232 static void init_test_data() {
233         storeList[0] = MK_ST( 0, 14, -1, 8 );
234         storeList[1] = MK_ST( 0, 14, -1, 8 );
235         storeList[2] = MK_ST( 0, 14, -1, 8 );
236 }
237 #endif
238
239
240 #ifdef arch_x86_64_test
241 static const unsigned int nstores = 25;
242
243 static BPatch_memoryAccess* storeList[nstores];
244
245 static void init_test_data()
246 {
247   int k=-1;
248
249   // initial 7 pushes
250   storeList[++k] = MK_ST(-8,4,-1,8);
251   storeList[++k] = MK_ST(-8,4,-1,8);
252   storeList[++k] = MK_ST(-8,4,-1,8);
253   storeList[++k] = MK_ST(-8,4,-1,8);
254   storeList[++k] = MK_ST(-8,4,-1,8);
255   storeList[++k] = MK_ST(-8,4,-1,8);
256   storeList[++k] = MK_ST(-8,4,-1,8);
257
258   // stores from semantic test cases
259   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // inc
260   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4); // mov
261   storeList[++k] = MK_LS((long)divarwp,-1,-1,4);   // add
262   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // xchg
263   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // shld
264   storeList[++k] = MK_ST((long)divarwp,-1,-1,4); // mov
265
266   // MMX store
267   storeList[++k] = MK_STnt((long)divarwp,-1,-1,8); // mov
268
269   // REP stores
270   storeList[++k] = new BPatch_memoryAccess(NULL,0,
271                                            false, true,
272                                            0, 7, -1, 0,
273                                            0, -1, 1, 2,
274                                            -1, false);  // rep stosl
275   storeList[++k] = new BPatch_memoryAccess(NULL,0,
276                                            false, true,
277                                            0, 7, -1, 0,
278                                            0, -1, 1, 2,
279                                            -1, false);  // rep stosl
280   storeList[++k] = MK_SL2vECX(0,7,-1,0,6,-1,2);
281
282
283   // x87
284   storeList[++k] = MK_ST((long)dfvarsp,-1,-1,4);
285   storeList[++k] = MK_ST((long)dfvardp,-1,-1,8);
286   storeList[++k] = MK_ST((long)dfvartp,-1,-1,10);
287   storeList[++k] = MK_ST((long)divarwp+2,-1,-1,2);
288   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
289   storeList[++k] = MK_ST((long)divarwp+8,-1,-1,8);
290
291   storeList[++k] = MK_ST((long)divarwp,-1,-1,2);
292   storeList[++k] = MK_ST((long)dlargep,-1,-1,28);
293 }
294 #endif
295
296
297 // Find and instrument loads with a simple function call snippet
298 // static int mutatorTest(BPatch_thread *bpthr, BPatch_image *bpimg)
299 test_results_t test_mem_2_Mutator::executeTest() {
300   int testnum = 2;
301   const char* testdesc = "store instrumentation";
302 #if !defined(arch_sparc_test) && !defined(arch_power_test) && !defined(arch_x86_test) && !defined(arch_x86_64_test) && !defined(arch_ia64_test)
303   //skiptest(testnum, testdesc);
304   return SKIPPED;
305 #else
306 #if defined(arch_x86_test) || defined(arch_x86_64_test)
307   get_vars_addrs(appImage);
308 #endif
309   init_test_data();
310
311   BPatch_Set<BPatch_opCode> stores;
312   stores.insert(BPatch_opStore);
313
314   BPatch_Vector<BPatch_function *> found_funcs;
315   const char *inFunction = "loadsnstores";
316   if ((NULL == appImage->findFunction(inFunction, found_funcs, 1)) || !found_funcs.size()) {
317     logerror("    Unable to find function %s\n",
318             inFunction);
319     return FAILED;
320   }
321        
322   if (1 < found_funcs.size()) {
323     logerror("%s[%d]:  WARNING  : found %d functions named %s.  Using the first.\n", 
324             __FILE__, __LINE__, found_funcs.size(), inFunction);
325   }
326        
327   BPatch_Vector<BPatch_point *> *res1 = found_funcs[0]->findPoint(stores);
328
329   if(!res1)
330     failtest(testnum, testdesc, "Unable to find function \"loadsnstores\".\n");
331
332   dumpvect(res1, "Stores");
333
334   if((*res1).size() != nstores)
335   {
336       logerror("%s[%d]:  FAILURE: expected %d stores, got %d\n", __FILE__, __LINE__, nstores, (*res1).size());
337       failtest(testnum, testdesc, "Number of stores seems wrong in function \"loadsnstores.\"\n");
338   }
339   if(!validate(res1, storeList, "store"))
340     failtest(testnum, testdesc, "Store sequence failed validation.\n");
341
342   if (instCall(appThread, "Store", res1) < 0) {
343     return FAILED;
344   }
345   return PASSED;
346 #endif
347 }
348
349 // External Interface
350 // extern "C" TEST_DLL_EXPORT int test6_2_mutatorMAIN(ParameterDict &param)
351 // {
352 //     BPatch *bpatch;
353 //     bpatch = (BPatch *)(param["bpatch"]->getPtr());
354 //     BPatch_thread *appThread = (BPatch_thread *)(param["appThread"]->getPtr());
355
356 //     // Get log file pointers
357 //     FILE *outlog = (FILE *)(param["outlog"]->getPtr());
358 //     FILE *errlog = (FILE *)(param["errlog"]->getPtr());
359 //     setOutputLog(outlog);
360 //     setErrorLog(errlog);
361
362 //     // Read the program's image and get an associated image object
363 //     BPatch_image *appImage = appThread->getImage();
364
365 //     // Run mutator code
366 //     return mutatorTest(appThread, appImage);
367 // }