Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / dyninst / test1_9.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_9.C,v 1.1 2008/10/30 19:20:03 legendre Exp $
33 /*
34  * #Name: test1_9
35  * #Desc: Mutator Side - Preserve Registers - FuncCall
36  * #Arch: all
37  * #Dep: 
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
48 #include "dyninst_comp.h"
49
50 class test1_9_Mutator : public DyninstMutator {
51         virtual test_results_t executeTest();
52 };
53
54 extern "C" DLLEXPORT  TestMutator *test1_9_factory() 
55 {
56         return new test1_9_Mutator();
57 }
58
59 //
60 // Start Test Case #9 - mutator side (preserve registers - funcCall)
61 //
62
63 test_results_t test1_9_Mutator::executeTest() 
64 {
65         // Find the entry point to the procedure "test1_9_func1"
66         const char *funcName = "test1_9_func1";
67         BPatch_Vector<BPatch_function *> found_funcs;
68
69         if ((NULL == appImage->findFunction(funcName, found_funcs))
70                         || !found_funcs.size()) 
71         {
72                 logerror("    Unable to find function %s\n", funcName);
73                 return FAILED;
74         }
75
76         if (1 < found_funcs.size()) 
77         {
78                 logerror("%s[%d]:  WARNING  : found %d functions named %s.  Using the first.\n", 
79                                 __FILE__, __LINE__, found_funcs.size(), funcName);
80         }
81
82         BPatch_Vector<BPatch_point *> *point9_1 = found_funcs[0]->findPoint(BPatch_entry);
83
84         if (!point9_1 || ((*point9_1).size() == 0)) 
85         {
86                 logerror("Unable to find entry point to \"%s\".\n", funcName);
87                 return FAILED;
88         }
89
90         BPatch_Vector<BPatch_function *> bpfv;
91         char *fn = "test1_9_call1";
92         if (NULL == appImage->findFunction(fn, bpfv) || !bpfv.size()
93                         || NULL == bpfv[0])
94         {
95                 logerror("    Unable to find function %s\n", fn);
96                 return FAILED;
97         }
98
99         BPatch_function *call9_func = bpfv[0];
100
101         BPatch_Vector<BPatch_snippet *> call9_args;
102
103         BPatch_variableExpr *expr9_1 = appAddrSpace->malloc (*appImage->findType ("int"));
104         BPatch_constExpr constExpr9_1 (0);
105         BPatch_arithExpr arithexpr9_1 (BPatch_assign, *expr9_1, BPatch_constExpr (91));
106         appAddrSpace->insertSnippet (arithexpr9_1, *point9_1);
107
108         int mutateeFortran = isMutateeFortran(appImage);
109
110         if (mutateeFortran) 
111         {
112                 constExpr9_1 = expr9_1->getBaseAddr ();
113         } 
114         else 
115         {
116                 constExpr9_1 = 91;
117         }
118
119         call9_args.push_back(&constExpr9_1);
120
121         BPatch_variableExpr *expr9_2 = appAddrSpace->malloc (*appImage->findType ("int"));
122         BPatch_constExpr constExpr9_2 (0);
123         BPatch_arithExpr arithexpr9_2 (BPatch_assign, *expr9_2, BPatch_constExpr (92));
124         appAddrSpace->insertSnippet (arithexpr9_2, *point9_1);
125
126         if (mutateeFortran) 
127         {
128                 constExpr9_2 = expr9_2->getBaseAddr ();
129         } 
130         else 
131         {
132                 constExpr9_2 = 92;
133         }
134
135         call9_args.push_back(&constExpr9_2);
136
137         BPatch_variableExpr *expr9_3 = appAddrSpace->malloc (*appImage->findType ("int"));
138         BPatch_constExpr constExpr9_3 (0);
139         BPatch_arithExpr arithexpr9_3 (BPatch_assign, *expr9_3, BPatch_constExpr (93));
140         appAddrSpace->insertSnippet (arithexpr9_3, *point9_1);
141
142         if (mutateeFortran) 
143         {
144                 constExpr9_3 = expr9_3->getBaseAddr ();
145         } 
146         else 
147         {
148                 constExpr9_3 = 93;
149         }
150
151         call9_args.push_back(&constExpr9_3);
152
153         BPatch_variableExpr *expr9_4 = appAddrSpace->malloc (*appImage->findType ("int"));
154         BPatch_constExpr constExpr9_4 (0);
155         BPatch_arithExpr arithexpr9_4 (BPatch_assign, *expr9_4, BPatch_constExpr (94));
156         appAddrSpace->insertSnippet (arithexpr9_4, *point9_1);
157
158         if (mutateeFortran) 
159         {
160                 constExpr9_4 = expr9_4->getBaseAddr ();
161         } 
162         else 
163         {
164                 constExpr9_4 = 94;
165         }
166
167         call9_args.push_back(&constExpr9_4);
168
169         BPatch_variableExpr *expr9_5 = appAddrSpace->malloc (*appImage->findType ("int"));
170         BPatch_constExpr constExpr9_5 (0);
171         BPatch_arithExpr arithexpr9_5 (BPatch_assign, *expr9_5, BPatch_constExpr (95));
172         appAddrSpace->insertSnippet (arithexpr9_5, *point9_1);
173
174         if (mutateeFortran) 
175         {
176                 constExpr9_5 = expr9_5->getBaseAddr ();
177         } 
178         else 
179         {
180                 constExpr9_5 = 95;
181         }
182
183         call9_args.push_back(&constExpr9_5);
184
185         BPatch_funcCallExpr call9Expr(*call9_func, call9_args);
186
187         checkCost(call9Expr);
188         appAddrSpace->insertSnippet(call9Expr, *point9_1, BPatch_callBefore, BPatch_lastSnippet);
189
190         return PASSED;
191 }