+static void
+save_cast_details (MonoCompile *cfg, MonoClass *klass, int obj_reg)
+{
+ if (mini_get_debug_options ()->better_cast_details) {
+ int to_klass_reg = alloc_preg (cfg);
+ int vtable_reg = alloc_preg (cfg);
+ int klass_reg = alloc_preg (cfg);
+ MonoInst *tls_get = mono_get_jit_tls_intrinsic (cfg);
+
+ if (!tls_get) {
+ fprintf (stderr, "error: --debug=casts not supported on this platform.\n.");
+ exit (1);
+ }
+
+ MONO_ADD_INS (cfg->cbb, tls_get);
+ MONO_EMIT_NEW_LOAD_MEMBASE (cfg, vtable_reg, obj_reg, G_STRUCT_OFFSET (MonoObject, vtable));
+ MONO_EMIT_NEW_LOAD_MEMBASE (cfg, klass_reg, vtable_reg, G_STRUCT_OFFSET (MonoVTable, klass));
+
+ MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), klass_reg);
+ MONO_EMIT_NEW_PCONST (cfg, to_klass_reg, klass);
+ MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_to), to_klass_reg);
+ }
+}
+
+static void
+reset_cast_details (MonoCompile *cfg)
+{
+ /* Reset the variables holding the cast details */
+ if (mini_get_debug_options ()->better_cast_details) {
+ MonoInst *tls_get = mono_get_jit_tls_intrinsic (cfg);
+
+ MONO_ADD_INS (cfg->cbb, tls_get);
+ /* It is enough to reset the from field */
+ MONO_EMIT_NEW_STORE_MEMBASE_IMM (cfg, OP_STORE_MEMBASE_IMM, tls_get->dreg, G_STRUCT_OFFSET (MonoJitTlsData, class_cast_from), 0);
+ }
+}
+