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