X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fchecked-build.h;h=3dcbe286cca7ee4da0924ddf14f8e010e40607b7;hb=8e6f129087207e14b5bc411554229441a7b522e6;hp=28932d8c630204ff83e6bae5d3cd46cb49f2c062;hpb=19f5033b7d89aacbd1486db2d236fac6b75b87b8;p=mono.git diff --git a/mono/utils/checked-build.h b/mono/utils/checked-build.h index 28932d8c630..3dcbe286cca 100644 --- a/mono/utils/checked-build.h +++ b/mono/utils/checked-build.h @@ -12,13 +12,26 @@ #include #include +#include +#include + +typedef enum { + MONO_CHECK_MODE_NONE = 0, + MONO_CHECK_MODE_GC = 0x1, + MONO_CHECK_MODE_METADATA = 0x2, + MONO_CHECK_MODE_THREAD = 0x4, + MONO_CHECK_MODE_ALL = MONO_CHECK_MODE_GC | MONO_CHECK_MODE_METADATA | MONO_CHECK_MODE_THREAD, + MONO_CHECK_MODE_UNKNOWN = 0x8 +} MonoCheckMode; + +mono_bool mono_check_mode_enabled (MonoCheckMode query); // This is for metadata writes which we have chosen not to check at the current time. // Because in principle this should never happen, we still use a macro so that the exemptions will be easier to find, and remove, later. // 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) -#if defined(CHECKED_BUILD) +#ifdef ENABLE_CHECKED_BUILD #define g_assert_checked g_assert @@ -45,10 +58,9 @@ void checked_build_init (void); #define CHECKED_MONO_INIT() -#endif /* CHECKED_BUILD */ - -#if defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_GC) +#endif /* ENABLE_CHECKED_BUILD */ +#ifdef ENABLE_CHECKED_BUILD_GC /* GC runtime modes rules: @@ -149,9 +161,9 @@ void assert_in_gc_critical_region (void); #define MONO_REQ_GC_NOT_CRITICAL #define MONO_REQ_GC_CRITICAL -#endif /* defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_GC) */ +#endif /* defined(ENABLE_CHECKED_BUILD_GC) */ -#if defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_METADATA) +#ifdef ENABLE_CHECKED_BUILD_METADATA // Use when writing a pointer from one image or imageset to another. #define CHECKED_METADATA_WRITE_PTR(ptr, val) do { \ @@ -174,15 +186,21 @@ void assert_in_gc_critical_region (void); void check_metadata_store(void *from, void *to); void check_metadata_store_local(void *from, void *to); +#define CHECKED_METADATA_STORE(ptr, val) check_metadata_store ((ptr), (val)) +#define CHECKED_METADATA_STORE_LOCAL(ptr, val) check_metadata_store_local ((ptr), (val)) + #else #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) */ +#define CHECKED_METADATA_STORE(ptr, val) do { (ptr); (val); } while (0) +#define CHECKED_METADATA_STORE_LOCAL(ptr, val) do { (ptr); (val); } while (0) -#if defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_THREAD) +#endif /* defined(ENABLE_CHECKED_BUILD_METADATA) */ + +#ifdef ENABLE_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); \ @@ -190,10 +208,14 @@ void check_metadata_store_local(void *from, void *to); void checked_build_thread_transition(const char *transition, void *info, int from_state, int suspend_count, int next_state, int suspend_count_delta); +G_GNUC_NORETURN MONO_ATTR_FORMAT_PRINTF(1,2) void mono_fatal_with_history(const char *msg, ...); + #else #define CHECKED_BUILD_THREAD_TRANSITION(transition, info, from_state, suspend_count, next_state, suspend_count_delta) -#endif /* defined(CHECKED_BUILD) && !defined(DISABLE_CHECKED_BUILD_THREAD) */ +#define mono_fatal_with_history g_error + +#endif /* defined(ENABLE_CHECKED_BUILD_THREAD) */ #endif /* __CHECKED_BUILD_H__ */