Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / mini-cross-helpers.c
1 /**
2  * \file
3  */
4
5 #include "config.h"
6
7 #include <stdio.h>
8
9 #include "config.h"
10
11 #include "mini.h"
12 #ifdef ENABLE_INTERPRETER
13 #include "interp/interp.h"
14 #endif
15 #include "tasklets.h"
16 #include <mono/metadata/abi-details.h>
17
18 void
19 mono_dump_metadata_offsets (void);
20
21 void
22 mono_metadata_cross_helpers_run (void);
23
24
25 static void
26 mono_dump_jit_offsets (void)
27 {
28 #ifdef USED_CROSS_COMPILER_OFFSETS
29         g_print ("#error not using native offsets\n");
30 #else
31         mono_dump_metadata_offsets ();
32
33         g_print ("#ifndef DISABLE_JIT_OFFSETS\n");
34         g_print ("#define USED_CROSS_COMPILER_OFFSETS\n");
35 #define DISABLE_METADATA_OFFSETS
36 #define DECL_OFFSET2(struct,field,offset) this_should_not_happen
37 #define DECL_ALIGN2(type,size) this_should_not_happen
38
39 #define DECL_OFFSET(struct,field) g_print ("DECL_OFFSET2(%s,%s,%d)\n", #struct, #field, (int)MONO_STRUCT_OFFSET (struct, field));
40 #define DECL_ALIGN(type)
41 #define DECL_SIZE2(type,size) this_should_not_happen
42 #define DECL_SIZE(type)
43 #include <mono/metadata/object-offsets.h>
44
45         g_print ("#endif //disable jit check\n");
46         g_print ("#endif //cross compiler checks\n");
47         g_print ("#endif //gc check\n");
48         g_print ("#endif //os check\n");
49         g_print ("#endif //arch check\n");
50         g_print ("#endif //USED_CROSS_COMPILER_OFFSETS check\n");
51 #endif
52 }
53
54 /*
55  * mono_cross_helpers_run:
56  *
57  *   Check that the offsets given by object-offsets.h match the offsets
58  * on the host.
59  */
60 void
61 mono_cross_helpers_run (void)
62 {
63 #if defined (HAS_CROSS_COMPILER_OFFSETS) && !defined (MONO_CROSS_COMPILE)
64         gboolean is_broken = FALSE;
65 #endif
66
67 #ifndef USED_CROSS_COMPILER_OFFSETS
68         if (g_hasenv ("DUMP_CROSS_OFFSETS"))
69                 mono_dump_jit_offsets ();
70 #endif
71         
72 #if defined (HAS_CROSS_COMPILER_OFFSETS) && !defined (MONO_CROSS_COMPILE)
73         mono_metadata_cross_helpers_run ();
74
75         /* The metadata offsets are already checked above */
76 #define DISABLE_METADATA_OFFSETS
77 #define USE_CROSS_COMPILE_OFFSETS
78 #define DECL_OFFSET(struct,field) this_should_not_happen_for_cross_fields
79 #define DECL_OFFSET2(struct,field,offset) \
80          if ((int)G_STRUCT_OFFSET (struct, field) != offset) { \
81                 g_print (#struct ":" #field " invalid struct offset %d (expected %d)\n",        \
82                         offset, \
83                         (int)G_STRUCT_OFFSET (struct, field));  \
84                 is_broken = TRUE;       \
85         }
86 #define DECL_ALIGN(name,type) this_should_not_happen_for_cross_align
87 #define DECL_ALIGN2(name,size) \
88          if (MONO_ALIGN_ ## name != size) { \
89                 g_print (#name ": invalid alignment %d (expected %d)\n",        \
90                 size,   \
91                 MONO_ALIGN_ ## name);   \
92                 is_broken = TRUE;       \
93         }
94 #define DECL_SIZE(type) this_should_not_happen_for_cross_size
95 #define DECL_SIZE2(name,size) \
96          if (MONO_SIZEOF_ ## name != size) { \
97                 g_print (#name ": invalid size %d (expected %d)\n",     \
98                 size,   \
99                 MONO_SIZEOF_ ## name);  \
100                 is_broken = TRUE;       \
101         }
102
103 #include <mono/metadata/object-offsets.h>
104
105         g_assert (!is_broken);
106 #endif
107 }