1 /**
2  * \file
3  * Copyright 2015 Xamarin Inc
4  * Licensed under the MIT license. See LICENSE file in the project root for full license information.
5  */
6 
7 #ifndef __MONO_SEQ_POINTS_DATA_H__
8 #define __MONO_SEQ_POINTS_DATA_H__
9 
10 #include <glib.h>
11 
12 #define MONO_SEQ_POINT_FLAG_NONEMPTY_STACK 1
13 #define MONO_SEQ_POINT_FLAG_EXIT_IL 2
14 
15 /* IL offsets used to mark the sequence points belonging to method entry/exit events */
16 #define METHOD_ENTRY_IL_OFFSET -1
17 #define METHOD_EXIT_IL_OFFSET 0xffffff
18 
19 #define SEQ_POINT_AOT_EXT ".msym"
20 
21 /* Native offset used to mark seq points in dead code */
22 #define SEQ_POINT_NATIVE_OFFSET_DEAD_CODE -1
23 
24 typedef struct {
25 	int il_offset, native_offset, flags;
26 	/* Offset of indexes of successor sequence points on the compressed buffer */
27 	int next_offset;
28 	/* Number of entries in next */
29 	int next_len;
30 } SeqPoint;
31 
32 typedef struct MonoSeqPointInfo {
33 	int dummy [1];
34 } MonoSeqPointInfo;
35 
36 typedef struct {
37 	SeqPoint seq_point;
38 	guint8* ptr;
39 	guint8* begin;
40 	guint8* end;
41 	gboolean has_debug_data;
42 } SeqPointIterator;
43 
44 void
45 mono_seq_point_info_free (gpointer info);
46 
47 gboolean
48 mono_seq_point_iterator_next (SeqPointIterator* it);
49 
50 void
51 mono_seq_point_iterator_init (SeqPointIterator* it, MonoSeqPointInfo* info);
52 
53 void
54 mono_seq_point_init_next (MonoSeqPointInfo* info, SeqPoint sp, SeqPoint* next);
55 
56 int
57 mono_seq_point_info_write (MonoSeqPointInfo* info, guint8* buffer);
58 
59 int
60 mono_seq_point_info_read (MonoSeqPointInfo** info, guint8* buffer, gboolean copy);
61 
62 int
63 mono_seq_point_info_get_write_size (MonoSeqPointInfo* info);
64 
65 gboolean
66 mono_seq_point_info_add_seq_point (GByteArray* array, SeqPoint *sp, SeqPoint *last_seq_point, GSList *next, gboolean has_debug_data);
67 
68 MonoSeqPointInfo*
69 mono_seq_point_info_new (int len, gboolean alloc_data, guint8 *data, gboolean has_debug_data, int *out_size);
70 
71 gboolean
72 mono_seq_point_find_prev_by_native_offset (MonoSeqPointInfo* info, int native_offset, SeqPoint* seq_point);
73 
74 gboolean
75 mono_seq_point_find_next_by_native_offset (MonoSeqPointInfo* info, int native_offset, SeqPoint* seq_point);
76 
77 gboolean
78 mono_seq_point_find_by_il_offset (MonoSeqPointInfo* info, int il_offset, SeqPoint* seq_point);
79 
80 /*
81  * SeqPointData struct and functions
82  * This is used to store/load/use sequence point from a file
83  */
84 
85 typedef struct {
86 	guint32 method_token;
87 	guint32 method_index;
88 	MonoSeqPointInfo* seq_points;
89 	gboolean free_seq_points;
90 } SeqPointDataEntry;
91 
92 typedef struct {
93 	SeqPointDataEntry* entries;
94 	int entry_count;
95 	int entry_capacity;
96 } SeqPointData;
97 
98 void
99 mono_seq_point_data_init (SeqPointData *data, int entry_capacity);
100 
101 void
102 mono_seq_point_data_free (SeqPointData *data);
103 
104 gboolean
105 mono_seq_point_data_read (SeqPointData *data, char *path);
106 
107 gboolean
108 mono_seq_point_data_write (SeqPointData *data, char *path);
109 
110 void
111 mono_seq_point_data_add (SeqPointData *data, guint32 methodToken, guint32 methodIndex, MonoSeqPointInfo* info);
112 
113 gboolean
114 mono_seq_point_data_get (SeqPointData *data, guint32 methodToken, guint32 methodIndex, MonoSeqPointInfo** info);
115 
116 gboolean
117 mono_seq_point_data_get_il_offset (char *path, guint32 methodToken, guint32 methodIndex, guint32 native_offset, guint32 *il_offset);
118 
119 #endif /* __MONO_SEQ_POINTS_DATA_H__ */
120