Update copyright to LGPL on all files
[dyninst.git] / testsuite / src / dyninst / test5_1.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: test5_1.C,v 1.1 2008/10/30 19:20:58 legendre Exp $
33 /*
34  * #Name: test5_1
35  * #Desc: C++ Argument Pass
36  * #Dep: 
37  * #Arch: sparc_sun_solaris2_4_test,i386_unknown_linux2_0_test,x86_64_unknown_linux2_4_test,ia64_unknown_linux2_4_test
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 test5_1_Mutator : public DyninstMutator {
51 public:
52   //  virtual test_results_t setup(ParameterDict &param);
53   virtual test_results_t executeTest();
54 };
55
56 extern "C" DLLEXPORT TestMutator *test5_1_factory() {
57   return new test5_1_Mutator();
58 }
59
60 //  
61 // Start Test Case #1 - (C++ argument pass)
62 //       
63 // static int mutatorTest(BPatch_thread *appThread, BPatch_image *appImage)
64 test_results_t test5_1_Mutator::executeTest() {
65
66   BPatch_Vector<BPatch_function *> bpfv;
67   char *fn = "arg_test::call_cpp";
68   if (NULL == appImage->findFunction(fn, bpfv) || !bpfv.size()
69       || NULL == bpfv[0]){
70     logerror("**Failed** test #1\n");
71     logerror("    Unable to find function %s\n", fn);
72     return FAILED;
73   }
74   BPatch_function *f1 = bpfv[0];  
75   BPatch_Vector<BPatch_point *> *point1_1 = f1->findPoint(BPatch_subroutine);
76        
77    assert(point1_1);
78
79    // check the paramter passing modes
80    BPatch_variableExpr *arg0 = appImage->findVariable(*(*point1_1)[0],
81        "reference");
82    BPatch_variableExpr *arg1 = appImage->findVariable(*(*point1_1)[0],
83        "arg1");
84    BPatch_variableExpr *arg2 = appImage->findVariable(*(*point1_1)[0],
85        "arg2");
86    BPatch_variableExpr *arg3 = appImage->findVariable(*(*point1_1)[0],
87        "arg3");
88    BPatch_variableExpr *arg4 = appImage->findVariable(*(*point1_1)[0],
89        "m");
90
91    if (!arg0 || !arg1 || !arg2 || !arg3 || !arg4) {
92       logerror("**Failed** test #1 (argument passing)\n");
93       if ( !arg0 )
94          logerror("  can't find local variable 'reference'\n");
95       if ( !arg1 )
96          logerror("  can't find local variable 'arg1'\n");
97       if ( !arg2 )
98          logerror("  can't find local variable 'arg2'\n");
99       if ( !arg3 )
100          logerror("  can't find local variable 'arg3'\n");
101       if ( !arg4 )
102          logerror("  can't find local variable 'm'\n");
103       return FAILED;
104    }
105
106    BPatch_type *type1_0 = const_cast<BPatch_type *> (arg0->getType());
107    BPatch_type *type1_1 = const_cast<BPatch_type *> (arg1->getType());
108    BPatch_type *type1_2 = const_cast<BPatch_type *> (arg2->getType());
109    BPatch_type *type1_3 = const_cast<BPatch_type *> (arg4->getType());
110    assert(type1_0 && type1_1 && type1_2 && type1_3);
111
112    if (!type1_1->isCompatible(type1_3)) {
113        logerror("**Failed** test #1 (C++ argument pass)\n");
114        logerror("    type1_1 reported as incompatibile with type1_3\n");
115        return FAILED;
116    }
117
118    if (!type1_2->isCompatible(type1_0)) {
119         logerror("**Failed** test #1 (C++ argument pass)\n");
120         logerror("    type1_2 reported as incompatibile with type1_0\n");
121         return FAILED;
122    }
123
124    BPatch_arithExpr expr1_1(BPatch_assign, *arg3, BPatch_constExpr(1));
125    checkCost(expr1_1);
126    appAddrSpace->insertSnippet(expr1_1, *point1_1);
127
128    // pass a paramter to a class member function
129    bpfv.clear();
130    char *fn2 = "arg_test::func_cpp";
131    if (NULL == appImage->findFunction(fn2, bpfv) || !bpfv.size()
132        || NULL == bpfv[0]){
133      logerror("**Failed** test #1 (C++ argument pass)\n");
134      logerror("    Unable to find function %s\n", fn2);
135      return FAILED;
136    }
137    BPatch_function *f2 = bpfv[0];  
138    BPatch_Vector<BPatch_point *> *point1_2 = f2->findPoint(BPatch_subroutine);
139
140    if (!point1_2 || (point1_2->size() < 1)) {
141      logerror("**Failed** test #1 (C++ argument pass)\n");
142       logerror("Unable to find point arg_test::func_cpp - exit.\n");
143       return FAILED;
144    }
145
146    bpfv.clear();
147    char *fn3 = "arg_test::arg_pass";
148    if (NULL == appImage->findFunction(fn3, bpfv) || !bpfv.size()
149        || NULL == bpfv[0]) {
150      logerror("**Failed** test #1 (C++ argument pass)\n");
151      logerror("    Unable to find function %s\n", fn3);
152      return FAILED;
153    }
154    BPatch_function *call1_func = bpfv[0];  
155
156    BPatch_variableExpr *this1 = appImage->findVariable("test1");
157    if (this1 == NULL) {
158       logerror("**Failed** test #1 (C++ argument pass)\n");
159       logerror("Unable to find variable \"test1\"\n");
160       return FAILED;
161    }
162
163    BPatch_Vector<BPatch_snippet *> call1_args;
164    BPatch_constExpr expr1_2((const void *)this1->getBaseAddr());
165    call1_args.push_back(&expr1_2);
166    BPatch_constExpr expr1_3(1);
167    call1_args.push_back(&expr1_3);
168    BPatch_funcCallExpr call1Expr(*call1_func, call1_args);
169
170    checkCost(call1Expr);
171    appAddrSpace->insertSnippet(call1Expr, *point1_2);
172    return PASSED;
173 }