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 65