blob: b9e18f1635242638fa2cced922884ed5c23ad548 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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
|