1 // Some convenient things to return: 2 static char *g_first_pointer = "I am the first"; 3 static char *g_second_pointer = "I am the second"; 4 5 // First we have some simple functions that return standard types, ints, floats and doubles. 6 // We have a function calling a function in a few cases to test that if you stop in the 7 // inner function then do "up/fin" you get the return value from the outer-most frame. 8 9 int 10 inner_sint (int value) 11 { 12 return value; 13 } 14 15 int 16 outer_sint (int value) 17 { 18 int outer_value = 2 * inner_sint (value); 19 return outer_value; 20 } 21 22 float 23 inner_float (float value) 24 { 25 return value; 26 } 27 28 float 29 outer_float (float value) 30 { 31 float outer_value = 2 * inner_float(value); 32 return outer_value; 33 } 34 35 double 36 return_double (double value) 37 { 38 return value; 39 } 40 41 long double 42 return_long_double (long double value) 43 { 44 return value; 45 } 46 47 char * 48 return_pointer (char *value) 49 { 50 return value; 51 } 52 53 struct one_int 54 { 55 int one_field; 56 }; 57 58 struct one_int 59 return_one_int (struct one_int value) 60 { 61 return value; 62 } 63 64 struct two_int 65 { 66 int first_field; 67 int second_field; 68 }; 69 70 struct two_int 71 return_two_int (struct two_int value) 72 { 73 return value; 74 } 75 76 struct three_int 77 { 78 int first_field; 79 int second_field; 80 int third_field; 81 }; 82 83 struct three_int 84 return_three_int (struct three_int value) 85 { 86 return value; 87 } 88 89 struct four_int 90 { 91 int first_field; 92 int second_field; 93 int third_field; 94 int fourth_field; 95 }; 96 97 struct four_int 98 return_four_int (struct four_int value) 99 { 100 return value; 101 } 102 103 struct five_int 104 { 105 int first_field; 106 int second_field; 107 int third_field; 108 int fourth_field; 109 int fifth_field; 110 }; 111 112 struct five_int 113 return_five_int (struct five_int value) 114 { 115 return value; 116 } 117 118 struct one_int_one_double 119 { 120 int first_field; 121 double second_field; 122 }; 123 124 struct one_int_one_double 125 return_one_int_one_double (struct one_int_one_double value) 126 { 127 return value; 128 } 129 130 struct one_int_one_double_one_int 131 { 132 int one_field; 133 double second_field; 134 int third_field; 135 }; 136 137 struct one_int_one_double_one_int 138 return_one_int_one_double_one_int (struct one_int_one_double_one_int value) 139 { 140 return value; 141 } 142 143 struct one_short_one_double_one_short 144 { 145 int one_field; 146 double second_field; 147 int third_field; 148 }; 149 150 struct one_short_one_double_one_short 151 return_one_short_one_double_one_short (struct one_short_one_double_one_short value) 152 { 153 return value; 154 } 155 156 struct three_short_one_float 157 { 158 short one_field; 159 short second_field; 160 short third_field; 161 float fourth_field; 162 }; 163 164 struct three_short_one_float 165 return_three_short_one_float (struct three_short_one_float value) 166 { 167 return value; 168 } 169 170 struct one_int_one_float_one_int 171 { 172 int one_field; 173 float second_field; 174 int third_field; 175 }; 176 177 struct one_int_one_float_one_int 178 return_one_int_one_float_one_int (struct one_int_one_float_one_int value) 179 { 180 return value; 181 } 182 183 struct one_float_one_int_one_float 184 { 185 float one_field; 186 int second_field; 187 float third_field; 188 }; 189 190 struct one_float_one_int_one_float 191 return_one_float_one_int_one_float (struct one_float_one_int_one_float value) 192 { 193 return value; 194 } 195 196 struct one_double_two_float 197 { 198 double one_field; 199 float second_field; 200 float third_field; 201 }; 202 203 struct one_double_two_float 204 return_one_double_two_float (struct one_double_two_float value) 205 { 206 return value; 207 } 208 209 struct two_double 210 { 211 double first_field; 212 double second_field; 213 }; 214 215 struct two_double 216 return_two_double (struct two_double value) 217 { 218 return value; 219 } 220 221 struct two_float 222 { 223 float first_field; 224 float second_field; 225 }; 226 227 struct two_float 228 return_two_float (struct two_float value) 229 { 230 return value; 231 } 232 233 struct one_int_one_double_packed 234 { 235 int first_field; 236 double second_field; 237 } __attribute__((__packed__)); 238 239 struct one_int_one_double_packed 240 return_one_int_one_double_packed (struct one_int_one_double_packed value) 241 { 242 return value; 243 } 244 245 struct one_int_one_long 246 { 247 int first_field; 248 long second_field; 249 }; 250 251 struct one_int_one_long 252 return_one_int_one_long (struct one_int_one_long value) 253 { 254 return value; 255 } 256 257 struct one_pointer 258 { 259 char *first_field; 260 }; 261 262 struct one_pointer 263 return_one_pointer (struct one_pointer value) 264 { 265 return value; 266 } 267 268 struct two_pointer 269 { 270 char *first_field; 271 char *second_field; 272 }; 273 274 struct two_pointer 275 return_two_pointer (struct two_pointer value) 276 { 277 return value; 278 } 279 280 struct one_float_one_pointer 281 { 282 float first_field; 283 char *second_field; 284 }; 285 286 struct one_float_one_pointer 287 return_one_float_one_pointer (struct one_float_one_pointer value) 288 { 289 return value; 290 } 291 292 struct one_int_one_pointer 293 { 294 int first_field; 295 char *second_field; 296 }; 297 298 struct one_int_one_pointer 299 return_one_int_one_pointer (struct one_int_one_pointer value) 300 { 301 return value; 302 } 303 304 typedef float vector_size_float32 __attribute__((__vector_size__(16))); 305 typedef float ext_vector_size_float32 __attribute__((ext_vector_type(4))); 306 307 vector_size_float32 308 return_vector_size_float32 (vector_size_float32 value) 309 { 310 return value; 311 } 312 313 ext_vector_size_float32 314 return_ext_vector_size_float32 (ext_vector_size_float32 value) 315 { 316 return value; 317 } 318 319 int 320 main () 321 { 322 int first_int = 123456; 323 int second_int = 234567; 324 325 outer_sint (first_int); 326 outer_sint (second_int); 327 328 float first_float_value = 12.34; 329 float second_float_value = 23.45; 330 331 outer_float (first_float_value); 332 outer_float (second_float_value); 333 334 double double_value = -23.45; 335 336 return_double (double_value); 337 338 return_pointer(g_first_pointer); 339 340 long double long_double_value = -3456789.987654321; 341 342 return_long_double (long_double_value); 343 344 // Okay, now the structures: 345 return_one_int ((struct one_int) {10}); 346 return_two_int ((struct two_int) {10, 20}); 347 return_three_int ((struct three_int) {10, 20, 30}); 348 return_four_int ((struct four_int) {10, 20, 30, 40}); 349 return_five_int ((struct five_int) {10, 20, 30, 40, 50}); 350 351 return_two_double ((struct two_double) {10.0, 20.0}); 352 return_one_double_two_float ((struct one_double_two_float) {10.0, 20.0, 30.0}); 353 return_one_int_one_float_one_int ((struct one_int_one_float_one_int) {10, 20.0, 30}); 354 355 return_one_pointer ((struct one_pointer) {g_first_pointer}); 356 return_two_pointer ((struct two_pointer) {g_first_pointer, g_second_pointer}); 357 return_one_float_one_pointer ((struct one_float_one_pointer) {10.0, g_first_pointer}); 358 return_one_int_one_pointer ((struct one_int_one_pointer) {10, g_first_pointer}); 359 return_three_short_one_float ((struct three_short_one_float) {10, 20, 30, 40.0}); 360 361 return_one_int_one_double ((struct one_int_one_double) {10, 20.0}); 362 return_one_int_one_double_one_int ((struct one_int_one_double_one_int) {10, 20.0, 30}); 363 return_one_short_one_double_one_short ((struct one_short_one_double_one_short) {10, 20.0, 30}); 364 return_one_float_one_int_one_float ((struct one_float_one_int_one_float) {10.0, 20, 30.0}); 365 return_two_float ((struct two_float) { 10.0, 20.0}); 366 return_one_int_one_double_packed ((struct one_int_one_double_packed) {10, 20.0}); 367 return_one_int_one_long ((struct one_int_one_long) {10, 20}); 368 369 return_vector_size_float32 (( vector_size_float32 ){1.5, 2.25, 4.125, 8.0625}); 370 return_ext_vector_size_float32 ((ext_vector_size_float32){ 16.5, 32.25, 64.125, 128.0625}); 371 372 return 0; 373 374 } 375