Rename newtestsuite to testsuite
[dyninst.git] / testsuite / src / dyninst / test1_35.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_35.C,v 1.1 2008/10/30 19:19:17 legendre Exp $
43 /*
44  * #Name: test1_35
45  * #Desc: Function Relocation
46  * #Dep: 
47  * #Arch:
48  * #Notes: i386_unknown_solaris2_5_test,i386_unknown_linux2_0_test,sparc_sun_solaris2_4_test,x86_64_unknown_linux2_4_test
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 "dyninst_comp.h"
58
59 class test1_35_Mutator : public DyninstMutator {
60         virtual test_results_t executeTest();
61 };
62
63 extern "C" DLLEXPORT  TestMutator *test1_35_factory() 
64 {
65         return new test1_35_Mutator();
66 }
67
68 // Start Test Case #35 - (function relocation)
69
70 test_results_t test1_35_Mutator::executeTest() 
71 {
72 #if defined(i386_unknown_solaris2_5_test) \
73         || defined(i386_unknown_linux2_0_test) \
74         || defined(x86_64_unknown_linux2_4_test) /* Blind duplication - Ray */ \
75         || defined(sparc_sun_solaris2_4_test)
76
77         // Only on Solaris and i386 and AMD64 Linux
78         // All of these platforms have assembly versions of call35_1
79
80         if (isMutateeFortran(appImage)) 
81         {
82                 return SKIPPED;
83         }
84
85         BPatch_Vector<BPatch_function *> bpfv;
86         char *fn = "test1_35_call1";
87
88         if (NULL == appImage->findFunction(fn, bpfv) || !bpfv.size()
89                         || NULL == bpfv[0])
90         {
91                 logerror("**Failed** test #35 (function relocation)\n");
92                 logerror("    Unable to find function %s\n", fn);
93                 return FAILED;
94         }
95
96         BPatch_function *foo_function = bpfv[0];
97
98         BPatch_Vector<BPatch_point *> *point35_1 =  
99                 foo_function->findPoint(BPatch_subroutine);
100
101         assert(point35_1);
102
103         BPatch_variableExpr *var1 = appImage->findVariable(*(*point35_1)[0], 
104                         "localVariable35_1");
105         BPatch_variableExpr *var2 = appImage->findVariable(*(*point35_1)[0], 
106                         "localVariable35_2");
107         BPatch_variableExpr *var3 = appImage->findVariable(*(*point35_1)[0], 
108                         "total35_1");
109         BPatch_variableExpr *var4 = appImage->findVariable(*(*point35_1)[0], 
110                         "total35_2");
111
112         if (!var1 || !var2 || !var3 || !var4 ) 
113         {
114                 logerror("**Failed** test #35 (function relocation)\n");
115                 if (!var1) 
116                         logerror("  can't find local variable localVariable35_1\n");
117                 if (!var2) 
118                         logerror("  can't find local variable localVariable35_2\n");
119                 if (!var3) 
120                         logerror("  can't find local variable total35_1\n");
121                 if (!var4) 
122                         logerror("  can't find local variable total35_2\n");
123                 return FAILED;
124         }
125
126         BPatch_snippet * snippet35_1 = 
127                 new BPatch_arithExpr(BPatch_assign, *var1, BPatch_constExpr(7));
128
129         BPatch_snippet * snippet35_2 = 
130                 new BPatch_arithExpr(BPatch_assign, *var2, BPatch_constExpr(5));
131
132         BPatch_snippet * snippet35_3 = 
133                 new BPatch_arithExpr(BPatch_assign, *var4, *var3);
134
135         BPatch_point * call_1 = ( (* point35_1)[0] );
136         assert( call_1 != 0 );
137
138         BPatch_point * call_2 = ( (* point35_1)[2] );
139         assert( call_2 != 0 );
140
141         appAddrSpace->insertSnippet( * snippet35_3, * call_2, BPatch_callAfter, BPatch_firstSnippet );
142         appAddrSpace->insertSnippet( * snippet35_2, * call_1, BPatch_callBefore, BPatch_firstSnippet );
143         appAddrSpace->insertSnippet( * snippet35_1, * call_1, BPatch_callBefore, BPatch_firstSnippet );
144
145 #endif   
146
147         return PASSED;
148 }    
149