1 #include "kmp_config.h"
25 extern kmp_omp_struct_info_t __kmp_omp_debug_struct_info;
29 int __kmp_debugging = FALSE;
31 #define offset_and_size_of(structure, field) \
32 { offsetof(structure, field), sizeof(((structure *)NULL)->field) }
34 #define offset_and_size_not_available \
37 #define addr_and_size_of(var) \
38 { (kmp_uint64)(&var), sizeof(var) }
40 #define nthr_buffer_size 1024
41 static kmp_int32 kmp_omp_nthr_info_buffer[nthr_buffer_size] = {
42 nthr_buffer_size *
sizeof(kmp_int32)};
45 static char func_microtask[] =
"__kmp_invoke_microtask";
46 static char func_fork[] =
"__kmpc_fork_call";
47 static char func_fork_teams[] =
"__kmpc_fork_teams";
50 kmp_omp_struct_info_t __kmp_omp_debug_struct_info = {
58 sizeof(kmp_omp_struct_info_t),
61 addr_and_size_of(__kmp_version_major),
62 addr_and_size_of(__kmp_version_minor),
63 addr_and_size_of(__kmp_version_build),
64 addr_and_size_of(__kmp_openmp_version),
65 {(kmp_uint64)(__kmp_copyright) + KMP_VERSION_MAGIC_LEN,
69 addr_and_size_of(__kmp_threads),
70 addr_and_size_of(__kmp_root),
71 addr_and_size_of(__kmp_threads_capacity),
73 addr_and_size_of(__kmp_monitor),
75 #if !KMP_USE_DYNAMIC_LOCK
76 addr_and_size_of(__kmp_user_lock_table),
78 addr_and_size_of(func_microtask),
79 addr_and_size_of(func_fork),
80 addr_and_size_of(func_fork_teams),
81 addr_and_size_of(__kmp_team_counter),
82 addr_and_size_of(__kmp_task_counter),
83 addr_and_size_of(kmp_omp_nthr_info_buffer),
85 OMP_LOCK_T_SIZE <
sizeof(
void *),
87 INITIAL_TASK_DEQUE_SIZE,
90 sizeof(kmp_base_info_t),
91 offset_and_size_of(kmp_base_info_t, th_info),
92 offset_and_size_of(kmp_base_info_t, th_team),
93 offset_and_size_of(kmp_base_info_t, th_root),
94 offset_and_size_of(kmp_base_info_t, th_serial_team),
95 offset_and_size_of(kmp_base_info_t, th_ident),
96 offset_and_size_of(kmp_base_info_t, th_spin_here),
97 offset_and_size_of(kmp_base_info_t, th_next_waiting),
98 offset_and_size_of(kmp_base_info_t, th_task_team),
99 offset_and_size_of(kmp_base_info_t, th_current_task),
100 offset_and_size_of(kmp_base_info_t, th_task_state),
101 offset_and_size_of(kmp_base_info_t, th_bar),
102 offset_and_size_of(kmp_bstate_t, b_worker_arrived),
106 offset_and_size_of(kmp_base_info_t, th_teams_microtask),
107 offset_and_size_of(kmp_base_info_t, th_teams_level),
108 offset_and_size_of(kmp_teams_size_t, nteams),
109 offset_and_size_of(kmp_teams_size_t, nth),
113 sizeof(kmp_desc_base_t),
114 offset_and_size_of(kmp_desc_base_t, ds_tid),
115 offset_and_size_of(kmp_desc_base_t, ds_gtid),
119 offset_and_size_of(kmp_desc_base_t, ds_thread_id),
121 offset_and_size_of(kmp_desc_base_t, ds_thread),
125 sizeof(kmp_base_team_t),
126 offset_and_size_of(kmp_base_team_t, t_master_tid),
127 offset_and_size_of(kmp_base_team_t, t_ident),
128 offset_and_size_of(kmp_base_team_t, t_parent),
129 offset_and_size_of(kmp_base_team_t, t_nproc),
130 offset_and_size_of(kmp_base_team_t, t_threads),
131 offset_and_size_of(kmp_base_team_t, t_serialized),
132 offset_and_size_of(kmp_base_team_t, t_id),
133 offset_and_size_of(kmp_base_team_t, t_pkfn),
134 offset_and_size_of(kmp_base_team_t, t_task_team),
135 offset_and_size_of(kmp_base_team_t, t_implicit_task_taskdata),
137 offset_and_size_of(kmp_base_team_t, t_cancel_request),
139 offset_and_size_of(kmp_base_team_t, t_bar),
140 offset_and_size_of(kmp_balign_team_t, b_master_arrived),
141 offset_and_size_of(kmp_balign_team_t, b_team_arrived),
144 sizeof(kmp_base_root_t),
145 offset_and_size_of(kmp_base_root_t, r_root_team),
146 offset_and_size_of(kmp_base_root_t, r_hot_team),
147 offset_and_size_of(kmp_base_root_t, r_uber_thread),
148 offset_and_size_not_available,
152 offset_and_size_of(
ident_t, psource),
153 offset_and_size_of(
ident_t, flags),
156 sizeof(kmp_base_queuing_lock_t),
157 offset_and_size_of(kmp_base_queuing_lock_t, initialized),
158 offset_and_size_of(kmp_base_queuing_lock_t, location),
159 offset_and_size_of(kmp_base_queuing_lock_t, tail_id),
160 offset_and_size_of(kmp_base_queuing_lock_t, head_id),
161 offset_and_size_of(kmp_base_queuing_lock_t, next_ticket),
162 offset_and_size_of(kmp_base_queuing_lock_t, now_serving),
163 offset_and_size_of(kmp_base_queuing_lock_t, owner_id),
164 offset_and_size_of(kmp_base_queuing_lock_t, depth_locked),
165 offset_and_size_of(kmp_base_queuing_lock_t, flags),
167 #if !KMP_USE_DYNAMIC_LOCK
169 sizeof(kmp_lock_table_t),
170 offset_and_size_of(kmp_lock_table_t, used),
171 offset_and_size_of(kmp_lock_table_t, allocated),
172 offset_and_size_of(kmp_lock_table_t, table),
176 sizeof(kmp_base_task_team_t),
177 offset_and_size_of(kmp_base_task_team_t, tt_threads_data),
178 offset_and_size_of(kmp_base_task_team_t, tt_found_tasks),
179 offset_and_size_of(kmp_base_task_team_t, tt_nproc),
180 offset_and_size_of(kmp_base_task_team_t, tt_unfinished_threads),
181 offset_and_size_of(kmp_base_task_team_t, tt_active),
184 sizeof(kmp_taskdata_t),
185 offset_and_size_of(kmp_taskdata_t, td_task_id),
186 offset_and_size_of(kmp_taskdata_t, td_flags),
187 offset_and_size_of(kmp_taskdata_t, td_team),
188 offset_and_size_of(kmp_taskdata_t, td_parent),
189 offset_and_size_of(kmp_taskdata_t, td_level),
190 offset_and_size_of(kmp_taskdata_t, td_ident),
191 offset_and_size_of(kmp_taskdata_t, td_allocated_child_tasks),
192 offset_and_size_of(kmp_taskdata_t, td_incomplete_child_tasks),
194 offset_and_size_of(kmp_taskdata_t, td_taskwait_ident),
195 offset_and_size_of(kmp_taskdata_t, td_taskwait_counter),
196 offset_and_size_of(kmp_taskdata_t, td_taskwait_thread),
199 offset_and_size_of(kmp_taskdata_t, td_taskgroup),
200 offset_and_size_of(kmp_taskgroup_t, count),
201 offset_and_size_of(kmp_taskgroup_t, cancel_request),
203 offset_and_size_of(kmp_taskdata_t, td_depnode),
204 offset_and_size_of(kmp_depnode_list_t, node),
205 offset_and_size_of(kmp_depnode_list_t, next),
206 offset_and_size_of(kmp_base_depnode_t, successors),
207 offset_and_size_of(kmp_base_depnode_t, task),
208 offset_and_size_of(kmp_base_depnode_t, npredecessors),
209 offset_and_size_of(kmp_base_depnode_t, nrefs),
211 offset_and_size_of(kmp_task_t, routine),
214 sizeof(kmp_thread_data_t),
215 offset_and_size_of(kmp_base_thread_data_t, td_deque),
216 offset_and_size_of(kmp_base_thread_data_t, td_deque_size),
217 offset_and_size_of(kmp_base_thread_data_t, td_deque_head),
218 offset_and_size_of(kmp_base_thread_data_t, td_deque_tail),
219 offset_and_size_of(kmp_base_thread_data_t, td_deque_ntasks),
220 offset_and_size_of(kmp_base_thread_data_t, td_deque_last_stolen),
227 #undef offset_and_size_of
228 #undef addr_and_size_of
234 static inline void *__kmp_convert_to_ptr(kmp_uint64 addr) {
236 #pragma warning(push)
237 #pragma warning(disable : 810) // conversion from "unsigned long long" to "char
239 #pragma warning(disable : 1195) // conversion from integer to smaller pointer
240 #endif // KMP_COMPILER_ICC
244 #endif // KMP_COMPILER_ICC
247 static int kmp_location_match(kmp_str_loc_t *loc, kmp_omp_nthr_item_t *item) {
253 char *file = (
char *)__kmp_convert_to_ptr(item->file);
254 char *func = (
char *)__kmp_convert_to_ptr(item->func);
255 file_match = __kmp_str_fname_match(&loc->fname, file);
258 || strcmp(func,
"*") == 0 ||
259 (loc->func != NULL && strcmp(loc->func, func) == 0);
261 item->begin <= loc->line &&
263 loc->line <= item->end);
265 return (file_match && func_match && line_match);
273 kmp_omp_nthr_info_t *info = (kmp_omp_nthr_info_t *)__kmp_convert_to_ptr(
274 __kmp_omp_debug_struct_info.nthr_info.addr);
275 if (info->num > 0 && info->array != 0) {
276 kmp_omp_nthr_item_t *items =
277 (kmp_omp_nthr_item_t *)__kmp_convert_to_ptr(info->array);
278 kmp_str_loc_t loc = __kmp_str_loc_init(ident->
psource, 1);
280 for (i = 0; i < info->num; ++i) {
281 if (kmp_location_match(&loc, &items[i])) {
282 num_threads = items[i].num_threads;
285 __kmp_str_loc_free(&loc);