[runtime] Fix a few warnings in io-layer and utils.
[mono.git] / mono / utils / mono-stack-unwinding.h
index e8280acaeae339386c3eaa462252ae85a217f249..d821f3c5e32b167c5b8c868668f0cb931da592da 100644 (file)
@@ -1,8 +1,13 @@
+/*
+ * Copyright 2008-2010 Novell, Inc.
+ * Copyright 2011 Xamarin Inc.
+ */
 #ifndef __MONO_MONO_STACK_UNWINDING_H__
 #define __MONO_MONO_STACK_UNWINDING_H__
 
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/metadata.h>
+#include <mono/utils/mono-context.h>
 
 /*
  * Possible frame types returned by the stack walker.
@@ -20,7 +25,14 @@ typedef enum {
 typedef enum {
        MONO_UNWIND_NONE = 0x0,
        MONO_UNWIND_LOOKUP_IL_OFFSET = 0x1,
+       /* NOT signal safe */
        MONO_UNWIND_LOOKUP_ACTUAL_METHOD = 0x2,
+       /*
+        * Store the locations where caller-saved registers are saved on the stack in
+        * frame->reg_locations. The pointer is only valid during the call to the unwind
+        * callback.
+        */
+       MONO_UNWIND_REG_LOCATIONS = 0x4,
        MONO_UNWIND_DEFAULT = MONO_UNWIND_LOOKUP_ACTUAL_METHOD,
        MONO_UNWIND_SIGNAL_SAFE = MONO_UNWIND_NONE,
        MONO_UNWIND_LOOKUP_ALL = MONO_UNWIND_LOOKUP_IL_OFFSET | MONO_UNWIND_LOOKUP_ACTUAL_METHOD,
@@ -34,16 +46,22 @@ typedef struct {
        MonoJitInfo *ji;
        /*
         * Same as ji->method.
+        * Not valid if ASYNC_CONTEXT is true.
         */
        MonoMethod *method;
        /*
         * If ji->method is a gshared method, this is the actual method instance.
         * This is only filled if lookup for actual method was requested (MONO_UNWIND_LOOKUP_ACTUAL_METHOD)
+        * Not valid if ASYNC_CONTEXT is true.
         */
        MonoMethod *actual_method;
        /* The domain containing the code executed by this frame */
        MonoDomain *domain;
        gboolean managed;
+       /*
+        * Whenever this frame was loaded in async context.
+        */
+       gboolean async_context;
        int native_offset;
        /*
         * IL offset of this frame.
@@ -52,12 +70,30 @@ typedef struct {
         */
        int il_offset;
 
-       /*The next fields are only usefull for the jit*/
+       /* The next fields are only useful for the jit */
        gpointer lmf;
        guint32 unwind_info_len;
        guint8 *unwind_info;
 
+       mgreg_t **reg_locations;
 } MonoStackFrameInfo;
 
+/*Index into MonoThreadState::unwind_data. */
+enum {
+       MONO_UNWIND_DATA_DOMAIN,
+       MONO_UNWIND_DATA_LMF,
+       MONO_UNWIND_DATA_JIT_TLS,       
+};
+
+/*
+ * This structs holds all information needed to unwind the stack
+ * of a thread.
+ */
+typedef struct {
+       MonoContext ctx;
+       gpointer unwind_data [3]; /*right now: domain, lmf and jit_tls*/
+       gboolean valid;
+} MonoThreadUnwindState;
+
 
-#endif
\ No newline at end of file
+#endif