* gdb.base/help.exp: Replace most of docstrings for "info signals"
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.base / callfuncs.c
CommitLineData
ef44eed1
SS
1/* Support program for testing gdb's ability to call functions
2 in the inferior, pass appropriate arguments to those functions,
3 and get the returned result. */
4
5#ifdef __STDC__
6#define PARAMS(paramlist) paramlist
7#else
8#define PARAMS(paramlist) ()
9#endif
10
11char char_val1 = 'a';
12char char_val2 = 'b';
13
14short short_val1 = 10;
15short short_val2 = -23;
16
17int int_val1 = 87;
18int int_val2 = -26;
19
20long long_val1 = 789;
21long long_val2 = -321;
22
23float float_val1 = 3.14159;
24float float_val2 = -2.3765;
25
26double double_val1 = 45.654;
27double double_val2 = -67.66;
28
29#define DELTA (0.001)
30
31char *string_val1 = "string 1";
32char *string_val2 = "string 2";
33
34char char_array_val1[] = "carray 1";
35char char_array_val2[] = "carray 2";
36
37struct struct1 {
38 int x;
39 long y;
40} struct_val1 = { 76, 51 };
41
42/* Some functions that can be passed as arguments to other test
43 functions, or called directly. */
44
45int add (a, b)
46int a, b;
47{
48 return (a + b);
49}
50
51int doubleit (a)
52int a;
53{
54 return (a + a);
55}
56
57int (*func_val1) PARAMS((int,int)) = add;
58int (*func_val2) PARAMS((int)) = doubleit;
59
60/* An enumeration and functions that test for specific values. */
61
62enum enumtype { enumval1, enumval2, enumval3 };
63enum enumtype enum_val1 = enumval1;
64enum enumtype enum_val2 = enumval2;
65enum enumtype enum_val3 = enumval3;
66
67t_enum_value1 (enum_arg)
68enum enumtype enum_arg;
69{
70 return (enum_arg == enum_val1);
71}
72
73t_enum_value2 (enum_arg)
74enum enumtype enum_arg;
75{
76 return (enum_arg == enum_val2);
77}
78
79t_enum_value3 (enum_arg)
80enum enumtype enum_arg;
81{
82 return (enum_arg == enum_val3);
83}
84
85/* A function that takes a vector of integers (along with an explicit
86 count) and returns their sum. */
87
88int sum_args (argc, argv)
89int argc;
90int argv[];
91{
92 int sumval = 0;
93 int idx;
94
95 for (idx = 0; idx < argc; idx++)
96 {
97 sumval += argv[idx];
98 }
99 return (sumval);
100}
101
102/* Test that calling functions works if there are a lot of arguments. */
103int
104sum10 (i0, i1, i2, i3, i4, i5, i6, i7, i8, i9)
105 int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9;
106{
107 return i0 + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9;
108}
109
110/* Gotta have a main to be able to generate a linked, runnable
111 executable, and also provide a useful place to set a breakpoint. */
112
113main ()
114{
115 malloc(1);
116}
117
118/* Functions that expect specific values to be passed and return
119 either 0 or 1, depending upon whether the values were
120 passed incorrectly or correctly, respectively. */
121
122int t_char_values (char_arg1, char_arg2)
123char char_arg1, char_arg2;
124{
125 return ((char_arg1 == char_val1) && (char_arg2 == char_val2));
126}
127
128int t_short_values (short_arg1, short_arg2)
129short short_arg1, short_arg2;
130{
131 return ((short_arg1 == short_val1) && (short_arg2 == short_val2));
132}
133
134int t_int_values (int_arg1, int_arg2)
135int int_arg1, int_arg2;
136{
137 return ((int_arg1 == int_val1) && (int_arg2 == int_val2));
138}
139
140int t_long_values (long_arg1, long_arg2)
141long long_arg1, long_arg2;
142{
143 return ((long_arg1 == long_val1) && (long_arg2 == long_val2));
144}
145
146int t_float_values (float_arg1, float_arg2)
147float float_arg1, float_arg2;
148{
149 return (((float_arg1 - float_val1) < DELTA) &&
150 ((float_arg2 - float_val2) < DELTA));
151}
152
153int t_double_values (double_arg1, double_arg2)
154double double_arg1, double_arg2;
155{
156 return (((double_arg1 - double_val1) < DELTA) &&
157 ((double_arg2 - double_val2) < DELTA));
158}
159
160int t_string_values (string_arg1, string_arg2)
161char *string_arg1, *string_arg2;
162{
163 return (!strcmp (string_arg1, string_val1) &&
164 !strcmp (string_arg2, string_val2));
165}
166
167int t_char_array_values (char_array_arg1, char_array_arg2)
168char char_array_arg1[], char_array_arg2[];
169{
170 return (!strcmp (char_array_arg1, char_array_val1) &&
171 !strcmp (char_array_arg2, char_array_val2));
172}
173
174
175/* This used to simply compare the function pointer arguments with
176 known values for func_val1 and func_val2. Doing so is valid ANSI
177 code, but on some machines (RS6000, HPPA, others?) it may fail when
178 called directly by GDB.
179
180 In a nutshell, it's not possible for GDB to determine when the address
181 of a function or the address of the function's stub/trampoline should
182 be passed.
183
184 So, to avoid GDB lossage in the common case, we perform calls through the
185 various function pointers and compare the return values. For the HPPA
186 at least, this allows the common case to work.
187
188 If one wants to try something more complicated, pass the address of
189 a function accepting a "double" as one of its first 4 arguments. Call
190 that function indirectly through the function pointer. This would fail
191 on the HPPA. */
192
193int t_func_values (func_arg1, func_arg2)
194int (*func_arg1) PARAMS ((int, int));
195int (*func_arg2) PARAMS ((int));
196{
197 return ((*func_arg1) (5,5) == (*func_val1) (5,5)
198 && (*func_arg2) (6) == (*func_val2) (6));
199}
200
201int t_call_add (func_arg1, a, b)
202int (*func_arg1) PARAMS ((int, int));
203int a, b;
204{
205 return ((*func_arg1)(a, b));
206}
This page took 0.054215 seconds and 4 git commands to generate.