Enabled many tests in binary rewriter mode. Still some failures on AMD64.
[dyninst.git] / testsuite / src / dyninst / test1_30.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: test1_30.C,v 1.1 2008/10/30 19:18:55 legendre Exp $
43 /*
44  * #Name: test1_30
45  * #Desc: Line Information
46  * #Dep: 
47  * #Arch: sparc_sun_solaris2_4_test,i386_unknown_solaris2_5_test,i386_unknown_linux2_0_test,ia64_unknown_linux2_4_test,i386_unknown_nt4_0_test,rs6000_ibm_aix4_1_test,alpha_dec_osf4_0_test,x86_64_unknown_linux2_4_test
48  * #Notes:
49  */
50
51 #include <iostream>
52
53 #include "BPatch.h"
54 #include "BPatch_Vector.h"
55 #include "BPatch_thread.h"
56 #include "BPatch_snippet.h"
57 #include "BPatch_statement.h"
58
59 #include "test_lib.h"
60
61 using namespace std;
62
63 #include "dyninst_comp.h"
64 class test1_30_Mutator : public DyninstMutator {
65   virtual test_results_t executeTest();
66 };
67 extern "C" DLLEXPORT  TestMutator *test1_30_factory() {
68   return new test1_30_Mutator();
69 }
70
71 //
72 // Start Test Case #30 - (line information)
73 //
74 // static int mutatorTest(BPatch_thread *appThread, BPatch_image *appImage)
75 // {
76 test_results_t test1_30_Mutator::executeTest() {
77 #if defined(sparc_sun_solaris2_4_test) \
78  || defined(i386_unknown_solaris2_5_test) \
79  || defined(i386_unknown_linux2_0_test) \
80  || defined(x86_64_unknown_linux2_4_test) /* Blind duplication - Ray */ \
81  || defined(ia64_unknown_linux2_4_test) \
82  || defined(i386_unknown_nt4_0_test) \
83  || defined(rs6000_ibm_aix4_1_test) \
84  || defined(alpha_dec_osf4_0_test) \
85  || defined(os_linux_test) /* Use OS #define instead of platform - Greg */
86
87   unsigned long n;
88   unsigned long baseAddr,lastAddr;
89   unsigned int call30_1_line_no;
90   unsigned short lineNo;
91   char fileName[256];
92
93   if (isMutateeFortran(appImage)) {
94     return SKIPPED;
95   } 
96
97   const char *funcName = "test1_30_mutatee";
98   BPatch_Vector<BPatch_function *> found_funcs;
99     if ((NULL == appImage->findFunction(funcName, found_funcs)) || !found_funcs.size()) {
100       logerror("    Unable to find function %s\n", funcName);
101       return FAILED;
102     }
103
104     if (1 < found_funcs.size()) {
105       logerror("%s[%d]:  WARNING  : found %d functions named %s.  Using the first.\n", 
106               __FILE__, __LINE__, found_funcs.size(), funcName);
107     }
108
109
110     BPatch_Vector<BPatch_point *> *point30_1 = found_funcs[0]->findPoint(BPatch_entry);
111         //instrument with the function that will set the line number
112
113         if (!point30_1 || (point30_1->size() < 1)) {
114                 logerror("Unable to find point %s - entry.\n", funcName);
115                 return FAILED;
116         }
117
118         BPatch_Vector<BPatch_function *> bpfv;
119         char *fn = "test1_30_call1";
120         if (NULL == appImage->findFunction(fn, bpfv) || !bpfv.size()
121             || NULL == bpfv[0]){
122           logerror("    Unable to find function %s\n", fn);
123           return FAILED;
124         }
125         
126         BPatch_function *call30_1func = bpfv[0];
127
128         BPatch_Vector<BPatch_snippet *> nullArgs;
129         BPatch_funcCallExpr call30_1Expr(*call30_1func, nullArgs);
130
131         checkCost(call30_1Expr);
132         appAddrSpace->insertSnippet(call30_1Expr, *point30_1);
133
134         //get the line number of the function call30_1
135         BPatch_variableExpr *expr30_7 = 
136                 appImage->findVariable("test1_30_globalVariable7");
137         if (expr30_7 == NULL) {
138                 logerror("**Failed** test #30 (line information)\n");
139                 logerror("    Unable to locate test1_30_globalVariable7\n");
140                 return FAILED;
141         }
142         expr30_7->readValue(&n);
143         call30_1_line_no = (unsigned)(n+1);
144
145         //get the base addr and last addr of the function call30_1
146         baseAddr = (unsigned long)(call30_1func->getBaseAddr());
147         lastAddr = baseAddr + call30_1func->getSize();
148
149         //now write the base address and last address of the function
150         BPatch_variableExpr *expr30_8 = 
151                         appImage->findVariable("test1_30_globalVariable8");
152         if (expr30_8 == NULL) {
153                 logerror("**Failed** test #30 (line information)\n");
154                 logerror("    Unable to locate test1_30_globalVariable8\n");
155         }
156
157         BPatch_variableExpr *expr30_9 = 
158                         appImage->findVariable("test1_30_globalVariable9");
159         if (expr30_9 == NULL) {
160                 logerror("**Failed** test #30 (line information)\n");
161                 logerror("    Unable to locate test1_30_globalVariable9\n");
162         }
163
164         expr30_8->writeValue(&baseAddr);
165         expr30_9->writeValue(&lastAddr);
166         
167         
168         //check getLineAddr for appImage
169         BPatch_variableExpr *expr30_3 =
170                         appImage->findVariable("test1_30_globalVariable3");
171         if (expr30_3 == NULL) {
172                 logerror("**Failed** test #30 (line information)\n");
173                 logerror("    Unable to locate test1_30_globalVariable3\n");
174                 return FAILED;
175         }
176
177         
178         std::vector< std::pair< unsigned long, unsigned long > > ranges;
179         if( appImage->getAddressRanges( "test1_30_mutatee.c", call30_1_line_no, ranges ) ) {
180             n = ranges[0].first;
181             expr30_3->writeValue( & n );
182         }
183         
184
185
186         //check getLineAddr for module
187         BPatch_variableExpr *expr30_4 =
188                         appImage->findVariable("test1_30_globalVariable4");
189         if (expr30_4 == NULL) {
190                 logerror("**Failed** test #30 (line information)\n");
191                 logerror("    Unable to locate test1_30_globalVariable4\n");
192                 return FAILED;
193         }
194         BPatch_Vector<BPatch_module*>* appModules = appImage->getModules();
195         for(unsigned int i=0;i<appModules->size();i++){
196           char mname[256];
197           (*appModules)[i]->getName(mname,255);mname[255] = '\0';
198           if(!strncmp(mname,"test1_30_mutatee.c",15)){
199             ranges.clear();
200             if( (*appModules)[i]->getAddressRanges( NULL, call30_1_line_no, ranges ) ) {
201               n = ranges[0].first;
202               expr30_4->writeValue( & n );
203             }
204             else
205               logerror("BPatch_module->getAddressRanges returned false!\n");
206             break;
207           }
208         }
209
210         //check getLineAddr works for the function
211         BPatch_variableExpr *expr30_5 =
212                 appImage->findVariable("test1_30_globalVariable5");
213         if (expr30_5 == NULL) {
214                 logerror("**Failed** test #30 (line information)\n");
215                 logerror("    Unable to locate test1_30_globalVariable5\n");
216                 return FAILED;
217         }
218         //check whether getLineFile works for appThread
219         BPatch_variableExpr *expr30_6 =
220                 appImage->findVariable("test1_30_globalVariable6");
221         if (expr30_6 == NULL) {
222                 logerror("**Failed** test #30 (line information)\n");
223                 logerror("    Unable to locate test1_30_globalVariable6\n");
224                 return FAILED;
225         }
226         /* since the first line address of a function changes with the
227            compiler type (gcc,native) we need to check with next address
228            etc. Instead I use the last address of the function*/
229
230         //std::vector< std::pair< const char *, unsigned int > > lines;
231         BPatch_Vector<BPatch_statement> lines;
232         if (appImage->getSourceLines( lastAddr - 1, lines)) {
233                 //n = lines[0].second;
234                 n = lines[0].lineNumber();
235                 expr30_6->writeValue( & n );
236         }
237         else {
238           logerror("appThread->getLineAndFile returned false!\n");
239         }
240         return PASSED;
241 #else
242         return SKIPPED;
243 #endif
244 }