targetinfo = (PMonoUnwindInfo)ALIGN_TO (pos, 8);
+ targetinfo->runtimeFunction.BeginAddress = ((DWORD64)ji->code_start) - ((DWORD64)Context);
+ targetinfo->runtimeFunction.EndAddress = pos - ((DWORD64)Context);
targetinfo->runtimeFunction.UnwindData = ((DWORD64)&targetinfo->unwindInfo) - ((DWORD64)Context);
return &targetinfo->runtimeFunction;
g_free (unwindinfo);
*monoui = 0;
+}
+
+void
+mono_arch_code_chunk_new (void *chunk, int size)
+{
+ BOOLEAN success = RtlInstallFunctionTableCallback (((DWORD64)chunk) | 0x3, (DWORD64)chunk, size, MONO_GET_RUNTIME_FUNCTION_CALLBACK, chunk, NULL);
+ g_assert (success);
+}
- RtlInstallFunctionTableCallback (((DWORD64)code) | 0x3, (DWORD64)code, code_size, MONO_GET_RUNTIME_FUNCTION_CALLBACK, code, NULL);
+void mono_arch_code_chunk_destroy (void *chunk)
+{
+ BOOLEAN success = RtlDeleteFunctionTable ((PRUNTIME_FUNCTION)((DWORD64)chunk | 0x03));
+ g_assert (success);
}
#endif /* defined(TARGET_WIN32) !defined(DISABLE_JIT) */
void mono_arch_unwindinfo_install_unwind_info (gpointer* monoui, gpointer code, guint code_size);
#define MONO_ARCH_HAVE_UNWIND_TABLE 1
+
+void mono_arch_code_chunk_new (void *chunk, int size);
+void mono_arch_code_chunk_destroy (void *chunk);
+#define MONO_ARCH_HAVE_CODE_CHUNK_TRACKING 1
#endif
CallInfo* mono_arch_get_call_info (MonoMemPool *mp, MonoMethodSignature *sig);
domain->runtime_info = NULL;
}
+#ifdef MONO_ARCH_HAVE_CODE_CHUNK_TRACKING
+
+static void
+code_manager_chunk_new (void *chunk, int size)
+{
+ mono_arch_code_chunk_new (chunk, size);
+}
+
+static void
+code_manager_chunk_destroy (void *chunk)
+{
+ mono_arch_code_chunk_destroy (chunk);
+}
+
+#endif
+
#ifdef ENABLE_LLVM
static gboolean
llvm_init_inner (void)
MonoDomain *domain;
MonoRuntimeCallbacks callbacks;
MonoThreadInfoRuntimeCallbacks ticallbacks;
+ MonoCodeManagerCallbacks code_manager_callbacks;
MONO_VES_INIT_BEGIN ();
mono_code_manager_init ();
+ memset (&code_manager_callbacks, 0, sizeof (code_manager_callbacks));
+#ifdef MONO_ARCH_HAVE_CODE_CHUNK_TRACKING
+ code_manager_callbacks.chunk_new = code_manager_chunk_new;
+ code_manager_callbacks.chunk_destroy = code_manager_chunk_destroy;
+#endif
+ mono_code_manager_install_callbacks (&code_manager_callbacks);
+
mono_hwcap_init ();
mono_arch_cpu_init ();
static size_t dynamic_code_alloc_count;
static size_t dynamic_code_bytes_count;
static size_t dynamic_code_frees_count;
+static MonoCodeManagerCallbacks code_manager_callbacks;
/*
* AMD64 processors maintain icache coherency only for pages which are
codechunk_cleanup ();
}
+void
+mono_code_manager_install_callbacks (MonoCodeManagerCallbacks* callbacks)
+{
+ code_manager_callbacks = *callbacks;
+}
+
/**
* mono_code_manager_new:
*
for (; chunk; ) {
dead = chunk;
mono_profiler_code_chunk_destroy ((gpointer) dead->data);
+ if (code_manager_callbacks.chunk_destroy)
+ code_manager_callbacks.chunk_destroy ((gpointer)dead->data);
chunk = chunk->next;
if (dead->flags == CODE_FLAG_MMAP) {
codechunk_vfree (dead->data, dead->size);
chunk->flags = flags;
chunk->pos = bsize;
chunk->bsize = bsize;
+ if (code_manager_callbacks.chunk_new)
+ code_manager_callbacks.chunk_new ((gpointer)chunk->data, chunk->size);
mono_profiler_code_chunk_new((gpointer) chunk->data, chunk->size);
code_memory_used += chunk_size;
typedef struct _MonoCodeManager MonoCodeManager;
+typedef struct {
+ void (*chunk_new) (void *chunk, int size);
+ void (*chunk_destroy) (void *chunk);
+} MonoCodeManagerCallbacks;
+
MONO_API MonoCodeManager* mono_code_manager_new (void);
MONO_API MonoCodeManager* mono_code_manager_new_dynamic (void);
MONO_API void mono_code_manager_destroy (MonoCodeManager *cman);
MONO_API int mono_code_manager_size (MonoCodeManager *cman, int *used_size);
MONO_API void mono_code_manager_init (void);
MONO_API void mono_code_manager_cleanup (void);
+MONO_API void mono_code_manager_install_callbacks (MonoCodeManagerCallbacks* callbacks);
/* find the extra block allocated to resolve branches close to code */
typedef int (*MonoCodeManagerFunc) (void *data, int csize, int size, void *user_data);