[runtime] Avoid indirection when building MonoContext on darwin
[mono.git] / mono / utils / mono-stack-unwinding.h
1 /**
2  * \file
3  * Copyright 2008-2010 Novell, Inc.
4  * Copyright 2011 Xamarin Inc.
5  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
6  */
7 #ifndef __MONO_MONO_STACK_UNWINDING_H__
8 #define __MONO_MONO_STACK_UNWINDING_H__
9
10 #include <mono/metadata/appdomain.h>
11 #include <mono/metadata/metadata.h>
12 #include <mono/utils/mono-context.h>
13
14 /*
15  * Possible frame types returned by the stack walker.
16  */
17 typedef enum {
18         /* Normal managed frames */
19         FRAME_TYPE_MANAGED = 0,
20         /* Pseudo frame marking the start of a method invocation done by the soft debugger */
21         FRAME_TYPE_DEBUGGER_INVOKE = 1,
22         /* Frame for transitioning to native code */
23         FRAME_TYPE_MANAGED_TO_NATIVE = 2,
24         FRAME_TYPE_TRAMPOLINE = 3,
25         /* Interpreter frame */
26         FRAME_TYPE_INTERP = 4,
27         /* Frame for transitioning from interpreter to managed code */
28         FRAME_TYPE_INTERP_TO_MANAGED = 5,
29         FRAME_TYPE_NUM = 6
30 } MonoStackFrameType;
31
32 typedef enum {
33         MONO_UNWIND_NONE = 0x0,
34         MONO_UNWIND_LOOKUP_IL_OFFSET = 0x1,
35         /* NOT signal safe */
36         MONO_UNWIND_LOOKUP_ACTUAL_METHOD = 0x2,
37         /*
38          * Store the locations where caller-saved registers are saved on the stack in
39          * frame->reg_locations. The pointer is only valid during the call to the unwind
40          * callback.
41          */
42         MONO_UNWIND_REG_LOCATIONS = 0x4,
43         MONO_UNWIND_DEFAULT = MONO_UNWIND_LOOKUP_ACTUAL_METHOD,
44         MONO_UNWIND_SIGNAL_SAFE = MONO_UNWIND_NONE,
45         MONO_UNWIND_LOOKUP_ALL = MONO_UNWIND_LOOKUP_IL_OFFSET | MONO_UNWIND_LOOKUP_ACTUAL_METHOD,
46 } MonoUnwindOptions;
47
48 typedef struct {
49         MonoStackFrameType type;
50         /* 
51          * For FRAME_TYPE_MANAGED, otherwise NULL.
52          */
53         MonoJitInfo *ji;
54         /*
55          * Same as ji->method.
56          * Not valid if ASYNC_CONTEXT is true.
57          */
58         MonoMethod *method;
59         /*
60          * If ji->method is a gshared method, this is the actual method instance.
61          * This is only filled if lookup for actual method was requested (MONO_UNWIND_LOOKUP_ACTUAL_METHOD)
62          * Not valid if ASYNC_CONTEXT is true.
63          */
64         MonoMethod *actual_method;
65         /* The domain containing the code executed by this frame */
66         MonoDomain *domain;
67         /* Whenever method is a user level method */
68         gboolean managed;
69         /*
70          * Whenever this frame was loaded in async context.
71          */
72         gboolean async_context;
73         int native_offset;
74         /*
75          * IL offset of this frame.
76          * Only available if the runtime have debugging enabled (--debug switch) and 
77          *  il offset resultion was requested (MONO_UNWIND_LOOKUP_IL_OFFSET)
78          */
79         int il_offset;
80
81         /* For FRAME_TYPE_INTERP_EXIT */
82         gpointer interp_exit_data;
83
84         /* For FRAME_TYPE_INTERP */
85         gpointer interp_frame;
86
87         /* The next fields are only useful for the jit */
88         gpointer lmf;
89         guint32 unwind_info_len;
90         guint8 *unwind_info;
91
92         mgreg_t **reg_locations;
93 } MonoStackFrameInfo;
94
95 /*Index into MonoThreadState::unwind_data. */
96 enum {
97         MONO_UNWIND_DATA_DOMAIN,
98         MONO_UNWIND_DATA_LMF,
99         MONO_UNWIND_DATA_JIT_TLS,       
100 };
101
102 /*
103  * This structs holds all information needed to unwind the stack
104  * of a thread.
105  */
106 typedef struct {
107         MonoContext ctx;
108         gpointer unwind_data [3]; /*right now: domain, lmf and jit_tls*/
109         gboolean valid;
110         void *gc_stackdata;
111         int gc_stackdata_size;
112 } MonoThreadUnwindState;
113
114
115 #endif