fi
], [with_checked_build=no])
+if test x$with_checked_build != xno ; then
+ DISABLED_CHECKED_BUILD_TEST=none
+
+ AC_ARG_ENABLE(checked_build_test, [ --enable-checked-build-test=LIST drop support for LIST checked build tests. LIST is a comma-separated list from: gc, metadata, thread.],
+ [
+ for feature in `echo "$enable_checked_build_test" | sed -e "s/,/ /g"`; do
+ eval "mono_checked_build_test_disable_$feature='yes'"
+ done
+ DISABLED_CHECKED_BUILD_TEST=$enable_checked_build_test
+ ],[])
+
+ if test "x$mono_checked_build_test_disable_gc" = "xyes"; then
+ AC_DEFINE(DISABLE_CHECKED_BUILD_GC, 1, [Disable GC checked build])
+ fi
+
+ if test "x$mono_checked_build_test_disable_metadata" = "xyes"; then
+ AC_DEFINE(DISABLE_CHECKED_BUILD_METADATA, 1, [Disable metadata checked build])
+ fi
+
+ if test "x$mono_checked_build_test_disable_thread" = "xyes"; then
+ AC_DEFINE(DISABLE_CHECKED_BUILD_THREAD, 1, [Disable thread checked build])
+ fi
+fi
AC_CHECK_HEADER([malloc.h],
[AC_DEFINE([HAVE_USR_INCLUDE_MALLOC_H], [1],
* (C) 2015 Xamarin
*/
#include <config.h>
+
#ifdef CHECKED_BUILD
#include <mono/utils/checked-build.h>
#include <mono/metadata/reflection-internals.h>
#include <glib.h>
+#ifdef HAVE_BACKTRACE_SYMBOLS
+#include <execinfo.h>
+#endif
+
+typedef struct {
+ GPtrArray *transitions;
+ guint32 in_gc_critical_region;
+} CheckState;
+
+static MonoNativeTlsKey thread_status;
+
+void
+checked_build_init (void)
+{
+ mono_native_tls_alloc (&thread_status, NULL);
+}
+
+static CheckState*
+get_state (void)
+{
+ CheckState *state = mono_native_tls_get_value (thread_status);
+ if (!state) {
+ state = g_new0 (CheckState, 1);
+ state->transitions = g_ptr_array_new ();
+ mono_native_tls_set_value (thread_status, state);
+ }
+
+ return state;
+}
+
+#if !defined(DISABLE_CHECKED_BUILD_THREAD)
+
#define MAX_NATIVE_BT 6
#define MAX_NATIVE_BT_PROBE (MAX_NATIVE_BT + 5)
#define MAX_TRANSITIONS 3
-
#ifdef HAVE_BACKTRACE_SYMBOLS
-#include <execinfo.h>
//XXX We should collect just the IPs and lazily symbolificate them.
static int
#endif
-
-typedef struct {
- GPtrArray *transitions;
- guint32 in_gc_critical_region;
-} CheckState;
-
typedef struct {
const char *name;
int from_state, next_state, suspend_count, suspend_count_delta, size;
gpointer backtrace [MAX_NATIVE_BT_PROBE];
} ThreadTransition;
-static MonoNativeTlsKey thread_status;
-
-void
-checked_build_init (void)
-{
- mono_native_tls_alloc (&thread_status, NULL);
-}
-
-static CheckState*
-get_state (void)
-{
- CheckState *state = mono_native_tls_get_value (thread_status);
- if (!state) {
- state = g_new0 (CheckState, 1);
- state->transitions = g_ptr_array_new ();
- mono_native_tls_set_value (thread_status, state);
- }
-
- return state;
-}
-
static void
free_transition (ThreadTransition *t)
{
g_ptr_array_add (state->transitions, t);
}
+#endif /* !defined(DISABLE_CHECKED_BUILD_THREAD) */
+
+#if !defined(DISABLE_CHECKED_BUILD_GC)
+
static void
assertion_fail (const char *msg, ...)
{
assertion_fail("Expected GC critical region");
}
+#endif /* !defined(DISABLE_CHECKED_BUILD_GC) */
+
+#if !defined(DISABLE_CHECKED_BUILD_METADATA)
+
// check_metadata_store et al: The goal of these functions is to verify that if there is a pointer from one mempool into
// another, that the pointed-to memory is protected by the reference count mechanism for MonoImages.
//
check_mempool_may_reference_mempool (from, to, TRUE);
}
+#endif /* !defined(DISABLE_CHECKED_BUILD_METADATA) */
+
#endif /* CHECKED_BUILD */
// The current reason why this is needed is for pointers to constant strings, which the checker cannot verify yet.
#define CHECKED_METADATA_WRITE_PTR_EXEMPT(ptr, val) do { (ptr) = (val); } while (0)
-#ifdef CHECKED_BUILD
+#if defined(CHECKED_BUILD)
#define g_assert_checked g_assert
+/*
+This can be called by embedders
+*/
+#define MONO_REQ_API_ENTRYPOINT
+
+/*
+The JIT will generate code that will land on this function
+*/
+#define MONO_REQ_RUNTIME_ENTRYPOINT
+
+#define CHECKED_MONO_INIT() do { checked_build_init (); } while (0)
+
+void checked_build_init (void);
+
+#else
+
+#define g_assert_checked(...)
+
+#define MONO_REQ_API_ENTRYPOINT
+#define MONO_REQ_RUNTIME_ENTRYPOINT
+
+#define CHECKED_MONO_INIT()
+
+#endif /* CHECKED_BUILD */
+
+#if defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_GC)
+
/*
GC runtime modes rules:
assert_in_gc_critical_region(); \
} while(0)
+void assert_gc_safe_mode (void);
+void assert_gc_unsafe_mode (void);
+void assert_gc_neutral_mode (void);
+
+void* critical_gc_region_begin(void);
+void critical_gc_region_end(void* token);
+void assert_not_in_gc_critical_region(void);
+void assert_in_gc_critical_region (void);
+
+#else
+
+#define MONO_REQ_GC_SAFE_MODE
+#define MONO_REQ_GC_UNSAFE_MODE
+#define MONO_REQ_GC_NEUTRAL_MODE
+
+#define MONO_PREPARE_GC_CRITICAL_REGION
+#define MONO_FINISH_GC_CRITICAL_REGION
+
+#define MONO_REQ_GC_NOT_CRITICAL
+#define MONO_REQ_GC_CRITICAL
+
+#endif /* defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_GC) */
+
+#if defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_METADATA)
+
// Use when writing a pointer from one image or imageset to another.
#define CHECKED_METADATA_WRITE_PTR(ptr, val) do { \
check_metadata_store (&(ptr), (val)); \
mono_atomic_store_release (&(ptr), (val)); \
} while (0);
-/*
-This can be called by embedders
-*/
-#define MONO_REQ_API_ENTRYPOINT
+void check_metadata_store(void *from, void *to);
+void check_metadata_store_local(void *from, void *to);
-/*
-The JIT will generate code that will land on this function
-*/
-#define MONO_REQ_RUNTIME_ENTRYPOINT
+#else
-#define CHECKED_MONO_INIT() do { checked_build_init (); } while (0)
+#define CHECKED_METADATA_WRITE_PTR(ptr, val) do { (ptr) = (val); } while (0)
+#define CHECKED_METADATA_WRITE_PTR_LOCAL(ptr, val) do { (ptr) = (val); } while (0)
+#define CHECKED_METADATA_WRITE_PTR_ATOMIC(ptr, val) do { mono_atomic_store_release (&(ptr), (val)); } while (0)
+
+#endif /* defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_METADATA) */
+
+#if defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_THREAD)
#define CHECKED_BUILD_THREAD_TRANSITION(transition, info, from_state, suspend_count, next_state, suspend_count_delta) do { \
checked_build_thread_transition (transition, info, from_state, suspend_count, next_state, suspend_count_delta); \
} while (0)
-void assert_gc_safe_mode (void);
-void assert_gc_unsafe_mode (void);
-void assert_gc_neutral_mode (void);
-
-void* critical_gc_region_begin(void);
-void critical_gc_region_end(void* token);
-void assert_not_in_gc_critical_region(void);
-void assert_in_gc_critical_region (void);
-
-void checked_build_init (void);
void checked_build_thread_transition(const char *transition, void *info, int from_state, int suspend_count, int next_state, int suspend_count_delta);
-void check_metadata_store(void *from, void *to);
-void check_metadata_store_local(void *from, void *to);
-
#else
-#define g_assert_checked(...)
-
-#define MONO_REQ_GC_SAFE_MODE
-#define MONO_REQ_GC_UNSAFE_MODE
-#define MONO_REQ_GC_NEUTRAL_MODE
-#define MONO_REQ_API_ENTRYPOINT
-#define MONO_REQ_RUNTIME_ENTRYPOINT
-
-#define MONO_PREPARE_GC_CRITICAL_REGION
-#define MONO_FINISH_GC_CRITICAL_REGION
-
-#define MONO_REQ_GC_NOT_CRITICAL
-#define MONO_REQ_GC_CRITICAL
-
-
-#define CHECKED_MONO_INIT()
#define CHECKED_BUILD_THREAD_TRANSITION(transition, info, from_state, suspend_count, next_state, suspend_count_delta)
-#define CHECKED_METADATA_WRITE_PTR(ptr, val) do { (ptr) = (val); } while (0)
-#define CHECKED_METADATA_WRITE_PTR_LOCAL(ptr, val) do { (ptr) = (val); } while (0)
-#define CHECKED_METADATA_WRITE_PTR_ATOMIC(ptr, val) do { mono_atomic_store_release (&(ptr), (val)); } while (0)
-
-#endif /* CHECKED_BUILD */
+#endif /* defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_THREAD) */
-#endif
+#endif /* __CHECKED_BUILD_H__ */