xref: /llvm-project/openmp/runtime/src/kmp_debugger.cpp (revision 1234011b80f835a297482467ca6ca2099677c39c)
106e39505SRoman Lebedev #include "kmp_config.h"
206e39505SRoman Lebedev 
37cc577a4SJonathan Peyton #if USE_DEBUGGER
47cc577a4SJonathan Peyton /*
53041982dSJonathan Peyton  * kmp_debugger.cpp -- debugger support.
67cc577a4SJonathan Peyton  */
77cc577a4SJonathan Peyton 
87cc577a4SJonathan Peyton //===----------------------------------------------------------------------===//
97cc577a4SJonathan Peyton //
1057b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1157b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
1257b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
137cc577a4SJonathan Peyton //
147cc577a4SJonathan Peyton //===----------------------------------------------------------------------===//
157cc577a4SJonathan Peyton 
167cc577a4SJonathan Peyton #include "kmp.h"
177cc577a4SJonathan Peyton #include "kmp_lock.h"
187cc577a4SJonathan Peyton #include "kmp_omp.h"
197cc577a4SJonathan Peyton #include "kmp_str.h"
207cc577a4SJonathan Peyton 
213041982dSJonathan Peyton // NOTE: All variable names are known to the debugger, do not change!
227cc577a4SJonathan Peyton 
237cc577a4SJonathan Peyton #ifdef __cplusplus
247cc577a4SJonathan Peyton extern "C" {
257cc577a4SJonathan Peyton extern kmp_omp_struct_info_t __kmp_omp_debug_struct_info;
267cc577a4SJonathan Peyton } // extern "C"
277cc577a4SJonathan Peyton #endif // __cplusplus
287cc577a4SJonathan Peyton 
297cc577a4SJonathan Peyton int __kmp_debugging = FALSE; // Boolean whether currently debugging OpenMP RTL.
307cc577a4SJonathan Peyton 
317cc577a4SJonathan Peyton #define offset_and_size_of(structure, field)                                   \
323041982dSJonathan Peyton   { offsetof(structure, field), sizeof(((structure *)NULL)->field) }
337cc577a4SJonathan Peyton 
347cc577a4SJonathan Peyton #define offset_and_size_not_available                                          \
357cc577a4SJonathan Peyton   { -1, -1 }
367cc577a4SJonathan Peyton 
377cc577a4SJonathan Peyton #define addr_and_size_of(var)                                                  \
383041982dSJonathan Peyton   { (kmp_uint64)(&var), sizeof(var) }
397cc577a4SJonathan Peyton 
407cc577a4SJonathan Peyton #define nthr_buffer_size 1024
413041982dSJonathan Peyton static kmp_int32 kmp_omp_nthr_info_buffer[nthr_buffer_size] = {
423041982dSJonathan Peyton     nthr_buffer_size * sizeof(kmp_int32)};
437cc577a4SJonathan Peyton 
447cc577a4SJonathan Peyton /* TODO: Check punctuation for various platforms here */
457cc577a4SJonathan Peyton static char func_microtask[] = "__kmp_invoke_microtask";
467cc577a4SJonathan Peyton static char func_fork[] = "__kmpc_fork_call";
477cc577a4SJonathan Peyton static char func_fork_teams[] = "__kmpc_fork_teams";
487cc577a4SJonathan Peyton 
497cc577a4SJonathan Peyton // Various info about runtime structures: addresses, field offsets, sizes, etc.
503041982dSJonathan Peyton kmp_omp_struct_info_t __kmp_omp_debug_struct_info = {
517cc577a4SJonathan Peyton 
527cc577a4SJonathan Peyton     /* Change this only if you make a fundamental data structure change here */
537cc577a4SJonathan Peyton     KMP_OMP_VERSION,
547cc577a4SJonathan Peyton 
557cc577a4SJonathan Peyton     /* sanity check.  Only should be checked if versions are identical
567cc577a4SJonathan Peyton      * This is also used for backward compatibility to get the runtime
577cc577a4SJonathan Peyton      * structure size if it the runtime is older than the interface */
587cc577a4SJonathan Peyton     sizeof(kmp_omp_struct_info_t),
597cc577a4SJonathan Peyton 
607cc577a4SJonathan Peyton     /* OpenMP RTL version info. */
617cc577a4SJonathan Peyton     addr_and_size_of(__kmp_version_major),
627cc577a4SJonathan Peyton     addr_and_size_of(__kmp_version_minor),
637cc577a4SJonathan Peyton     addr_and_size_of(__kmp_version_build),
647cc577a4SJonathan Peyton     addr_and_size_of(__kmp_openmp_version),
653041982dSJonathan Peyton     {(kmp_uint64)(__kmp_copyright) + KMP_VERSION_MAGIC_LEN,
663041982dSJonathan Peyton      0}, // Skip magic prefix.
677cc577a4SJonathan Peyton 
687cc577a4SJonathan Peyton     /* Various globals. */
697cc577a4SJonathan Peyton     addr_and_size_of(__kmp_threads),
707cc577a4SJonathan Peyton     addr_and_size_of(__kmp_root),
717cc577a4SJonathan Peyton     addr_and_size_of(__kmp_threads_capacity),
7237e2ef54SJonathan Peyton #if KMP_USE_MONITOR
737cc577a4SJonathan Peyton     addr_and_size_of(__kmp_monitor),
7437e2ef54SJonathan Peyton #endif
757cc577a4SJonathan Peyton #if !KMP_USE_DYNAMIC_LOCK
767cc577a4SJonathan Peyton     addr_and_size_of(__kmp_user_lock_table),
777cc577a4SJonathan Peyton #endif
787cc577a4SJonathan Peyton     addr_and_size_of(func_microtask),
797cc577a4SJonathan Peyton     addr_and_size_of(func_fork),
807cc577a4SJonathan Peyton     addr_and_size_of(func_fork_teams),
817cc577a4SJonathan Peyton     addr_and_size_of(__kmp_team_counter),
827cc577a4SJonathan Peyton     addr_and_size_of(__kmp_task_counter),
837cc577a4SJonathan Peyton     addr_and_size_of(kmp_omp_nthr_info_buffer),
847cc577a4SJonathan Peyton     sizeof(void *),
857cc577a4SJonathan Peyton     OMP_LOCK_T_SIZE < sizeof(void *),
867cc577a4SJonathan Peyton     bs_last_barrier,
877cc577a4SJonathan Peyton     INITIAL_TASK_DEQUE_SIZE,
887cc577a4SJonathan Peyton 
897cc577a4SJonathan Peyton     // thread structure information
907cc577a4SJonathan Peyton     sizeof(kmp_base_info_t),
917cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_info),
927cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_team),
937cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_root),
947cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_serial_team),
957cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_ident),
967cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_spin_here),
977cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_next_waiting),
987cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_task_team),
997cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_current_task),
1007cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_task_state),
1017cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_bar),
1027cc577a4SJonathan Peyton     offset_and_size_of(kmp_bstate_t, b_worker_arrived),
1037cc577a4SJonathan Peyton 
1047cc577a4SJonathan Peyton     // teams information
1057cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_teams_microtask),
1067cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_info_t, th_teams_level),
1077cc577a4SJonathan Peyton     offset_and_size_of(kmp_teams_size_t, nteams),
1087cc577a4SJonathan Peyton     offset_and_size_of(kmp_teams_size_t, nth),
1097cc577a4SJonathan Peyton 
1107cc577a4SJonathan Peyton     // kmp_desc structure (for info field above)
1117cc577a4SJonathan Peyton     sizeof(kmp_desc_base_t),
1127cc577a4SJonathan Peyton     offset_and_size_of(kmp_desc_base_t, ds_tid),
1137cc577a4SJonathan Peyton     offset_and_size_of(kmp_desc_base_t, ds_gtid),
1143041982dSJonathan Peyton // On Windows* OS, ds_thread contains a thread /handle/, which is not usable,
1153041982dSJonathan Peyton // while thread /id/ is in ds_thread_id.
1167cc577a4SJonathan Peyton #if KMP_OS_WINDOWS
1177cc577a4SJonathan Peyton     offset_and_size_of(kmp_desc_base_t, ds_thread_id),
1187cc577a4SJonathan Peyton #else
1197cc577a4SJonathan Peyton     offset_and_size_of(kmp_desc_base_t, ds_thread),
1207cc577a4SJonathan Peyton #endif
1217cc577a4SJonathan Peyton 
1227cc577a4SJonathan Peyton     // team structure information
1237cc577a4SJonathan Peyton     sizeof(kmp_base_team_t),
1247cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_master_tid),
1257cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_ident),
1267cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_parent),
1277cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_nproc),
1287cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_threads),
1297cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_serialized),
1307cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_id),
1317cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_pkfn),
1327cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_task_team),
1337cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_implicit_task_taskdata),
1347cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_cancel_request),
1357cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_team_t, t_bar),
1367cc577a4SJonathan Peyton     offset_and_size_of(kmp_balign_team_t, b_master_arrived),
1377cc577a4SJonathan Peyton     offset_and_size_of(kmp_balign_team_t, b_team_arrived),
1387cc577a4SJonathan Peyton 
1397cc577a4SJonathan Peyton     // root structure information
1407cc577a4SJonathan Peyton     sizeof(kmp_base_root_t),
1417cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_root_t, r_root_team),
1427cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_root_t, r_hot_team),
1437cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_root_t, r_uber_thread),
1447cc577a4SJonathan Peyton     offset_and_size_not_available,
1457cc577a4SJonathan Peyton 
1467cc577a4SJonathan Peyton     // ident structure information
1477cc577a4SJonathan Peyton     sizeof(ident_t),
1487cc577a4SJonathan Peyton     offset_and_size_of(ident_t, psource),
1497cc577a4SJonathan Peyton     offset_and_size_of(ident_t, flags),
1507cc577a4SJonathan Peyton 
1517cc577a4SJonathan Peyton     // lock structure information
1527cc577a4SJonathan Peyton     sizeof(kmp_base_queuing_lock_t),
1537cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, initialized),
1547cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, location),
1557cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, tail_id),
1567cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, head_id),
1577cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, next_ticket),
1587cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, now_serving),
1597cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, owner_id),
1607cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, depth_locked),
1617cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_queuing_lock_t, flags),
1627cc577a4SJonathan Peyton 
1637cc577a4SJonathan Peyton #if !KMP_USE_DYNAMIC_LOCK
1647cc577a4SJonathan Peyton     /* Lock table. */
1657cc577a4SJonathan Peyton     sizeof(kmp_lock_table_t),
1667cc577a4SJonathan Peyton     offset_and_size_of(kmp_lock_table_t, used),
1677cc577a4SJonathan Peyton     offset_and_size_of(kmp_lock_table_t, allocated),
1687cc577a4SJonathan Peyton     offset_and_size_of(kmp_lock_table_t, table),
1697cc577a4SJonathan Peyton #endif
1707cc577a4SJonathan Peyton 
1717cc577a4SJonathan Peyton     // Task team structure information.
1727cc577a4SJonathan Peyton     sizeof(kmp_base_task_team_t),
1737cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_task_team_t, tt_threads_data),
1747cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_task_team_t, tt_found_tasks),
1757cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_task_team_t, tt_nproc),
1767cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_task_team_t, tt_unfinished_threads),
1777cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_task_team_t, tt_active),
1787cc577a4SJonathan Peyton 
1797cc577a4SJonathan Peyton     // task_data_t.
1807cc577a4SJonathan Peyton     sizeof(kmp_taskdata_t),
1817cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_task_id),
1827cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_flags),
1837cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_team),
1847cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_parent),
1857cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_level),
1867cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_ident),
1877cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_allocated_child_tasks),
1887cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_incomplete_child_tasks),
1897cc577a4SJonathan Peyton 
1907cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_taskwait_ident),
1917cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_taskwait_counter),
1927cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_taskwait_thread),
1937cc577a4SJonathan Peyton 
1947cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_taskgroup),
1957cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskgroup_t, count),
1967cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskgroup_t, cancel_request),
1977cc577a4SJonathan Peyton 
1987cc577a4SJonathan Peyton     offset_and_size_of(kmp_taskdata_t, td_depnode),
1997cc577a4SJonathan Peyton     offset_and_size_of(kmp_depnode_list_t, node),
2007cc577a4SJonathan Peyton     offset_and_size_of(kmp_depnode_list_t, next),
2017cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_depnode_t, successors),
2027cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_depnode_t, task),
2037cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_depnode_t, npredecessors),
2047cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_depnode_t, nrefs),
2057cc577a4SJonathan Peyton     offset_and_size_of(kmp_task_t, routine),
2067cc577a4SJonathan Peyton 
2077cc577a4SJonathan Peyton     // thread_data_t.
2087cc577a4SJonathan Peyton     sizeof(kmp_thread_data_t),
2097cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_thread_data_t, td_deque),
2107cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_thread_data_t, td_deque_size),
2117cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_thread_data_t, td_deque_head),
2127cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_thread_data_t, td_deque_tail),
2137cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_thread_data_t, td_deque_ntasks),
2147cc577a4SJonathan Peyton     offset_and_size_of(kmp_base_thread_data_t, td_deque_last_stolen),
2157cc577a4SJonathan Peyton 
2167cc577a4SJonathan Peyton     // The last field.
2177cc577a4SJonathan Peyton     KMP_OMP_VERSION,
2187cc577a4SJonathan Peyton 
2197cc577a4SJonathan Peyton }; // __kmp_omp_debug_struct_info
2207cc577a4SJonathan Peyton 
2217cc577a4SJonathan Peyton #undef offset_and_size_of
2227cc577a4SJonathan Peyton #undef addr_and_size_of
2237cc577a4SJonathan Peyton 
2243041982dSJonathan Peyton /* Intel compiler on IA-32 architecture issues a warning "conversion
2257cc577a4SJonathan Peyton   from "unsigned long long" to "char *" may lose significant bits"
2267cc577a4SJonathan Peyton   when 64-bit value is assigned to 32-bit pointer. Use this function
2273041982dSJonathan Peyton   to suppress the warning. */
__kmp_convert_to_ptr(kmp_uint64 addr)2283041982dSJonathan Peyton static inline void *__kmp_convert_to_ptr(kmp_uint64 addr) {
229*1234011bSJonathan Peyton #if KMP_COMPILER_ICC || KMP_COMPILER_ICX
2307cc577a4SJonathan Peyton #pragma warning(push)
2313041982dSJonathan Peyton #pragma warning(disable : 810) // conversion from "unsigned long long" to "char
2323041982dSJonathan Peyton // *" may lose significant bits
2337cc577a4SJonathan Peyton #pragma warning(disable : 1195) // conversion from integer to smaller pointer
234*1234011bSJonathan Peyton #endif // KMP_COMPILER_ICC || KMP_COMPILER_ICX
2357cc577a4SJonathan Peyton   return (void *)addr;
236*1234011bSJonathan Peyton #if KMP_COMPILER_ICC || KMP_COMPILER_ICX
2377cc577a4SJonathan Peyton #pragma warning(pop)
238*1234011bSJonathan Peyton #endif // KMP_COMPILER_ICC || KMP_COMPILER_ICX
2397cc577a4SJonathan Peyton } // __kmp_convert_to_ptr
2407cc577a4SJonathan Peyton 
kmp_location_match(kmp_str_loc_t * loc,kmp_omp_nthr_item_t * item)2413041982dSJonathan Peyton static int kmp_location_match(kmp_str_loc_t *loc, kmp_omp_nthr_item_t *item) {
2427cc577a4SJonathan Peyton 
2437cc577a4SJonathan Peyton   int file_match = 0;
2447cc577a4SJonathan Peyton   int func_match = 0;
2457cc577a4SJonathan Peyton   int line_match = 0;
2467cc577a4SJonathan Peyton 
2477cc577a4SJonathan Peyton   char *file = (char *)__kmp_convert_to_ptr(item->file);
2487cc577a4SJonathan Peyton   char *func = (char *)__kmp_convert_to_ptr(item->func);
2497cc577a4SJonathan Peyton   file_match = __kmp_str_fname_match(&loc->fname, file);
2507cc577a4SJonathan Peyton   func_match =
2517cc577a4SJonathan Peyton       item->func == 0 // If item->func is NULL, it allows any func name.
2523041982dSJonathan Peyton       || strcmp(func, "*") == 0 ||
2537cc577a4SJonathan Peyton       (loc->func != NULL && strcmp(loc->func, func) == 0);
2547cc577a4SJonathan Peyton   line_match =
2553041982dSJonathan Peyton       item->begin <= loc->line &&
2563041982dSJonathan Peyton       (item->end <= 0 ||
2573041982dSJonathan Peyton        loc->line <= item->end); // if item->end <= 0, it means "end of file".
2587cc577a4SJonathan Peyton 
2597cc577a4SJonathan Peyton   return (file_match && func_match && line_match);
2607cc577a4SJonathan Peyton 
2617cc577a4SJonathan Peyton } // kmp_location_match
2627cc577a4SJonathan Peyton 
__kmp_omp_num_threads(ident_t const * ident)2633041982dSJonathan Peyton int __kmp_omp_num_threads(ident_t const *ident) {
2647cc577a4SJonathan Peyton 
2657cc577a4SJonathan Peyton   int num_threads = 0;
2667cc577a4SJonathan Peyton 
2673041982dSJonathan Peyton   kmp_omp_nthr_info_t *info = (kmp_omp_nthr_info_t *)__kmp_convert_to_ptr(
2683041982dSJonathan Peyton       __kmp_omp_debug_struct_info.nthr_info.addr);
2697cc577a4SJonathan Peyton   if (info->num > 0 && info->array != 0) {
2703041982dSJonathan Peyton     kmp_omp_nthr_item_t *items =
2713041982dSJonathan Peyton         (kmp_omp_nthr_item_t *)__kmp_convert_to_ptr(info->array);
27222558c85SAndreyChurbanov     kmp_str_loc_t loc = __kmp_str_loc_init(ident->psource, true);
2737cc577a4SJonathan Peyton     int i;
2747cc577a4SJonathan Peyton     for (i = 0; i < info->num; ++i) {
2757cc577a4SJonathan Peyton       if (kmp_location_match(&loc, &items[i])) {
2767cc577a4SJonathan Peyton         num_threads = items[i].num_threads;
277bd3a7633SJonathan Peyton       }
278bd3a7633SJonathan Peyton     }
2797cc577a4SJonathan Peyton     __kmp_str_loc_free(&loc);
280bd3a7633SJonathan Peyton   }
2817cc577a4SJonathan Peyton 
2823041982dSJonathan Peyton   return num_threads;
2833041982dSJonathan Peyton   ;
2847cc577a4SJonathan Peyton 
2857cc577a4SJonathan Peyton } // __kmp_omp_num_threads
2867cc577a4SJonathan Peyton #endif /* USE_DEBUGGER */
287