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. */
6 #define PARAMS(paramlist) paramlist
8 #define PARAMS(paramlist) ()
14 short short_val1
= 10;
15 short short_val2
= -23;
21 long long_val2
= -321;
23 float float_val1
= 3.14159;
24 float float_val2
= -2.3765;
26 double double_val1
= 45.654;
27 double double_val2
= -67.66;
31 char *string_val1
= "string 1";
32 char *string_val2
= "string 2";
34 char char_array_val1
[] = "carray 1";
35 char char_array_val2
[] = "carray 2";
40 } struct_val1
= { 76, 51 };
42 /* Some functions that can be passed as arguments to other test
43 functions, or called directly. */
57 int (*func_val1
) PARAMS((int,int)) = add
;
58 int (*func_val2
) PARAMS((int)) = doubleit
;
60 /* An enumeration and functions that test for specific values. */
62 enum enumtype
{ enumval1
, enumval2
, enumval3
};
63 enum enumtype enum_val1
= enumval1
;
64 enum enumtype enum_val2
= enumval2
;
65 enum enumtype enum_val3
= enumval3
;
67 t_enum_value1 (enum_arg
)
68 enum enumtype enum_arg
;
70 return (enum_arg
== enum_val1
);
73 t_enum_value2 (enum_arg
)
74 enum enumtype enum_arg
;
76 return (enum_arg
== enum_val2
);
79 t_enum_value3 (enum_arg
)
80 enum enumtype enum_arg
;
82 return (enum_arg
== enum_val3
);
85 /* A function that takes a vector of integers (along with an explicit
86 count) and returns their sum. */
88 int sum_args (argc
, argv
)
95 for (idx
= 0; idx
< argc
; idx
++)
102 /* Test that calling functions works if there are a lot of arguments. */
104 sum10 (i0
, i1
, i2
, i3
, i4
, i5
, i6
, i7
, i8
, i9
)
105 int i0
, i1
, i2
, i3
, i4
, i5
, i6
, i7
, i8
, i9
;
107 return i0
+ i1
+ i2
+ i3
+ i4
+ i5
+ i6
+ i7
+ i8
+ i9
;
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. */
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. */
122 int t_char_values (char_arg1
, char_arg2
)
123 char char_arg1
, char_arg2
;
125 return ((char_arg1
== char_val1
) && (char_arg2
== char_val2
));
128 int t_short_values (short_arg1
, short_arg2
)
129 short short_arg1
, short_arg2
;
131 return ((short_arg1
== short_val1
) && (short_arg2
== short_val2
));
134 int t_int_values (int_arg1
, int_arg2
)
135 int int_arg1
, int_arg2
;
137 return ((int_arg1
== int_val1
) && (int_arg2
== int_val2
));
140 int t_long_values (long_arg1
, long_arg2
)
141 long long_arg1
, long_arg2
;
143 return ((long_arg1
== long_val1
) && (long_arg2
== long_val2
));
146 int t_float_values (float_arg1
, float_arg2
)
147 float float_arg1
, float_arg2
;
149 return (((float_arg1
- float_val1
) < DELTA
) &&
150 ((float_arg2
- float_val2
) < DELTA
));
153 int t_double_values (double_arg1
, double_arg2
)
154 double double_arg1
, double_arg2
;
156 return (((double_arg1
- double_val1
) < DELTA
) &&
157 ((double_arg2
- double_val2
) < DELTA
));
160 int t_string_values (string_arg1
, string_arg2
)
161 char *string_arg1
, *string_arg2
;
163 return (!strcmp (string_arg1
, string_val1
) &&
164 !strcmp (string_arg2
, string_val2
));
167 int t_char_array_values (char_array_arg1
, char_array_arg2
)
168 char char_array_arg1
[], char_array_arg2
[];
170 return (!strcmp (char_array_arg1
, char_array_val1
) &&
171 !strcmp (char_array_arg2
, char_array_val2
));
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.
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
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.
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
193 int t_func_values (func_arg1
, func_arg2
)
194 int (*func_arg1
) PARAMS ((int, int));
195 int (*func_arg2
) PARAMS ((int));
197 return ((*func_arg1
) (5,5) == (*func_val1
) (5,5)
198 && (*func_arg2
) (6) == (*func_val2
) (6));
201 int t_call_add (func_arg1
, a
, b
)
202 int (*func_arg1
) PARAMS ((int, int));
205 return ((*func_arg1
)(a
, b
));
This page took 0.041303 seconds and 4 git commands to generate.