Rename newtestsuite to testsuite
[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 static const unsigned int nstores = 23;
168 static BPatch_memoryAccess* storeList[nstores];
169
170 static void init_test_data()
171 {
172   int k=-1;
173
174   storeList[++k] = MK_ST(-4,4,-1,4);
175   storeList[++k] = MK_ST(-4,4,-1,4);
176   storeList[++k] = MK_ST(-4,4,-1,4);
177   storeList[++k] = MK_ST(-4,4,-1,4);
178   storeList[++k] = MK_ST(-4,4,-1,4);
179
180   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // s6
181   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
182   storeList[++k] = MK_LS((long)divarwp,-1,-1,4);
183   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4);
184   storeList[++k] = MK_ST((long)divarwp,-1,-1,4);   // s10
185   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4);
186
187   storeList[++k] = MK_STnt((long)divarwp,-1,-1,8); // s12
188   //storeList[++k] = MK_ST(0,7,-1,4);
189   storeList[++k] = new BPatch_memoryAccess(NULL,0,
190                                            false, true,
191                                            0, 7, -1, 0,
192                                            0, -1, 1, 2,
193                                            -1, false);
194   storeList[++k] = MK_ST(0,7,-1,4);
195   //storeList[++k] = MK_SL2(0,7,-1,4,0,6,-1,4); // s15
196   storeList[++k] = MK_SL2vECX(0,7,-1,0,6,-1,2);
197   
198   storeList[++k] = MK_ST((long)dfvarsp,-1,-1,4);
199   storeList[++k] = MK_ST((long)dfvardp,-1,-1,8);
200   storeList[++k] = MK_ST((long)dfvartp,-1,-1,10);
201   storeList[++k] = MK_ST((long)divarwp+2,-1,-1,2);
202   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
203   storeList[++k] = MK_ST((long)divarwp+8,-1,-1,8);
204
205   storeList[++k] = MK_ST((long)divarwp,-1,-1,2);
206   storeList[++k] = MK_ST((long)dlargep,-1,-1,28);
207 }
208 #endif
209
210 #ifdef arch_ia64_test
211 static const unsigned int nstores = 3;
212 static BPatch_memoryAccess* storeList[nstores];
213 static void init_test_data() {
214         storeList[0] = MK_ST( 0, 14, -1, 8 );
215         storeList[1] = MK_ST( 0, 14, -1, 8 );
216         storeList[2] = MK_ST( 0, 14, -1, 8 );
217 }
218 #endif
219
220
221 #ifdef arch_x86_64_test
222 static const unsigned int nstores = 25;
223
224 static BPatch_memoryAccess* storeList[nstores];
225
226 static void init_test_data()
227 {
228   int k=-1;
229
230   // initial 7 pushes
231   storeList[++k] = MK_ST(-8,4,-1,8);
232   storeList[++k] = MK_ST(-8,4,-1,8);
233   storeList[++k] = MK_ST(-8,4,-1,8);
234   storeList[++k] = MK_ST(-8,4,-1,8);
235   storeList[++k] = MK_ST(-8,4,-1,8);
236   storeList[++k] = MK_ST(-8,4,-1,8);
237   storeList[++k] = MK_ST(-8,4,-1,8);
238
239   // stores from semantic test cases
240   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // inc
241   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4); // mov
242   storeList[++k] = MK_LS((long)divarwp,-1,-1,4);   // add
243   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // xchg
244   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // shld
245   storeList[++k] = MK_ST((long)divarwp,-1,-1,4); // mov
246
247   // MMX store
248   storeList[++k] = MK_STnt((long)divarwp,-1,-1,8); // mov
249
250   // REP stores
251   storeList[++k] = new BPatch_memoryAccess(NULL,0,
252                                            false, true,
253                                            0, 7, -1, 0,
254                                            0, -1, 1, 2,
255                                            -1, false);  // rep stosl
256   storeList[++k] = new BPatch_memoryAccess(NULL,0,
257                                            false, true,
258                                            0, 7, -1, 0,
259                                            0, -1, 1, 2,
260                                            -1, false);  // rep stosl
261   storeList[++k] = MK_SL2vECX(0,7,-1,0,6,-1,2);
262
263
264   // x87
265   storeList[++k] = MK_ST((long)dfvarsp,-1,-1,4);
266   storeList[++k] = MK_ST((long)dfvardp,-1,-1,8);
267   storeList[++k] = MK_ST((long)dfvartp,-1,-1,10);
268   storeList[++k] = MK_ST((long)divarwp+2,-1,-1,2);
269   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
270   storeList[++k] = MK_ST((long)divarwp+8,-1,-1,8);
271
272   storeList[++k] = MK_ST((long)divarwp,-1,-1,2);
273   storeList[++k] = MK_ST((long)dlargep,-1,-1,28);
274 }
275 #endif
276
277
278 // Find and instrument loads with a simple function call snippet
279 // static int mutatorTest(BPatch_thread *bpthr, BPatch_image *bpimg)
280 test_results_t test_mem_2_Mutator::executeTest() {
281   int testnum = 2;
282   const char* testdesc = "store instrumentation";
283 #if !defined(arch_sparc_test) && !defined(arch_power_test) && !defined(arch_x86_test) && !defined(arch_x86_64_test) && !defined(arch_ia64_test)
284   //skiptest(testnum, testdesc);
285   return SKIPPED;
286 #else
287 #if defined(arch_x86_test) || defined(arch_x86_64_test)
288   get_vars_addrs(appImage);
289 #endif
290   init_test_data();
291
292   BPatch_Set<BPatch_opCode> stores;
293   stores.insert(BPatch_opStore);
294
295   BPatch_Vector<BPatch_function *> found_funcs;
296   const char *inFunction = "loadsnstores";
297   if ((NULL == appImage->findFunction(inFunction, found_funcs, 1)) || !found_funcs.size()) {
298     logerror("    Unable to find function %s\n",
299             inFunction);
300     return FAILED;
301   }
302        
303   if (1 < found_funcs.size()) {
304     logerror("%s[%d]:  WARNING  : found %d functions named %s.  Using the first.\n", 
305             __FILE__, __LINE__, found_funcs.size(), inFunction);
306   }
307        
308   BPatch_Vector<BPatch_point *> *res1 = found_funcs[0]->findPoint(stores);
309
310   if(!res1)
311     failtest(testnum, testdesc, "Unable to find function \"loadsnstores\".\n");
312
313   dumpvect(res1, "Stores");
314
315   if((*res1).size() != nstores)
316     failtest(testnum, testdesc, "Number of stores seems wrong in function \"loadsnstores.\"\n");
317
318   if(!validate(res1, storeList, "store"))
319     failtest(testnum, testdesc, "Store sequence failed validation.\n");
320
321   if (instCall(appThread, "Store", res1) < 0) {
322     return FAILED;
323   }
324   return PASSED;
325 #endif
326 }
327
328 // External Interface
329 // extern "C" TEST_DLL_EXPORT int test6_2_mutatorMAIN(ParameterDict &param)
330 // {
331 //     BPatch *bpatch;
332 //     bpatch = (BPatch *)(param["bpatch"]->getPtr());
333 //     BPatch_thread *appThread = (BPatch_thread *)(param["appThread"]->getPtr());
334
335 //     // Get log file pointers
336 //     FILE *outlog = (FILE *)(param["outlog"]->getPtr());
337 //     FILE *errlog = (FILE *)(param["errlog"]->getPtr());
338 //     setOutputLog(outlog);
339 //     setErrorLog(errlog);
340
341 //     // Read the program's image and get an associated image object
342 //     BPatch_image *appImage = appThread->getImage();
343
344 //     // Run mutator code
345 //     return mutatorTest(appThread, appImage);
346 // }