LLVM OpenMP* Runtime Library
kmp_debugger.c
1 #if USE_DEBUGGER
2 /*
3  * kmp_debugger.c -- debugger support.
4  */
5 
6 
7 //===----------------------------------------------------------------------===//
8 //
9 // The LLVM Compiler Infrastructure
10 //
11 // This file is dual licensed under the MIT and the University of Illinois Open
12 // Source Licenses. See LICENSE.txt for details.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 
17 #include "kmp.h"
18 #include "kmp_lock.h"
19 #include "kmp_omp.h"
20 #include "kmp_str.h"
21 
22 /*
23  NOTE: All variable names are known to the debugger, do not change!
24 */
25 
26 #ifdef __cplusplus
27  extern "C" {
28  extern kmp_omp_struct_info_t __kmp_omp_debug_struct_info;
29  } // extern "C"
30 #endif // __cplusplus
31 
32 int __kmp_debugging = FALSE; // Boolean whether currently debugging OpenMP RTL.
33 
34 #define offset_and_size_of( structure, field ) \
35  { \
36  offsetof( structure, field ), \
37  sizeof( ( (structure *) NULL)->field ) \
38  }
39 
40 #define offset_and_size_not_available \
41  { -1, -1 }
42 
43 #define addr_and_size_of( var ) \
44  { \
45  (kmp_uint64)( & var ), \
46  sizeof( var ) \
47  }
48 
49 #define nthr_buffer_size 1024
50 static kmp_int32
51 kmp_omp_nthr_info_buffer[ nthr_buffer_size ] =
52  { nthr_buffer_size * sizeof( kmp_int32 ) };
53 
54 /* TODO: Check punctuation for various platforms here */
55 static char func_microtask[] = "__kmp_invoke_microtask";
56 static char func_fork[] = "__kmpc_fork_call";
57 static char func_fork_teams[] = "__kmpc_fork_teams";
58 
59 
60 // Various info about runtime structures: addresses, field offsets, sizes, etc.
61 kmp_omp_struct_info_t
62 __kmp_omp_debug_struct_info = {
63 
64  /* Change this only if you make a fundamental data structure change here */
65  KMP_OMP_VERSION,
66 
67  /* sanity check. Only should be checked if versions are identical
68  * This is also used for backward compatibility to get the runtime
69  * structure size if it the runtime is older than the interface */
70  sizeof( kmp_omp_struct_info_t ),
71 
72  /* OpenMP RTL version info. */
73  addr_and_size_of( __kmp_version_major ),
74  addr_and_size_of( __kmp_version_minor ),
75  addr_and_size_of( __kmp_version_build ),
76  addr_and_size_of( __kmp_openmp_version ),
77  { (kmp_uint64)( __kmp_copyright ) + KMP_VERSION_MAGIC_LEN, 0 }, // Skip magic prefix.
78 
79  /* Various globals. */
80  addr_and_size_of( __kmp_threads ),
81  addr_and_size_of( __kmp_root ),
82  addr_and_size_of( __kmp_threads_capacity ),
83  addr_and_size_of( __kmp_monitor ),
84 #if ! KMP_USE_DYNAMIC_LOCK
85  addr_and_size_of( __kmp_user_lock_table ),
86 #endif
87  addr_and_size_of( func_microtask ),
88  addr_and_size_of( func_fork ),
89  addr_and_size_of( func_fork_teams ),
90  addr_and_size_of( __kmp_team_counter ),
91  addr_and_size_of( __kmp_task_counter ),
92  addr_and_size_of( kmp_omp_nthr_info_buffer ),
93  sizeof( void * ),
94  OMP_LOCK_T_SIZE < sizeof(void *),
95  bs_last_barrier,
96  TASK_DEQUE_SIZE,
97 
98  // thread structure information
99  sizeof( kmp_base_info_t ),
100  offset_and_size_of( kmp_base_info_t, th_info ),
101  offset_and_size_of( kmp_base_info_t, th_team ),
102  offset_and_size_of( kmp_base_info_t, th_root ),
103  offset_and_size_of( kmp_base_info_t, th_serial_team ),
104  offset_and_size_of( kmp_base_info_t, th_ident ),
105  offset_and_size_of( kmp_base_info_t, th_spin_here ),
106  offset_and_size_of( kmp_base_info_t, th_next_waiting ),
107  offset_and_size_of( kmp_base_info_t, th_task_team ),
108  offset_and_size_of( kmp_base_info_t, th_current_task ),
109  offset_and_size_of( kmp_base_info_t, th_task_state ),
110  offset_and_size_of( kmp_base_info_t, th_bar ),
111  offset_and_size_of( kmp_bstate_t, b_worker_arrived ),
112 
113  // teams information
114  offset_and_size_of( kmp_base_info_t, th_teams_microtask),
115  offset_and_size_of( kmp_base_info_t, th_teams_level),
116  offset_and_size_of( kmp_teams_size_t, nteams ),
117  offset_and_size_of( kmp_teams_size_t, nth ),
118 
119  // kmp_desc structure (for info field above)
120  sizeof( kmp_desc_base_t ),
121  offset_and_size_of( kmp_desc_base_t, ds_tid ),
122  offset_and_size_of( kmp_desc_base_t, ds_gtid ),
123  // On Windows* OS, ds_thread contains a thread /handle/, which is not usable, while thread /id/
124  // is in ds_thread_id.
125  #if KMP_OS_WINDOWS
126  offset_and_size_of( kmp_desc_base_t, ds_thread_id),
127  #else
128  offset_and_size_of( kmp_desc_base_t, ds_thread),
129  #endif
130 
131  // team structure information
132  sizeof( kmp_base_team_t ),
133  offset_and_size_of( kmp_base_team_t, t_master_tid ),
134  offset_and_size_of( kmp_base_team_t, t_ident ),
135  offset_and_size_of( kmp_base_team_t, t_parent ),
136  offset_and_size_of( kmp_base_team_t, t_nproc ),
137  offset_and_size_of( kmp_base_team_t, t_threads ),
138  offset_and_size_of( kmp_base_team_t, t_serialized ),
139  offset_and_size_of( kmp_base_team_t, t_id ),
140  offset_and_size_of( kmp_base_team_t, t_pkfn ),
141  offset_and_size_of( kmp_base_team_t, t_task_team ),
142  offset_and_size_of( kmp_base_team_t, t_implicit_task_taskdata ),
143  offset_and_size_of( kmp_base_team_t, t_cancel_request ),
144  offset_and_size_of( kmp_base_team_t, t_bar ),
145  offset_and_size_of( kmp_balign_team_t, b_master_arrived ),
146  offset_and_size_of( kmp_balign_team_t, b_team_arrived ),
147 
148  // root structure information
149  sizeof( kmp_base_root_t ),
150  offset_and_size_of( kmp_base_root_t, r_root_team ),
151  offset_and_size_of( kmp_base_root_t, r_hot_team ),
152  offset_and_size_of( kmp_base_root_t, r_uber_thread ),
153  offset_and_size_not_available,
154 
155  // ident structure information
156  sizeof( ident_t ),
157  offset_and_size_of( ident_t, psource ),
158  offset_and_size_of( ident_t, flags ),
159 
160  // lock structure information
161  sizeof( kmp_base_queuing_lock_t ),
162  offset_and_size_of( kmp_base_queuing_lock_t, initialized ),
163  offset_and_size_of( kmp_base_queuing_lock_t, location ),
164  offset_and_size_of( kmp_base_queuing_lock_t, tail_id ),
165  offset_and_size_of( kmp_base_queuing_lock_t, head_id ),
166  offset_and_size_of( kmp_base_queuing_lock_t, next_ticket ),
167  offset_and_size_of( kmp_base_queuing_lock_t, now_serving ),
168  offset_and_size_of( kmp_base_queuing_lock_t, owner_id ),
169  offset_and_size_of( kmp_base_queuing_lock_t, depth_locked ),
170  offset_and_size_of( kmp_base_queuing_lock_t, flags ),
171 
172 #if ! KMP_USE_DYNAMIC_LOCK
173  /* Lock table. */
174  sizeof( kmp_lock_table_t ),
175  offset_and_size_of( kmp_lock_table_t, used ),
176  offset_and_size_of( kmp_lock_table_t, allocated ),
177  offset_and_size_of( kmp_lock_table_t, table ),
178 #endif
179 
180  // Task team structure information.
181  sizeof( kmp_base_task_team_t ),
182  offset_and_size_of( kmp_base_task_team_t, tt_threads_data ),
183  offset_and_size_of( kmp_base_task_team_t, tt_found_tasks ),
184  offset_and_size_of( kmp_base_task_team_t, tt_nproc ),
185  offset_and_size_of( kmp_base_task_team_t, tt_unfinished_threads ),
186  offset_and_size_of( kmp_base_task_team_t, tt_active ),
187 
188  // task_data_t.
189  sizeof( kmp_taskdata_t ),
190  offset_and_size_of( kmp_taskdata_t, td_task_id ),
191  offset_and_size_of( kmp_taskdata_t, td_flags ),
192  offset_and_size_of( kmp_taskdata_t, td_team ),
193  offset_and_size_of( kmp_taskdata_t, td_parent ),
194  offset_and_size_of( kmp_taskdata_t, td_level ),
195  offset_and_size_of( kmp_taskdata_t, td_ident ),
196  offset_and_size_of( kmp_taskdata_t, td_allocated_child_tasks ),
197  offset_and_size_of( kmp_taskdata_t, td_incomplete_child_tasks ),
198 
199  offset_and_size_of( kmp_taskdata_t, td_taskwait_ident ),
200  offset_and_size_of( kmp_taskdata_t, td_taskwait_counter ),
201  offset_and_size_of( kmp_taskdata_t, td_taskwait_thread ),
202 
203  offset_and_size_of( kmp_taskdata_t, td_taskgroup ),
204  offset_and_size_of( kmp_taskgroup_t, count ),
205  offset_and_size_of( kmp_taskgroup_t, cancel_request ),
206 
207  offset_and_size_of( kmp_taskdata_t, td_depnode ),
208  offset_and_size_of( kmp_depnode_list_t, node ),
209  offset_and_size_of( kmp_depnode_list_t, next ),
210  offset_and_size_of( kmp_base_depnode_t, successors ),
211  offset_and_size_of( kmp_base_depnode_t, task ),
212  offset_and_size_of( kmp_base_depnode_t, npredecessors ),
213  offset_and_size_of( kmp_base_depnode_t, nrefs ),
214  offset_and_size_of( kmp_task_t, routine ),
215 
216  // thread_data_t.
217  sizeof( kmp_thread_data_t ),
218  offset_and_size_of( kmp_base_thread_data_t, td_deque ),
219  offset_and_size_of( kmp_base_thread_data_t, td_deque_head ),
220  offset_and_size_of( kmp_base_thread_data_t, td_deque_tail ),
221  offset_and_size_of( kmp_base_thread_data_t, td_deque_ntasks ),
222  offset_and_size_of( kmp_base_thread_data_t, td_deque_last_stolen ),
223 
224  // The last field.
225  KMP_OMP_VERSION,
226 
227 }; // __kmp_omp_debug_struct_info
228 
229 #undef offset_and_size_of
230 #undef addr_and_size_of
231 
232 /*
233  Intel compiler on IA-32 architecture issues a warning "conversion
234  from "unsigned long long" to "char *" may lose significant bits"
235  when 64-bit value is assigned to 32-bit pointer. Use this function
236  to suppress the warning.
237 */
238 static inline
239 void *
240 __kmp_convert_to_ptr(
241  kmp_uint64 addr
242 ) {
243  #if KMP_COMPILER_ICC
244  #pragma warning( push )
245  #pragma warning( disable: 810 ) // conversion from "unsigned long long" to "char *" may lose significant bits
246  #pragma warning( disable: 1195 ) // conversion from integer to smaller pointer
247  #endif // KMP_COMPILER_ICC
248  return (void *) addr;
249  #if KMP_COMPILER_ICC
250  #pragma warning( pop )
251  #endif // KMP_COMPILER_ICC
252 } // __kmp_convert_to_ptr
253 
254 
255 static int
256 kmp_location_match(
257  kmp_str_loc_t * loc,
258  kmp_omp_nthr_item_t * item
259 ) {
260 
261  int file_match = 0;
262  int func_match = 0;
263  int line_match = 0;
264 
265  char * file = (char *) __kmp_convert_to_ptr( item->file );
266  char * func = (char *) __kmp_convert_to_ptr( item->func );
267  file_match = __kmp_str_fname_match( & loc->fname, file );
268  func_match =
269  item->func == 0 // If item->func is NULL, it allows any func name.
270  ||
271  strcmp( func, "*" ) == 0
272  ||
273  ( loc->func != NULL && strcmp( loc->func, func ) == 0 );
274  line_match =
275  item->begin <= loc->line
276  &&
277  ( item->end <= 0 || loc->line <= item->end ); // if item->end <= 0, it means "end of file".
278 
279  return ( file_match && func_match && line_match );
280 
281 } // kmp_location_match
282 
283 
284 int
285 __kmp_omp_num_threads(
286  ident_t const * ident
287 ) {
288 
289  int num_threads = 0;
290 
291  kmp_omp_nthr_info_t * info =
292  (kmp_omp_nthr_info_t *) __kmp_convert_to_ptr( __kmp_omp_debug_struct_info.nthr_info.addr );
293  if ( info->num > 0 && info->array != 0 ) {
294  kmp_omp_nthr_item_t * items = (kmp_omp_nthr_item_t *) __kmp_convert_to_ptr( info->array );
295  kmp_str_loc_t loc = __kmp_str_loc_init( ident->psource, 1 );
296  int i;
297  for ( i = 0; i < info->num; ++ i ) {
298  if ( kmp_location_match( & loc, & items[ i ] ) ) {
299  num_threads = items[ i ].num_threads;
300  }; // if
301  }; // for
302  __kmp_str_loc_free( & loc );
303  }; // if
304 
305  return num_threads;;
306 
307 } // __kmp_omp_num_threads
308 #endif /* USE_DEBUGGER */
Definition: kmp.h:198
char const * psource
Definition: kmp.h:207
struct ident ident_t