diff options
author | 2021-10-05 03:34:45 +1100 | |
---|---|---|
committer | 2021-10-05 03:34:45 +1100 | |
commit | aeb9eae87469e67bc6a91caf3840c34c11d959fc (patch) | |
tree | 45bffedf374dbce47caca633ad7bda547592e6c9 /src/lib/util/abi.h | |
parent | 33723892a3f06e678d817b36aef84364c32848ec (diff) |
util: Further API cleanups: (#8661)
* Turned `core_file` into an implementation of `random_read_write`.
* Turned PNG errors into a standard error category.
* Added a helper for generating what look like derived classes on-the-fly.
Diffstat (limited to 'src/lib/util/abi.h')
-rw-r--r-- | src/lib/util/abi.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/lib/util/abi.h b/src/lib/util/abi.h new file mode 100644 index 00000000000..b9e18f16352 --- /dev/null +++ b/src/lib/util/abi.h @@ -0,0 +1,117 @@ +// license:BSD-3-Clause +// copyright-holders:Vas Crabb +/// \file +/// \brief ABI feature macros +/// +/// Macros that are useful for writing ABI-dependent code. +#ifndef MAME_LIB_UTIL_ABI_H +#define MAME_LIB_UTIL_ABI_H + +#pragma once + + +/// \brief Itanium C++ ABI +/// +/// Value of #MAME_ABI_CXX_TYPE when compiled with a variant of the +/// Itanium C++ ABI. +/// \sa MAME_ABI_CXX_TYPE MAME_ABI_CXX_MSVC +#define MAME_ABI_CXX_ITANIUM 0 + +/// \brief Microsoft Visual C++ ABI +/// +/// Value of #MAME_ABI_CXX_TYPE when compiled with a variant of the +/// Microsoft Visual C++ ABI. +/// \sa MAME_ABI_CXX_TYPE MAME_ABI_CXX_ITANIUM +#define MAME_ABI_CXX_MSVC 1 + + +/// \brief Standard Itanium C++ ABI member function pointers +/// +/// Value of #MAME_ABI_CXX_ITANIUM_MFP_TYPE when compiled with a variant +/// of the Itanium C++ ABI using the standard representation of +/// pointers to non-static member functions. +/// \sa MAME_ABI_CXX_ITANIUM_MFP_TYPE MAME_ABI_CXX_ITANIUM_MFP_ARM +#define MAME_ABI_CXX_ITANIUM_MFP_STANDARD 0 + +/// \brief ARM Itanium C++ ABI member function pointers +/// +/// Value of #MAME_ABI_CXX_ITANIUM_MFP_TYPE when compiled with a variant +/// of the Itanium C++ ABI using the 32-bit ARM representation of +/// pointers to non-static member functions. +/// \sa MAME_ABI_CXX_ITANIUM_MFP_TYPE MAME_ABI_CXX_ITANIUM_MFP_STANDARD +#define MAME_ABI_CXX_ITANIUM_MFP_ARM 1 + + +/// \def MAME_ABI_FNDESC_SIZE +/// \brief Size of function descriptors +/// +/// Size of function descriptors as a multiple of the size of a pointer, +/// or zero if function pointers point to the function entry point +/// directly. +#if (defined(__ppc64__) || defined(__PPC64__)) && !defined(__APPLE__) && !defined(__LITTLE_ENDIAN__) + #define MAME_ABI_FNDESC_SIZE 3 // entry point (PC), TOC (R2), environment (R11) +#elif defined(__ia64__) + #define MAME_ABI_FNDESC_SIZE 2 // GP, entry point +#else + #define MAME_ABI_FNDESC_SIZE 0 // function pointers point to entry point directly +#endif + + +/// \def MAME_ABI_CXX_TYPE +/// \brief C++ ABI type +/// +/// A constant representing the C++ ABI. +/// \sa MAME_ABI_CXX_ITANIUM MAME_ABI_CXX_MSVC +#if defined(_MSC_VER) + #define MAME_ABI_CXX_TYPE MAME_ABI_CXX_MSVC +#else + #define MAME_ABI_CXX_TYPE MAME_ABI_CXX_ITANIUM +#endif + + +/// \def MAME_ABI_CXX_MEMBER_CALL +/// \brief Member function calling convention qualifier +/// +/// A qualifier for functions and function pointers that may be used to +/// specify that the calling convention for non-static member functions +/// should be used. +#if defined(__GNUC__) && defined(__MINGW32__) && !defined(__x86_64__) && defined(__i386__) + #define MAME_ABI_CXX_MEMBER_CALL __thiscall +#else + #define MAME_ABI_CXX_MEMBER_CALL +#endif + + +/// \def MAME_ABI_CXX_VTABLE_FNDESC +/// \brief Whether function descriptors are stored in virtual tables +/// +/// Non-zero if function descriptors are stored in virtual tables +/// directly, or zero if function entries in virtual tables are +/// conventional function pointers. +/// \sa MAME_ABI_FNDESC_SIZE +#if defined(__ia64__) + #define MAME_ABI_CXX_VTABLE_FNDESC 1 // function descriptors stored directly in vtable +#else + #define MAME_ABI_CXX_VTABLE_FNDESC 0 // conventional function pointers in vtable +#endif + + +/// \def MAME_ABI_CXX_ITANIUM_MFP_TYPE +/// Itanium C++ member function representation +/// +/// A constant representing the representation of pointers to non-static +/// member functions in use with the Itanium C++ ABI. Only valid if +/// compiled with a variant of the Itanium C++ ABI. +/// \sa MAME_ABI_CXX_ITANIUM_MFP_STANDARD MAME_ABI_CXX_ITANIUM_MFP_ARM +/// MAME_ABI_CXX_TYPE +#if defined(__arm__) || defined(__ARMEL__) || defined(__aarch64__) + #define MAME_ABI_CXX_ITANIUM_MFP_TYPE MAME_ABI_CXX_ITANIUM_MFP_ARM +#elif defined(__MIPSEL__) || defined(__mips_isa_rev) || defined(__mips64) + #define MAME_ABI_CXX_ITANIUM_MFP_TYPE MAME_ABI_CXX_ITANIUM_MFP_ARM +#elif defined(__EMSCRIPTEN__) + #define MAME_ABI_CXX_ITANIUM_MFP_TYPE MAME_ABI_CXX_ITANIUM_MFP_ARM +#else + #define MAME_ABI_CXX_ITANIUM_MFP_TYPE MAME_ABI_CXX_ITANIUM_MFP_STANDARD +#endif + +#endif // MAME_LIB_UTIL_ABI_H |