1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* -----------------------------------------------------------------------
2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ffi_common.h - Copyright (c) 1996  Red Hat, Inc.
3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Copyright (C) 2007 Free Software Foundation, Inc
4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   Common internal definitions and macros. Only necessary for building
6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   libffi.
7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   ----------------------------------------------------------------------- */
8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifndef FFI_COMMON_H
10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define FFI_COMMON_H
11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef __cplusplus
13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectextern "C" {
14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include <fficonfig.h>
17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Do not move this. Some versions of AIX are very picky about where
19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project   this is positioned. */
20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef __GNUC__
21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project//# define alloca __builtin_alloca  /* ANDROID removed, clashes w/bionic */
22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# include <alloca.h>                /* ANDROID added */
23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# define MAYBE_UNUSED __attribute__((__unused__))
24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# define MAYBE_UNUSED
26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# if HAVE_ALLOCA_H
27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#  include <alloca.h>
28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# else
29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#  ifdef _AIX
30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project #pragma alloca
31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#  else
32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#   ifndef alloca /* predefined by HP cc +Olibcalls */
33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectchar *alloca ();
34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#   endif
35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#  endif
36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# endif
37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Check for the existence of memcpy. */
40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#if STDC_HEADERS
41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# include <string.h>
42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# ifndef HAVE_MEMCPY
44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#  define memcpy(d, s, n) bcopy ((s), (d), (n))
45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project# endif
46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#if defined(FFI_DEBUG)
49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#include <stdio.h>
50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef FFI_DEBUG
53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid ffi_assert(char *expr, char *file, int line);
54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid ffi_stop_here(void);
55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectvoid ffi_type_test(ffi_type *a, char *file, int line);
56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__))
58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l)))
59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__)
60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else
61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define FFI_ASSERT(x)
62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define FFI_ASSERT_AT(x, f, l)
63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define FFI_ASSERT_VALID_TYPE(x)
64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ALIGN(v, a)  (((((size_t) (v))-1) | ((a)-1))+1)
67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ALIGN_DOWN(v, a) (((size_t) (v)) & -a)
68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Perform machine dependent cif processing */
70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projectffi_status ffi_prep_cif_machdep(ffi_cif *cif);
71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Extended cif, used in callback from assembly routine */
73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef struct
74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project{
75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  ffi_cif *cif;
76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  void *rvalue;
77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project  void **avalue;
78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project} extended_cif;
79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Terse sized type definitions.  */
81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef unsigned int UINT8  __attribute__((__mode__(__QI__)));
82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef signed int   SINT8  __attribute__((__mode__(__QI__)));
83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef unsigned int UINT16 __attribute__((__mode__(__HI__)));
84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef signed int   SINT16 __attribute__((__mode__(__HI__)));
85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef unsigned int UINT32 __attribute__((__mode__(__SI__)));
86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef signed int   SINT32 __attribute__((__mode__(__SI__)));
87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef unsigned int UINT64 __attribute__((__mode__(__DI__)));
88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef signed int   SINT64 __attribute__((__mode__(__DI__)));
89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Projecttypedef float FLOAT32;
91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef __cplusplus
94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project}
95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif
98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project
100