Bump version to 19.1.0-rc3
[llvm-project.git] / offload / plugins-nextgen / host / dynamic_ffi / ffi.h
blob0ae025805e1d405379f9dfc7b430d8e7972f79f9
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.
11 // libffi
12 // - Copyright (c) 2011, 2014, 2019, 2021, 2022 Anthony Green
13 // - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
15 //===----------------------------------------------------------------------===//
17 #ifndef DYNAMIC_FFI_FFI_H
18 #define DYNAMIC_FFI_FFI_H
20 #include <stddef.h>
21 #include <stdint.h>
23 #define USES_DYNAMIC_FFI
25 uint32_t ffi_init();
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;
34 typedef enum {
35 FFI_OK = 0,
36 FFI_BAD_TYPEDEF,
37 FFI_BAD_ABI,
38 FFI_BAD_ARGTYPE
39 } ffi_status;
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 FFI_DEFAULT_ABI = 1, // FFI_SYSV.
48 #elif defined(__powerpc64__)
49 FFI_DEFAULT_ABI = 8, // FFI_LINUX.
50 #elif defined(__s390x__)
51 FFI_DEFAULT_ABI = 1, // FFI_SYSV.
52 #else
53 #error "Unknown ABI"
54 #endif
55 } ffi_cif;
57 #ifdef __cplusplus
58 extern "C" {
59 #endif
61 #define FFI_EXTERN extern
62 #define FFI_API
64 FFI_EXTERN ffi_type ffi_type_void;
65 FFI_EXTERN ffi_type ffi_type_pointer;
67 FFI_API
68 void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
70 FFI_API
71 ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
72 ffi_type *rtype, ffi_type **atypes);
74 #ifdef __cplusplus
76 #endif
78 #endif // DYNAMIC_FFI_FFI_H