Enabled many tests in binary rewriter mode. Still some failures on AMD64.
[dyninst.git] / testsuite / src / dyninst / test5_3.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: test5_3.C,v 1.1 2008/10/30 19:21:02 legendre Exp $
43 /*
44  * #Name: test5_3
45  * #Desc: Overload Operatior
46  * #Dep: 
47  * #Arch:
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
58 #include "dyninst_comp.h"
59 class test5_3_Mutator : public DyninstMutator {
60 public:
61   virtual test_results_t executeTest();
62 };
63 extern "C" DLLEXPORT TestMutator *test5_3_factory() {
64   return new test5_3_Mutator();
65 }
66
67 //
68 // Start Test Case #3 - (overload operator)
69 //      
70 // static int mutatorTest(BPatch_thread *appThread, BPatch_image *appImage)
71 test_results_t test5_3_Mutator::executeTest() {
72
73   BPatch_Vector<BPatch_function *> bpfv;
74   char *fn = "overload_op_test::func_cpp";
75   if (NULL == appImage->findFunction(fn, bpfv) || !bpfv.size()
76       || NULL == bpfv[0]){
77     logerror("**Failed** test #3 (overloaded operation)\n");
78     logerror("    Unable to find function %s\n", fn);
79     return FAILED;
80   }
81   BPatch_function *f1 = bpfv[0];  
82   BPatch_Vector<BPatch_point *> *point3_1 = f1->findPoint(BPatch_subroutine);
83
84   assert(point3_1);
85   if (point3_1->size() == 0) {
86     logerror("**Failed test5_3 (overload operation)\n");
87     logerror("    Can't find overloaded operator call points\n");
88     return FAILED;
89   }
90
91   unsigned int index = 0;
92   char fn3[256];
93   BPatch_function *func;
94   while (index < point3_1->size()) {
95      if ((func = (*point3_1)[index]->getCalledFunction()) == NULL) {
96         logerror("**Failed** test #3 (overload operation)\n");
97         logerror("    Can't find the overload operator\n");
98         return FAILED;
99      }
100      if (!strcmp("overload_op_test::operator++", func->getName(fn3, 256)))
101      {
102         break;
103      }
104      index ++;
105   }
106   if (0 != strcmp("overload_op_test::operator++", func->getName(fn3, 256))) {
107     logerror("**Failed** test #3 (overload operation)\n");
108     logerror("    Can't find the overloaded operator\n");
109     return FAILED;
110   }
111   // FIXME It caught fprintf...
112
113   BPatch_Vector<BPatch_point *> *point3_2 = func->findPoint(BPatch_exit);
114   assert(point3_2);
115   
116   bpfv.clear();
117   char *fn2 = "overload_op_test::call_cpp";
118   if (NULL == appImage->findFunction(fn2, bpfv) || !bpfv.size()
119       || NULL == bpfv[0]){
120     logerror("**Failed** test #3 (overloaded operation)\n");
121     logerror("    Unable to find function %s\n", fn2);
122     return FAILED;
123   }
124   BPatch_function *call3_1 = bpfv[0];  
125   
126   BPatch_variableExpr *this2 = appImage->findVariable("test5_3_test3");
127   if (this2 == NULL) {
128     logerror( "**Failed** test #3 (overloaded operation)\n");
129     logerror( "Unable to find variable \"test5_3_test3\"\n");
130     return FAILED;
131   }
132
133   BPatch_Vector<BPatch_snippet *> opArgs;
134   BPatch_constExpr expr2_0((void *)this2->getBaseAddr());
135   opArgs.push_back(&expr2_0);
136   opArgs.push_back(new BPatch_retExpr());
137   BPatch_funcCallExpr call3_1Expr(*call3_1, opArgs);
138   
139   checkCost(call3_1Expr);
140   appAddrSpace->insertSnippet(call3_1Expr, *point3_2);
141   //  int tag = 1;
142   //  while (tag != 0) {}
143   
144   return PASSED;
145 }
146
147 // External Interface
148 // extern "C" TEST_DLL_EXPORT int test5_3_mutatorMAIN(ParameterDict &param)
149 // {
150 //     BPatch *bpatch;
151 //     bpatch = (BPatch *)(param["bpatch"]->getPtr());
152 //     BPatch_thread *appThread = (BPatch_thread *)(param["appThread"]->getPtr());
153
154 //     // Get log file pointers
155 //     FILE *outlog = (FILE *)(param["outlog"]->getPtr());
156 //     FILE *errlog = (FILE *)(param["errlog"]->getPtr());
157 //     setOutputLog(outlog);
158 //     setErrorLog(errlog);
159
160 //     // Read the program's image and get an associated image object
161 //     BPatch_image *appImage = appThread->getImage();
162
163 //     // Run mutator code
164 //     return mutatorTest(appThread, appImage);
165 // }