90 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// Provides a mirror to the parts of the FFI interface that the plugins require.10//11// libffi12// - Copyright (c) 2011, 2014, 2019, 2021, 2022 Anthony Green13// - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.14//15//===----------------------------------------------------------------------===//16 17#ifndef DYNAMIC_FFI_FFI_H18#define DYNAMIC_FFI_FFI_H19 20#include <stddef.h>21#include <stdint.h>22 23#define USES_DYNAMIC_FFI24 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_ARGTYPE39} ffi_status;40 41// These are target dependent so we set them manually for each ABI by42// referencing 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 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#else54#error "Unknown ABI"55#endif56} ffi_abi;57 58typedef struct {59 ffi_abi abi;60 unsigned nargs;61 ffi_type **arg_types;62 ffi_type *rtype;63 unsigned bytes;64 unsigned flags;65 long long extra_fields; // Longest extra field defined in the FFI sources66} ffi_cif;67 68#ifdef __cplusplus69extern "C" {70#endif71 72#define FFI_EXTERN extern73#define FFI_API74 75FFI_EXTERN ffi_type ffi_type_void;76FFI_EXTERN ffi_type ffi_type_pointer;77 78FFI_API79void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue);80 81FFI_API82ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs,83 ffi_type *rtype, ffi_type **atypes);84 85#ifdef __cplusplus86}87#endif88 89#endif // DYNAMIC_FFI_FFI_H90