blob: 8de2cbaedba92a5c44becf2228c7cf2d8fb4bfb5 [file] [log] [blame]
Roman Lebedev06e39502019-01-13 12:54:34 +00001#include "kmp_config.h"
2
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +00003#if USE_DEBUGGER
4/*
Jonathan Peyton30419822017-05-12 18:01:32 +00005 * kmp_debugger.cpp -- debugger support.
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +00006 */
7
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +00008//===----------------------------------------------------------------------===//
9//
10// The LLVM Compiler Infrastructure
11//
12// This file is dual licensed under the MIT and the University of Illinois Open
13// Source Licenses. See LICENSE.txt for details.
14//
15//===----------------------------------------------------------------------===//
16
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000017#include "kmp.h"
18#include "kmp_lock.h"
19#include "kmp_omp.h"
20#include "kmp_str.h"
21
Jonathan Peyton30419822017-05-12 18:01:32 +000022// NOTE: All variable names are known to the debugger, do not change!
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000023
24#ifdef __cplusplus
Jonathan Peyton30419822017-05-12 18:01:32 +000025extern "C" {
26extern kmp_omp_struct_info_t __kmp_omp_debug_struct_info;
27} // extern "C"
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000028#endif // __cplusplus
29
Jonathan Peyton30419822017-05-12 18:01:32 +000030int __kmp_debugging = FALSE; // Boolean whether currently debugging OpenMP RTL.
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000031
Jonathan Peyton30419822017-05-12 18:01:32 +000032#define offset_and_size_of(structure, field) \
33 { offsetof(structure, field), sizeof(((structure *)NULL)->field) }
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000034
Jonathan Peyton30419822017-05-12 18:01:32 +000035#define offset_and_size_not_available \
36 { -1, -1 }
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000037
Jonathan Peyton30419822017-05-12 18:01:32 +000038#define addr_and_size_of(var) \
39 { (kmp_uint64)(&var), sizeof(var) }
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000040
41#define nthr_buffer_size 1024
Jonathan Peyton30419822017-05-12 18:01:32 +000042static kmp_int32 kmp_omp_nthr_info_buffer[nthr_buffer_size] = {
43 nthr_buffer_size * sizeof(kmp_int32)};
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000044
45/* TODO: Check punctuation for various platforms here */
Jonathan Peyton30419822017-05-12 18:01:32 +000046static char func_microtask[] = "__kmp_invoke_microtask";
47static char func_fork[] = "__kmpc_fork_call";
48static char func_fork_teams[] = "__kmpc_fork_teams";
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000049
50// Various info about runtime structures: addresses, field offsets, sizes, etc.
Jonathan Peyton30419822017-05-12 18:01:32 +000051kmp_omp_struct_info_t __kmp_omp_debug_struct_info = {
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000052
53 /* Change this only if you make a fundamental data structure change here */
54 KMP_OMP_VERSION,
55
56 /* sanity check. Only should be checked if versions are identical
57 * This is also used for backward compatibility to get the runtime
58 * structure size if it the runtime is older than the interface */
Jonathan Peyton30419822017-05-12 18:01:32 +000059 sizeof(kmp_omp_struct_info_t),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000060
61 /* OpenMP RTL version info. */
Jonathan Peyton30419822017-05-12 18:01:32 +000062 addr_and_size_of(__kmp_version_major),
63 addr_and_size_of(__kmp_version_minor),
64 addr_and_size_of(__kmp_version_build),
65 addr_and_size_of(__kmp_openmp_version),
66 {(kmp_uint64)(__kmp_copyright) + KMP_VERSION_MAGIC_LEN,
67 0}, // Skip magic prefix.
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000068
69 /* Various globals. */
Jonathan Peyton30419822017-05-12 18:01:32 +000070 addr_and_size_of(__kmp_threads),
71 addr_and_size_of(__kmp_root),
72 addr_and_size_of(__kmp_threads_capacity),
Jonathan Peyton37e2ef52018-07-09 17:36:22 +000073#if KMP_USE_MONITOR
Jonathan Peyton30419822017-05-12 18:01:32 +000074 addr_and_size_of(__kmp_monitor),
Jonathan Peyton37e2ef52018-07-09 17:36:22 +000075#endif
Jonathan Peyton30419822017-05-12 18:01:32 +000076#if !KMP_USE_DYNAMIC_LOCK
77 addr_and_size_of(__kmp_user_lock_table),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000078#endif
Jonathan Peyton30419822017-05-12 18:01:32 +000079 addr_and_size_of(func_microtask),
80 addr_and_size_of(func_fork),
81 addr_and_size_of(func_fork_teams),
82 addr_and_size_of(__kmp_team_counter),
83 addr_and_size_of(__kmp_task_counter),
84 addr_and_size_of(kmp_omp_nthr_info_buffer),
85 sizeof(void *),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000086 OMP_LOCK_T_SIZE < sizeof(void *),
87 bs_last_barrier,
Jonathan Peytonf4f96952016-05-31 19:07:00 +000088 INITIAL_TASK_DEQUE_SIZE,
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +000089
90 // thread structure information
Jonathan Peyton30419822017-05-12 18:01:32 +000091 sizeof(kmp_base_info_t),
92 offset_and_size_of(kmp_base_info_t, th_info),
93 offset_and_size_of(kmp_base_info_t, th_team),
94 offset_and_size_of(kmp_base_info_t, th_root),
95 offset_and_size_of(kmp_base_info_t, th_serial_team),
96 offset_and_size_of(kmp_base_info_t, th_ident),
97 offset_and_size_of(kmp_base_info_t, th_spin_here),
98 offset_and_size_of(kmp_base_info_t, th_next_waiting),
99 offset_and_size_of(kmp_base_info_t, th_task_team),
100 offset_and_size_of(kmp_base_info_t, th_current_task),
101 offset_and_size_of(kmp_base_info_t, th_task_state),
102 offset_and_size_of(kmp_base_info_t, th_bar),
103 offset_and_size_of(kmp_bstate_t, b_worker_arrived),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000104
Jonathan Peyton441f3372015-09-21 17:24:46 +0000105#if OMP_40_ENABLED
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000106 // teams information
Jonathan Peyton30419822017-05-12 18:01:32 +0000107 offset_and_size_of(kmp_base_info_t, th_teams_microtask),
108 offset_and_size_of(kmp_base_info_t, th_teams_level),
109 offset_and_size_of(kmp_teams_size_t, nteams),
110 offset_and_size_of(kmp_teams_size_t, nth),
Jonathan Peyton441f3372015-09-21 17:24:46 +0000111#endif
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000112
113 // kmp_desc structure (for info field above)
Jonathan Peyton30419822017-05-12 18:01:32 +0000114 sizeof(kmp_desc_base_t),
115 offset_and_size_of(kmp_desc_base_t, ds_tid),
116 offset_and_size_of(kmp_desc_base_t, ds_gtid),
117// On Windows* OS, ds_thread contains a thread /handle/, which is not usable,
118// while thread /id/ is in ds_thread_id.
119#if KMP_OS_WINDOWS
120 offset_and_size_of(kmp_desc_base_t, ds_thread_id),
121#else
122 offset_and_size_of(kmp_desc_base_t, ds_thread),
123#endif
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000124
125 // team structure information
Jonathan Peyton30419822017-05-12 18:01:32 +0000126 sizeof(kmp_base_team_t),
127 offset_and_size_of(kmp_base_team_t, t_master_tid),
128 offset_and_size_of(kmp_base_team_t, t_ident),
129 offset_and_size_of(kmp_base_team_t, t_parent),
130 offset_and_size_of(kmp_base_team_t, t_nproc),
131 offset_and_size_of(kmp_base_team_t, t_threads),
132 offset_and_size_of(kmp_base_team_t, t_serialized),
133 offset_and_size_of(kmp_base_team_t, t_id),
134 offset_and_size_of(kmp_base_team_t, t_pkfn),
135 offset_and_size_of(kmp_base_team_t, t_task_team),
136 offset_and_size_of(kmp_base_team_t, t_implicit_task_taskdata),
Jonathan Peyton441f3372015-09-21 17:24:46 +0000137#if OMP_40_ENABLED
Jonathan Peyton30419822017-05-12 18:01:32 +0000138 offset_and_size_of(kmp_base_team_t, t_cancel_request),
Jonathan Peyton441f3372015-09-21 17:24:46 +0000139#endif
Jonathan Peyton30419822017-05-12 18:01:32 +0000140 offset_and_size_of(kmp_base_team_t, t_bar),
141 offset_and_size_of(kmp_balign_team_t, b_master_arrived),
142 offset_and_size_of(kmp_balign_team_t, b_team_arrived),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000143
144 // root structure information
Jonathan Peyton30419822017-05-12 18:01:32 +0000145 sizeof(kmp_base_root_t),
146 offset_and_size_of(kmp_base_root_t, r_root_team),
147 offset_and_size_of(kmp_base_root_t, r_hot_team),
148 offset_and_size_of(kmp_base_root_t, r_uber_thread),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000149 offset_and_size_not_available,
150
151 // ident structure information
Jonathan Peyton30419822017-05-12 18:01:32 +0000152 sizeof(ident_t),
153 offset_and_size_of(ident_t, psource),
154 offset_and_size_of(ident_t, flags),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000155
156 // lock structure information
Jonathan Peyton30419822017-05-12 18:01:32 +0000157 sizeof(kmp_base_queuing_lock_t),
158 offset_and_size_of(kmp_base_queuing_lock_t, initialized),
159 offset_and_size_of(kmp_base_queuing_lock_t, location),
160 offset_and_size_of(kmp_base_queuing_lock_t, tail_id),
161 offset_and_size_of(kmp_base_queuing_lock_t, head_id),
162 offset_and_size_of(kmp_base_queuing_lock_t, next_ticket),
163 offset_and_size_of(kmp_base_queuing_lock_t, now_serving),
164 offset_and_size_of(kmp_base_queuing_lock_t, owner_id),
165 offset_and_size_of(kmp_base_queuing_lock_t, depth_locked),
166 offset_and_size_of(kmp_base_queuing_lock_t, flags),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000167
Jonathan Peyton30419822017-05-12 18:01:32 +0000168#if !KMP_USE_DYNAMIC_LOCK
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000169 /* Lock table. */
Jonathan Peyton30419822017-05-12 18:01:32 +0000170 sizeof(kmp_lock_table_t),
171 offset_and_size_of(kmp_lock_table_t, used),
172 offset_and_size_of(kmp_lock_table_t, allocated),
173 offset_and_size_of(kmp_lock_table_t, table),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000174#endif
175
176 // Task team structure information.
Jonathan Peyton30419822017-05-12 18:01:32 +0000177 sizeof(kmp_base_task_team_t),
178 offset_and_size_of(kmp_base_task_team_t, tt_threads_data),
179 offset_and_size_of(kmp_base_task_team_t, tt_found_tasks),
180 offset_and_size_of(kmp_base_task_team_t, tt_nproc),
181 offset_and_size_of(kmp_base_task_team_t, tt_unfinished_threads),
182 offset_and_size_of(kmp_base_task_team_t, tt_active),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000183
184 // task_data_t.
Jonathan Peyton30419822017-05-12 18:01:32 +0000185 sizeof(kmp_taskdata_t),
186 offset_and_size_of(kmp_taskdata_t, td_task_id),
187 offset_and_size_of(kmp_taskdata_t, td_flags),
188 offset_and_size_of(kmp_taskdata_t, td_team),
189 offset_and_size_of(kmp_taskdata_t, td_parent),
190 offset_and_size_of(kmp_taskdata_t, td_level),
191 offset_and_size_of(kmp_taskdata_t, td_ident),
192 offset_and_size_of(kmp_taskdata_t, td_allocated_child_tasks),
193 offset_and_size_of(kmp_taskdata_t, td_incomplete_child_tasks),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000194
Jonathan Peyton30419822017-05-12 18:01:32 +0000195 offset_and_size_of(kmp_taskdata_t, td_taskwait_ident),
196 offset_and_size_of(kmp_taskdata_t, td_taskwait_counter),
197 offset_and_size_of(kmp_taskdata_t, td_taskwait_thread),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000198
Jonathan Peyton441f3372015-09-21 17:24:46 +0000199#if OMP_40_ENABLED
Jonathan Peyton30419822017-05-12 18:01:32 +0000200 offset_and_size_of(kmp_taskdata_t, td_taskgroup),
201 offset_and_size_of(kmp_taskgroup_t, count),
202 offset_and_size_of(kmp_taskgroup_t, cancel_request),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000203
Jonathan Peyton30419822017-05-12 18:01:32 +0000204 offset_and_size_of(kmp_taskdata_t, td_depnode),
205 offset_and_size_of(kmp_depnode_list_t, node),
206 offset_and_size_of(kmp_depnode_list_t, next),
207 offset_and_size_of(kmp_base_depnode_t, successors),
208 offset_and_size_of(kmp_base_depnode_t, task),
209 offset_and_size_of(kmp_base_depnode_t, npredecessors),
210 offset_and_size_of(kmp_base_depnode_t, nrefs),
Jonathan Peyton441f3372015-09-21 17:24:46 +0000211#endif
Jonathan Peyton30419822017-05-12 18:01:32 +0000212 offset_and_size_of(kmp_task_t, routine),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000213
214 // thread_data_t.
Jonathan Peyton30419822017-05-12 18:01:32 +0000215 sizeof(kmp_thread_data_t),
216 offset_and_size_of(kmp_base_thread_data_t, td_deque),
217 offset_and_size_of(kmp_base_thread_data_t, td_deque_size),
218 offset_and_size_of(kmp_base_thread_data_t, td_deque_head),
219 offset_and_size_of(kmp_base_thread_data_t, td_deque_tail),
220 offset_and_size_of(kmp_base_thread_data_t, td_deque_ntasks),
221 offset_and_size_of(kmp_base_thread_data_t, td_deque_last_stolen),
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000222
223 // The last field.
224 KMP_OMP_VERSION,
225
226}; // __kmp_omp_debug_struct_info
227
228#undef offset_and_size_of
229#undef addr_and_size_of
230
Jonathan Peyton30419822017-05-12 18:01:32 +0000231/* Intel compiler on IA-32 architecture issues a warning "conversion
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000232 from "unsigned long long" to "char *" may lose significant bits"
233 when 64-bit value is assigned to 32-bit pointer. Use this function
Jonathan Peyton30419822017-05-12 18:01:32 +0000234 to suppress the warning. */
235static inline void *__kmp_convert_to_ptr(kmp_uint64 addr) {
236#if KMP_COMPILER_ICC
237#pragma warning(push)
238#pragma warning(disable : 810) // conversion from "unsigned long long" to "char
239// *" may lose significant bits
240#pragma warning(disable : 1195) // conversion from integer to smaller pointer
241#endif // KMP_COMPILER_ICC
242 return (void *)addr;
243#if KMP_COMPILER_ICC
244#pragma warning(pop)
245#endif // KMP_COMPILER_ICC
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000246} // __kmp_convert_to_ptr
247
Jonathan Peyton30419822017-05-12 18:01:32 +0000248static int kmp_location_match(kmp_str_loc_t *loc, kmp_omp_nthr_item_t *item) {
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000249
Jonathan Peyton30419822017-05-12 18:01:32 +0000250 int file_match = 0;
251 int func_match = 0;
252 int line_match = 0;
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000253
Jonathan Peyton30419822017-05-12 18:01:32 +0000254 char *file = (char *)__kmp_convert_to_ptr(item->file);
255 char *func = (char *)__kmp_convert_to_ptr(item->func);
256 file_match = __kmp_str_fname_match(&loc->fname, file);
257 func_match =
258 item->func == 0 // If item->func is NULL, it allows any func name.
259 || strcmp(func, "*") == 0 ||
260 (loc->func != NULL && strcmp(loc->func, func) == 0);
261 line_match =
262 item->begin <= loc->line &&
263 (item->end <= 0 ||
264 loc->line <= item->end); // if item->end <= 0, it means "end of file".
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000265
Jonathan Peyton30419822017-05-12 18:01:32 +0000266 return (file_match && func_match && line_match);
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000267
268} // kmp_location_match
269
Jonathan Peyton30419822017-05-12 18:01:32 +0000270int __kmp_omp_num_threads(ident_t const *ident) {
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000271
Jonathan Peyton30419822017-05-12 18:01:32 +0000272 int num_threads = 0;
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000273
Jonathan Peyton30419822017-05-12 18:01:32 +0000274 kmp_omp_nthr_info_t *info = (kmp_omp_nthr_info_t *)__kmp_convert_to_ptr(
275 __kmp_omp_debug_struct_info.nthr_info.addr);
276 if (info->num > 0 && info->array != 0) {
277 kmp_omp_nthr_item_t *items =
278 (kmp_omp_nthr_item_t *)__kmp_convert_to_ptr(info->array);
279 kmp_str_loc_t loc = __kmp_str_loc_init(ident->psource, 1);
280 int i;
281 for (i = 0; i < info->num; ++i) {
282 if (kmp_location_match(&loc, &items[i])) {
283 num_threads = items[i].num_threads;
Jonathan Peytonbd3a7632017-09-27 20:36:27 +0000284 }
285 }
Jonathan Peyton30419822017-05-12 18:01:32 +0000286 __kmp_str_loc_free(&loc);
Jonathan Peytonbd3a7632017-09-27 20:36:27 +0000287 }
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000288
Jonathan Peyton30419822017-05-12 18:01:32 +0000289 return num_threads;
290 ;
Jonathan Peyton8fbb49a2015-07-09 18:16:58 +0000291
292} // __kmp_omp_num_threads
293#endif /* USE_DEBUGGER */