| #include <stddef.h> |
| #include <stdint.h> |
| |
| // See comments in build_native_lib() |
| #define EXPORT __attribute__((visibility("default"))) |
| |
| /* Test: test_increment_int */ |
| |
| EXPORT void increment_int(int32_t *ptr) { |
| *ptr += 1; |
| } |
| |
| /* Test: test_init_int */ |
| |
| EXPORT void init_int(int32_t *ptr, int32_t val) { |
| *ptr = val; |
| } |
| |
| /* Test: test_init_array */ |
| |
| EXPORT void init_array(int32_t *array, size_t len, int32_t val) { |
| for (size_t i = 0; i < len; i++) { |
| array[i] = val; |
| } |
| } |
| |
| /* Test: test_init_static_inner */ |
| |
| typedef struct SyncPtr { |
| int32_t *ptr; |
| } SyncPtr; |
| |
| EXPORT void init_static_inner(const SyncPtr *s_ptr, int32_t val) { |
| *(s_ptr->ptr) = val; |
| } |
| |
| /* Tests: test_exposed, test_pass_dangling */ |
| |
| EXPORT void ignore_ptr(__attribute__((unused)) const int32_t *ptr) { |
| return; |
| } |
| |
| /* Test: test_expose_int */ |
| EXPORT void expose_int(const int32_t *int_ptr, const int32_t **pptr) { |
| *pptr = int_ptr; |
| } |
| |
| /* Test: test_swap_ptr */ |
| |
| EXPORT void swap_ptr(const int32_t **pptr0, const int32_t **pptr1) { |
| const int32_t *tmp = *pptr0; |
| *pptr0 = *pptr1; |
| *pptr1 = tmp; |
| } |
| |
| /* Test: test_swap_ptr_tuple */ |
| |
| typedef struct Tuple { |
| int32_t *ptr0; |
| int32_t *ptr1; |
| } Tuple; |
| |
| EXPORT void swap_ptr_tuple(Tuple *t_ptr) { |
| int32_t *tmp = t_ptr->ptr0; |
| t_ptr->ptr0 = t_ptr->ptr1; |
| t_ptr->ptr1 = tmp; |
| } |
| |
| /* Test: test_overwrite_dangling */ |
| |
| EXPORT void overwrite_ptr(const int32_t **pptr) { |
| *pptr = NULL; |
| } |
| |
| /* Test: test_swap_ptr_triple_dangling */ |
| |
| typedef struct Triple { |
| int32_t *ptr0; |
| int32_t *ptr1; |
| int32_t *ptr2; |
| } Triple; |
| |
| EXPORT void swap_ptr_triple_dangling(Triple *t_ptr) { |
| int32_t *tmp = t_ptr->ptr0; |
| t_ptr->ptr0 = t_ptr->ptr2; |
| t_ptr->ptr2 = tmp; |
| } |
| |
| EXPORT const int32_t *return_ptr(const int32_t *ptr) { |
| return ptr; |
| } |
| |
| /* Test: test_pass_ptr_as_int */ |
| |
| EXPORT void pass_ptr_as_int(uintptr_t ptr, int32_t set_to_val) { |
| *(int32_t*)ptr = set_to_val; |
| } |
| |
| /* Test: test_pass_ptr_via_previously_shared_mem */ |
| |
| int32_t** shared_place; |
| |
| EXPORT void set_shared_mem(int32_t** ptr) { |
| shared_place = ptr; |
| } |
| |
| EXPORT void init_ptr_stored_in_shared_mem(int32_t val) { |
| **shared_place = val; |
| } |
| |
| /* Test: partial_init */ |
| |
| EXPORT void init_n(int32_t n, char* ptr) { |
| for (int i=0; i<n; i++) { |
| *(ptr+i) = 0; |
| } |
| } |