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
25uint32_t ffi_init();
26
27typedef struct _ffi_type {
28 size_t size;
29 unsigned short alignment;
30 unsigned short type;
31 struct _ffi_type **elements;
32} ffi_type;
33
34typedef 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.
43typedef 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;
56
57#ifdef __cplusplus
58extern "C" {
59#endif
60
61#define FFI_EXTERN extern
62#define FFI_API
63
64FFI_EXTERN ffi_type ffi_type_void;
65FFI_EXTERN ffi_type ffi_type_pointer;
66
67FFI_API
68void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);
69
70FFI_API
71ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,
72 ffi_type *rtype, ffi_type **atypes);
73
74#ifdef __cplusplus
75}
76#endif
77
78#endif // DYNAMIC_FFI_FFI_H
79

source code of offload/plugins-nextgen/host/dynamic_ffi/ffi.h