Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / metadata / abi-details.h
1 /**
2  * \file
3  * Copyright 2014 Xamarin Inc
4  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
5  */
6 #ifndef __MONO_METADATA_ABI_DETAILS_H__
7 #define __MONO_METADATA_ABI_DETAILS_H__
8
9 #include <config.h>
10 #include <glib.h>
11
12 /*
13  * This file defines macros to compute sizes/alignments/field offsets which depend on
14  * the ABI. It is needed during cross compiling since the generated code needs to
15  * contain offsets which correspond to the ABI of the target, not the host.
16  * It defines the following macros:
17  * - MONO_ABI_SIZEOF(type) for every basic type
18  * - MONO_ABI_ALIGNOF(type) for every basic type
19  * - MONO_STRUCT_OFFSET(struct, field) for various runtime structures
20  * When not cross compiling, these correspond to the host ABI (i.e. sizeof/offsetof).
21  * When cross compiling, these are defined in a generated header file which is
22  * generated by the offsets tool in tools/offsets-tool. The name of the file
23  * is given by the --with-cross-offsets= configure argument.
24  */
25
26 #define MONO_ABI_ALIGNOF(type) MONO_ALIGN_ ## type
27 #define MONO_CURRENT_ABI_ALIGNOF_TYPEDEF(type) typedef struct { char c; type x; } Mono_Align_Struct_ ##type;
28 #define MONO_CURRENT_ABI_ALIGNOF(type) ((int)G_STRUCT_OFFSET(Mono_Align_Struct_ ##type, x))
29 #define MONO_ABI_SIZEOF(type) MONO_SIZEOF_ ## type
30 #define MONO_CURRENT_ABI_SIZEOF(type) ((int)sizeof(type))
31
32 #undef DECL_OFFSET
33 #undef DECL_OFFSET2
34 #define DECL_OFFSET(struct,field) MONO_OFFSET_ ## struct ## _ ## field = -1,
35 #define DECL_OFFSET2(struct,field,offset) MONO_OFFSET_ ## struct ## _ ## field = offset,
36 #define DECL_ALIGN(type) MONO_ALIGN_ ##type = MONO_CURRENT_ABI_ALIGNOF (type),
37 #define DECL_ALIGN2(type,size) MONO_ALIGN_ ##type = size,
38 #define DECL_SIZE(type) MONO_SIZEOF_ ##type = MONO_CURRENT_ABI_SIZEOF (type),
39 #define DECL_SIZE2(type,size) MONO_SIZEOF_ ##type = size,
40
41 /* Needed by MONO_CURRENT_ABI_ALIGNOF */
42 MONO_CURRENT_ABI_ALIGNOF_TYPEDEF(gint8)
43 MONO_CURRENT_ABI_ALIGNOF_TYPEDEF(gint16)
44 MONO_CURRENT_ABI_ALIGNOF_TYPEDEF(gint32)
45 MONO_CURRENT_ABI_ALIGNOF_TYPEDEF(gint64)
46 MONO_CURRENT_ABI_ALIGNOF_TYPEDEF(float)
47 MONO_CURRENT_ABI_ALIGNOF_TYPEDEF(double)
48 MONO_CURRENT_ABI_ALIGNOF_TYPEDEF(gpointer)
49
50 enum {
51 #include "object-offsets.h"
52 };
53
54 #ifdef USED_CROSS_COMPILER_OFFSETS
55 #define MONO_STRUCT_OFFSET(struct,field) MONO_OFFSET_ ## struct ## _ ## field
56 #else
57 #if defined(HAS_CROSS_COMPILER_OFFSETS) || defined(MONO_CROSS_COMPILE)
58 #define MONO_STRUCT_OFFSET(struct,field) (MONO_OFFSET_ ## struct ## _ ## field == -1, G_STRUCT_OFFSET (struct,field))
59 #else
60 #define MONO_STRUCT_OFFSET(struct,field) G_STRUCT_OFFSET (struct,field)
61 #endif
62 #endif
63
64 #endif