xref: /llvm-project/offload/plugins-nextgen/host/dynamic_ffi/ffi.h (revision bdf727065b581c45b68a81090272f497f1ce5485)
1 //===--- generic-elf-64bit/dynamic_ffi/ffi.cpp -------------------- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // Provides a mirror to the parts of the FFI interface that the plugins require.
10 //
11 // libffi
12 //   - Copyright (c) 2011, 2014, 2019, 2021, 2022 Anthony Green
13 //   - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
14 //
15 //===----------------------------------------------------------------------===//
16 
17 #ifndef DYNAMIC_FFI_FFI_H
18 #define DYNAMIC_FFI_FFI_H
19 
20 #include <stddef.h>
21 #include <stdint.h>
22 
23 #define USES_DYNAMIC_FFI
24 
25 uint32_t ffi_init();
26 
27 typedef struct _ffi_type {
28   size_t size;
29   unsigned short alignment;
30   unsigned short type;
31   struct _ffi_type **elements;
32 } ffi_type;
33 
34 typedef enum {
35   FFI_OK = 0,
36   FFI_BAD_TYPEDEF,
37   FFI_BAD_ABI,
38   FFI_BAD_ARGTYPE
39 } ffi_status;
40 
41 // These are target depenent so we set them manually for each ABI by referencing
42 // the FFI source.
43 typedef enum ffi_abi {
44 #if (defined(_M_X64) || defined(__x86_64__))
45   FFI_DEFAULT_ABI = 2, // FFI_UNIX64.
46 #elif defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) ||       \
47     defined(__riscv) || defined(__loongarch__)
48   FFI_DEFAULT_ABI = 1, // FFI_SYSV.
49 #elif defined(__powerpc64__)
50   FFI_DEFAULT_ABI = 8, // FFI_LINUX.
51 #elif defined(__s390x__)
52   FFI_DEFAULT_ABI = 1, // FFI_SYSV.
53 #else
54 #error "Unknown ABI"
55 #endif
56 } ffi_cif;
57 
58 #ifdef __cplusplus
59 extern "C" {
60 #endif
61 
62 #define FFI_EXTERN extern
63 #define FFI_API
64 
65 FFI_EXTERN ffi_type ffi_type_void;
66 FFI_EXTERN ffi_type ffi_type_pointer;
67 
68 FFI_API
69 void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
70 
71 FFI_API
72 ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
73                         ffi_type *rtype, ffi_type **atypes);
74 
75 #ifdef __cplusplus
76 }
77 #endif
78 
79 #endif // DYNAMIC_FFI_FFI_H
80