Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / dyninst / test_mem_2.C
1 /*
2  * Copyright (c) 1996-2009 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  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 // $Id: test_mem_2.C,v 1.1 2008/10/30 19:21:53 legendre Exp $
33 /*
34  * #Name: test6_2
35  * #Desc: Store Instrumentation
36  * #Dep: 
37  * #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)
38  * #Notes:
39  */
40
41 #include "BPatch.h"
42 #include "BPatch_Vector.h"
43 #include "BPatch_thread.h"
44 #include "BPatch_snippet.h"
45
46 #include "test_lib.h"
47 #include "test6.h"
48
49 #include "dyninst_comp.h"
50 class test_mem_2_Mutator : public DyninstMutator {
51 public:
52   virtual test_results_t executeTest();
53 };
54 extern "C" DLLEXPORT TestMutator *test_mem_2_factory() {
55   return new test_mem_2_Mutator();
56 }
57
58 #ifdef arch_sparc_test
59 static const unsigned int nstores = 13;
60 static BPatch_memoryAccess* storeList[nstores];
61
62 static void init_test_data()
63 {
64   int k=-1;
65
66   storeList[++k] = MK_LS(3,17,-1,1); // ldstub
67   storeList[++k] = MK_LS(0,17,-1,4); // cas
68   storeList[++k] = MK_LS(0,17,-1,8); // casx
69   storeList[++k] = MK_LS(0,17,0,4);  // swap
70
71   storeList[++k] = MK_ST(7,21,-1,1);
72   storeList[++k] = MK_ST(6,21,-1,2);
73   storeList[++k] = MK_ST(4,21,-1,4);
74   storeList[++k] = MK_ST(0,21,0,8);
75   storeList[++k] = MK_ST(0,17,0,4);
76   storeList[++k] = MK_ST(0,17,0,8);
77   storeList[++k] = MK_ST(0,18,0,16);
78   storeList[++k] = MK_ST(4,21,-1,4);
79   storeList[++k] = MK_ST(0,21,0,8);
80 }
81 #endif
82
83 #ifdef arch_power_test
84 static const unsigned int nstores = 32;
85 static BPatch_memoryAccess* storeList[nstores];
86
87 static void init_test_data()
88 {
89   int k=-1;
90
91   storeList[++k] = MK_ST(3, 7, -1, 1);
92   storeList[++k] = MK_ST(1, 7, -1, 1);
93   storeList[++k] = MK_ST(0, 3, 8, 1);
94   storeList[++k] = MK_ST(0, 8, 3, 1);
95
96   storeList[++k] = MK_ST(2, 7, -1, 2);
97   storeList[++k] = MK_ST(6, 7, -1, 2);
98   storeList[++k] = MK_ST(0, 3, 9, 2);
99   storeList[++k] = MK_ST(0, 9, 3, 2);
100
101   storeList[++k] = MK_ST(0, 7, -1, 4);
102   storeList[++k] = MK_ST(4, 7, -1, 4);
103   storeList[++k] = MK_ST(0, 3, 9, 4);
104   storeList[++k] = MK_ST(0, 9, 3, 4);
105
106   storeList[++k] = MK_ST(0, 7, -1, 8);
107   storeList[++k] = MK_ST(0, 7, -1, 8);
108   storeList[++k] = MK_ST(0, 7, 8, 8);
109   storeList[++k] = MK_ST(0, 8, 7, 8);
110
111   storeList[++k] = MK_ST(0, 8, 7, 2);
112   storeList[++k] = MK_ST(0, 9, 7, 4);
113
114   storeList[++k] = MK_ST(-76, 1, -1, 76);
115   storeList[++k] = MK_ST(0, 4, -1, 20);
116
117   storeList[++k] = new BPatch_memoryAccess(NULL,0,
118                                     false, true,
119                                     (long)0, 1, 9,
120                                     (long)0, POWER_XER2531, -1);
121
122   storeList[++k] = MK_ST(0, -1, 3, 4); // 0 means -1 (no register) in ra
123   storeList[++k] = MK_ST(0, -1, 7, 8);
124
125   storeList[++k] = MK_ST(4, 4, -1, 4); // s24
126   storeList[++k] = MK_ST(0, 4, 0, 4);
127   storeList[++k] = MK_ST(0, 4, -1, 4);
128   storeList[++k] = MK_ST(0, -1, 4, 4);  // 0 means -1 (no register) in ra
129   storeList[++k] = MK_ST(0, 6, -1, 8);
130   storeList[++k] = MK_ST(0, 6, 9, 8);
131   storeList[++k] = MK_ST(8, 6, -1, 8);
132   storeList[++k] = MK_ST(0, 9, 7, 8);
133
134   storeList[++k] = MK_ST(0, -1, 4, 4);  // 0 means -1 (no register) in ra
135 }
136 #endif
137
138 static void *divarwp, *dfvarsp, *dfvardp, *dfvartp, *dlargep;
139
140 static void get_vars_addrs(BPatch_image* bip) // from mutatee
141 {
142   BPatch_variableExpr* bpvep_diwarw = bip->findVariable("divarw");
143   BPatch_variableExpr* bpvep_diwars = bip->findVariable("dfvars");
144   BPatch_variableExpr* bpvep_diward = bip->findVariable("dfvard");
145   BPatch_variableExpr* bpvep_diwart = bip->findVariable("dfvart");
146   BPatch_variableExpr* bpvep_dlarge = bip->findVariable("dlarge");
147   
148   divarwp = bpvep_diwarw->getBaseAddr();
149   dfvarsp = bpvep_diwars->getBaseAddr();
150   dfvardp = bpvep_diward->getBaseAddr();
151   dfvartp = bpvep_diwart->getBaseAddr();
152   dlargep = bpvep_dlarge->getBaseAddr();
153 }
154
155
156 #if arch_x86_test
157 #if defined(i386_unknown_nt4_0_test)
158 static const unsigned int nstores = 31;
159 #else
160 static const unsigned int nstores = 27;
161 #endif
162 static BPatch_memoryAccess* storeList[nstores];
163
164 static void init_test_data()
165 {
166   int k=-1;
167
168   storeList[++k] = MK_ST(-4,4,-1,4);
169   storeList[++k] = MK_ST(-4,4,-1,4);
170   storeList[++k] = MK_ST(-4,4,-1,4);
171   storeList[++k] = MK_ST(-4,4,-1,4);
172   storeList[++k] = MK_ST(-4,4,-1,4);
173
174   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // s6
175   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
176   storeList[++k] = MK_LS((long)divarwp,-1,-1,4);
177   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4);
178   storeList[++k] = MK_ST((long)divarwp,-1,-1,4);   // s10
179   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4);
180   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
181 #if defined(i386_unknown_nt4_0_test)
182   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
183 #endif
184   storeList[++k] = MK_STnt((long)divarwp,-1,-1,8); // s12
185   //storeList[++k] = MK_ST(0,7,-1,4);
186   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
187 #if defined(i386_unknown_nt4_0_test)
188   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
189 #endif
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] = NULL;//MK_ST(-4,4,-1,4); // call
195 #if defined(i386_unknown_nt4_0_test)
196   storeList[++k] = NULL;//MK_ST(-4,4,-1,4); // call
197 #endif
198   storeList[++k] = new BPatch_memoryAccess(NULL,0,
199                                            false, true,
200                                            0, 7, -1, 0,
201                                            0, -1, 1, 2,
202                                            -1, false);
203   storeList[++k] = MK_ST(0,7,-1,4);
204   //storeList[++k] = MK_SL2(0,7,-1,4,0,6,-1,4); // s15
205   storeList[++k] = MK_SL2vECX(0,7,-1,0,6,-1,2);
206   
207   storeList[++k] = MK_ST((long)dfvarsp,-1,-1,4);
208   storeList[++k] = MK_ST((long)dfvardp,-1,-1,8);
209   storeList[++k] = MK_ST((long)dfvartp,-1,-1,10);
210   storeList[++k] = MK_ST((long)divarwp+2,-1,-1,2);
211   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
212   storeList[++k] = MK_ST((long)divarwp+8,-1,-1,8);
213
214   storeList[++k] = MK_ST((long)divarwp,-1,-1,2);
215   storeList[++k] = MK_ST((long)dlargep,-1,-1,28);
216 }
217 #endif
218
219 #ifdef arch_ia64_test
220 static const unsigned int nstores = 3;
221 static BPatch_memoryAccess* storeList[nstores];
222 static void init_test_data() {
223         storeList[0] = MK_ST( 0, 14, -1, 8 );
224         storeList[1] = MK_ST( 0, 14, -1, 8 );
225         storeList[2] = MK_ST( 0, 14, -1, 8 );
226 }
227 #endif
228
229
230 #ifdef arch_x86_64_test
231 static const unsigned int nstores = 25;
232
233 static BPatch_memoryAccess* storeList[nstores];
234
235 static void init_test_data()
236 {
237   int k=-1;
238
239   // initial 7 pushes
240   storeList[++k] = MK_ST(-8,4,-1,8);
241   storeList[++k] = MK_ST(-8,4,-1,8);
242   storeList[++k] = MK_ST(-8,4,-1,8);
243   storeList[++k] = MK_ST(-8,4,-1,8);
244   storeList[++k] = MK_ST(-8,4,-1,8);
245   storeList[++k] = MK_ST(-8,4,-1,8);
246   storeList[++k] = MK_ST(-8,4,-1,8);
247
248   // stores from semantic test cases
249   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // inc
250   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4); // mov
251   storeList[++k] = MK_LS((long)divarwp,-1,-1,4);   // add
252   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // xchg
253   storeList[++k] = MK_LS((long)divarwp+4,-1,-1,4); // shld
254   storeList[++k] = MK_ST((long)divarwp,-1,-1,4); // mov
255
256   // MMX store
257   storeList[++k] = MK_STnt((long)divarwp,-1,-1,8); // mov
258
259   // REP stores
260   storeList[++k] = new BPatch_memoryAccess(NULL,0,
261                                            false, true,
262                                            0, 7, -1, 0,
263                                            0, -1, 1, 2,
264                                            -1, false);  // rep stosl
265   storeList[++k] = new BPatch_memoryAccess(NULL,0,
266                                            false, true,
267                                            0, 7, -1, 0,
268                                            0, -1, 1, 2,
269                                            -1, false);  // rep stosl
270   storeList[++k] = MK_SL2vECX(0,7,-1,0,6,-1,2);
271
272
273   // x87
274   storeList[++k] = MK_ST((long)dfvarsp,-1,-1,4);
275   storeList[++k] = MK_ST((long)dfvardp,-1,-1,8);
276   storeList[++k] = MK_ST((long)dfvartp,-1,-1,10);
277   storeList[++k] = MK_ST((long)divarwp+2,-1,-1,2);
278   storeList[++k] = MK_ST((long)divarwp+4,-1,-1,4);
279   storeList[++k] = MK_ST((long)divarwp+8,-1,-1,8);
280
281   storeList[++k] = MK_ST((long)divarwp,-1,-1,2);
282   storeList[++k] = MK_ST((long)dlargep,-1,-1,28);
283 }
284 #endif
285
286
287 // Find and instrument loads with a simple function call snippet
288 // static int mutatorTest(BPatch_thread *bpthr, BPatch_image *bpimg)
289 test_results_t test_mem_2_Mutator::executeTest() {
290   int testnum = 2;
291   const char* testdesc = "store instrumentation";
292 #if !defined(arch_sparc_test) && !defined(arch_power_test) && !defined(arch_x86_test) && !defined(arch_x86_64_test) && !defined(arch_ia64_test)
293   //skiptest(testnum, testdesc);
294   return SKIPPED;
295 #else
296 #if defined(arch_x86_test) || defined(arch_x86_64_test)
297   get_vars_addrs(appImage);
298 #endif
299   init_test_data();
300
301   BPatch_Set<BPatch_opCode> stores;
302   stores.insert(BPatch_opStore);
303
304   BPatch_Vector<BPatch_function *> found_funcs;
305   const char *inFunction = "loadsnstores";
306   if ((NULL == appImage->findFunction(inFunction, found_funcs, 1)) || !found_funcs.size()) {
307     logerror("    Unable to find function %s\n",
308             inFunction);
309     return FAILED;
310   }
311        
312   if (1 < found_funcs.size()) {
313     logerror("%s[%d]:  WARNING  : found %d functions named %s.  Using the first.\n", 
314             __FILE__, __LINE__, found_funcs.size(), inFunction);
315   }
316        
317   BPatch_Vector<BPatch_point *> *res1 = found_funcs[0]->findPoint(stores);
318
319   if(!res1)
320     failtest(testnum, testdesc, "Unable to find function \"loadsnstores\".\n");
321
322   dumpvect(res1, "Stores");
323
324   if((*res1).size() != nstores)
325   {
326       logerror("%s[%d]:  FAILURE: expected %d stores, got %d\n", __FILE__, __LINE__, nstores, (*res1).size());
327       failtest(testnum, testdesc, "Number of stores seems wrong in function \"loadsnstores.\"\n");
328   }
329   if(!validate(res1, storeList, "store"))
330     failtest(testnum, testdesc, "Store sequence failed validation.\n");
331
332   if (instCall(appThread, "Store", res1) < 0) {
333     return FAILED;
334   }
335   return PASSED;
336 #endif
337 }
338
339 // External Interface
340 // extern "C" TEST_DLL_EXPORT int test6_2_mutatorMAIN(ParameterDict &param)
341 // {
342 //     BPatch *bpatch;
343 //     bpatch = (BPatch *)(param["bpatch"]->getPtr());
344 //     BPatch_thread *appThread = (BPatch_thread *)(param["appThread"]->getPtr());
345
346 //     // Get log file pointers
347 //     FILE *outlog = (FILE *)(param["outlog"]->getPtr());
348 //     FILE *errlog = (FILE *)(param["errlog"]->getPtr());
349 //     setOutputLog(outlog);
350 //     setErrorLog(errlog);
351
352 //     // Read the program's image and get an associated image object
353 //     BPatch_image *appImage = appThread->getImage();
354
355 //     // Run mutator code
356 //     return mutatorTest(appThread, appImage);
357 // }