1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Area: ffi_closure, unwind info 2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Purpose: Check if the unwind information is passed correctly. 3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Limitations: none. 4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project PR: none. 5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Originator: Jeff Sturm <jsturm@one-point.com> */ 6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* { dg-do run } */ 8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include "ffitestcxx.h" 9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid 11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectclosure_test_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, 12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void** args __UNUSED__, void* userdata __UNUSED__) 13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project throw 9; 15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef void (*closure_test_type)(); 18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, 20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project void** args, void* userdata __UNUSED__) 21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project { 22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project *(ffi_arg*)resp = 23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)*(float *)args[0] +(int)(*(float *)args[1]) + 24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(float *)args[2]) + (int)*(float *)args[3] + 25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(signed short *)args[4]) + (int)(*(float *)args[5]) + 26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)*(float *)args[6] + (int)(*(int *)args[7]) + 27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(double*)args[8]) + (int)*(int *)args[9] + 28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(int *)args[10]) + (int)(*(float *)args[11]) + 29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)*(int *)args[12] + (int)(*(int *)args[13]) + 30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(int *)args[14]) + *(int *)args[15] + (int)(long)userdata; 31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n", 33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)*(float *)args[0], (int)(*(float *)args[1]), 34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(float *)args[2]), (int)*(float *)args[3], 35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(signed short *)args[4]), (int)(*(float *)args[5]), 36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)*(float *)args[6], (int)(*(int *)args[7]), 37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(double *)args[8]), (int)*(int *)args[9], 38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(int *)args[10]), (int)(*(float *)args[11]), 39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)*(int *)args[12], (int)(*(int *)args[13]), 40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(*(int *)args[14]), *(int *)args[15], 41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (int)(long)userdata, (int)*(ffi_arg*)resp); 42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project throw (int)*(ffi_arg*)resp; 44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef int (*closure_test_type1)(float, float, float, float, signed short, 47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project float, float, int, double, int, int, float, 48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project int, int, int, int); 49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectint main (void) 51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{ 52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_cif cif; 53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifndef USING_MMAP 54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project static ffi_closure cl; 55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_closure *pcl; 57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ffi_type * cl_arg_types[17]; 58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef USING_MMAP 59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = (ffi_closure *) allocate_mmap (sizeof(ffi_closure)); 60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else 61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project pcl = &cl; 62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project { 65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[1] = NULL; 66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, 68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project &ffi_type_void, cl_arg_types) == FFI_OK); 69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn, NULL) == FFI_OK); 70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project try 72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project { 73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (*((closure_test_type)(pcl)))(); 74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project } catch (int exception_code) 75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project { 76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(exception_code == 9); 77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project } 78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("part one OK\n"); 80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "part one OK" } */ 81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project } 82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project { 84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[0] = &ffi_type_float; 86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[1] = &ffi_type_float; 87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[2] = &ffi_type_float; 88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[3] = &ffi_type_float; 89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[4] = &ffi_type_sshort; 90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[5] = &ffi_type_float; 91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[6] = &ffi_type_float; 92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[7] = &ffi_type_uint; 93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[8] = &ffi_type_double; 94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[9] = &ffi_type_uint; 95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[10] = &ffi_type_uint; 96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[11] = &ffi_type_float; 97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[12] = &ffi_type_uint; 98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[13] = &ffi_type_uint; 99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[14] = &ffi_type_uint; 100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[15] = &ffi_type_uint; 101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project cl_arg_types[16] = NULL; 102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* Initialize the cif */ 104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16, 105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project &ffi_type_sint, cl_arg_types) == FFI_OK); 106a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 107a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn1, 108a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (void *) 3 /* userdata */) == FFI_OK); 109a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project try 110a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project { 111a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (*((closure_test_type1)pcl)) 112a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13, 113a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 19, 21, 1); 114a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\n1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */ 115a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project } catch (int exception_code) 116a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project { 117a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CHECK(exception_code == 255); 118a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project } 119a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project printf("part two OK\n"); 120a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project /* { dg-output "\npart two OK" } */ 121a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project } 122a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project exit(0); 123a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} 124