Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / dyninst / test1_15_mutatee.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 #include "mutatee_util.h"
32
33 /* Externally accessed function prototypes.  These must have globally unique
34  * names.  I suggest following the pattern <testname>_<function>
35  */
36
37 void test1_15_func2();
38 void test1_15_func3();
39 void test1_15_func4();
40 void test1_15_call1();
41 void test1_15_call3();
42
43 /* Global variables accessed by the mutator.  These must have globally unique
44  * names.
45  */
46
47 /* Internally used function prototypes.  These should be declared with the
48  * keyword static so they don't interfere with other mutatees in the group.
49  */
50
51 static void call15_2();
52 static void check15result(const char *varname, int value, int expected,
53                           const char *errstr, int *failed);
54
55 /* Global variables used internally by the mutatee.  These should be declared
56  * with the keyword static so they don't interfere with other mutatees in the
57  * group.
58  */
59
60 static int globalVariable15_1 = 0;
61 static int globalVariable15_2 = 0;
62 static int globalVariable15_3 = 0;
63 static int globalVariable15_4 = 0;
64
65 /* Function definitions follow */
66
67 /*
68  * Test #15 - setMutationsActive
69  */
70 void check15result(const char *varname, int value, int expected,
71                    const char *errstr, int *failed)
72 {
73     if (value != expected) {
74         if (!*failed)
75             logerror("**failed test #15 (setMutationsActive)\n");
76         *failed = TRUE;
77
78         logerror("    %s = %d %s\n", varname, value, errstr);
79     }           
80 }
81
82
83 void test1_15_func2()
84 {
85     DUMMY_FN_BODY;
86 }
87
88 void test1_15_func3()
89 {
90     globalVariable15_3 = 100;
91     /* increment a dummy variable to keep alpha code generator from assuming
92        too many free registers on the call into test1_15_func3. jkh 3/7/00 */
93     globalVariable15_4++;
94 }
95
96 void test1_15_func4()
97 {
98     /* int localkludge = 1;
99     /* kludge = localkludge; /* Here so that the following function call isn't
100                                 the first instruction */
101
102     test1_15_func3();
103 }
104
105 int test1_15_mutatee() {
106     int failed = FALSE;
107     int retval;
108
109     test1_15_func2();
110     check15result("globalVariable15_1", globalVariable15_1, 1,
111                   "after first call to instrumented function", &failed);
112
113 #if 0
114     // Deprecated pending rewrite of function relocation
115 #if defined(sparc_sun_sunos4_1_3_test) \
116  || defined(sparc_sun_solaris2_4_test)
117     /* Test a function that makes a system call (is a special case on Sparc) */
118     access(".", R_OK);
119     check15result("globalVariable15_2", globalVariable15_2, 2,
120                   "after first call to instrumented function", &failed);
121 #endif
122 #endif
123
124     test1_15_func4();
125     check15result("globalVariable15_3", globalVariable15_3, 1,
126                   "after first call to instrumented function", &failed);
127
128     /***********************************************************/
129
130     stop_process_();
131
132     test1_15_func2();
133     check15result("globalVariable15_1", globalVariable15_1, 1,
134                   "after second call to instrumented function", &failed);
135 #if 0
136 #if defined(sparc_sun_sunos4_1_3_test) \
137  || defined(sparc_sun_solaris2_4_test)
138     access(".", R_OK);
139     check15result("globalVariable15_2", globalVariable15_2, 2,
140                   "after second call to instrumented function", &failed);
141 #endif
142 #endif
143
144     test1_15_func4();
145     check15result("globalVariable15_3", globalVariable15_3, 100,
146                   "after second call to instrumented function", &failed);
147
148     /***********************************************************/
149
150     stop_process_();
151
152     test1_15_func2();
153     check15result("globalVariable15_1", globalVariable15_1, 2,
154                   "after third call to instrumented function", &failed);
155 #if 0
156 #if defined(sparc_sun_sunos4_1_3_test) \
157  || defined(sparc_sun_solaris2_4_test)
158     access(".", R_OK);
159     check15result("globalVariable15_2", globalVariable15_2, 4,
160                   "after third call to instrumented function", &failed);
161 #endif
162 #endif
163     test1_15_func4();
164     check15result("globalVariable15_3", globalVariable15_3, 101,
165                   "after third call to instrumented function", &failed);
166
167     if (!failed) {
168         logerror("Passed test #15 (setMutationsActive)\n");
169         test_passes("test1_15");
170         retval = 0; /* Test passed */
171     } else {
172         retval = -1; /* Test failed */
173     }
174     return retval;
175 }
176
177 void test1_15_call1() {
178     globalVariable15_1++;
179 }
180
181 /* It looks like this function is unused. */
182 void call15_2() {
183     globalVariable15_2++;
184 }
185
186 void test1_15_call3() {
187     globalVariable15_3++;
188 }