10b57cec5SDimitry Andric #include "kmp_config.h" 20b57cec5SDimitry Andric 30b57cec5SDimitry Andric #if USE_ITT_BUILD 40b57cec5SDimitry Andric /* 50b57cec5SDimitry Andric * kmp_itt.cpp -- ITT Notify interface. 60b57cec5SDimitry Andric */ 70b57cec5SDimitry Andric 80b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 90b57cec5SDimitry Andric // 100b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 110b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 120b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 130b57cec5SDimitry Andric // 140b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "kmp_itt.h" 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric #if KMP_DEBUG 190b57cec5SDimitry Andric #include "kmp_itt.inl" 200b57cec5SDimitry Andric #endif 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric #if USE_ITT_NOTIFY 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric #include "ittnotify_config.h" 250b57cec5SDimitry Andric __itt_global __kmp_ittapi_clean_global; 260b57cec5SDimitry Andric extern __itt_global __kmp_itt__ittapi_global; 270b57cec5SDimitry Andric kmp_int32 __kmp_barrier_domain_count; 280b57cec5SDimitry Andric kmp_int32 __kmp_region_domain_count; 290b57cec5SDimitry Andric __itt_domain *__kmp_itt_barrier_domains[KMP_MAX_FRAME_DOMAINS]; 300b57cec5SDimitry Andric __itt_domain *__kmp_itt_region_domains[KMP_MAX_FRAME_DOMAINS]; 310b57cec5SDimitry Andric __itt_domain *__kmp_itt_imbalance_domains[KMP_MAX_FRAME_DOMAINS]; 320b57cec5SDimitry Andric kmp_int32 __kmp_itt_region_team_size[KMP_MAX_FRAME_DOMAINS]; 330b57cec5SDimitry Andric __itt_domain *metadata_domain = NULL; 340b57cec5SDimitry Andric __itt_string_handle *string_handle_imbl = NULL; 350b57cec5SDimitry Andric __itt_string_handle *string_handle_loop = NULL; 360b57cec5SDimitry Andric __itt_string_handle *string_handle_sngl = NULL; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric #include "kmp_i18n.h" 390b57cec5SDimitry Andric #include "kmp_str.h" 400b57cec5SDimitry Andric #include "kmp_version.h" 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric KMP_BUILD_ASSERT(sizeof(kmp_itt_mark_t) == sizeof(__itt_mark_type)); 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric /* Previously used warnings: 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric KMP_WARNING( IttAllNotifDisabled ); 470b57cec5SDimitry Andric KMP_WARNING( IttObjNotifDisabled ); 480b57cec5SDimitry Andric KMP_WARNING( IttMarkNotifDisabled ); 490b57cec5SDimitry Andric KMP_WARNING( IttUnloadLibFailed, libittnotify ); 500b57cec5SDimitry Andric */ 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric kmp_int32 __kmp_itt_prepare_delay = 0; 530b57cec5SDimitry Andric kmp_bootstrap_lock_t __kmp_itt_debug_lock = 540b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INITIALIZER(__kmp_itt_debug_lock); 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric #endif // USE_ITT_NOTIFY 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric void __kmp_itt_reset() { 590b57cec5SDimitry Andric #if USE_ITT_NOTIFY 600b57cec5SDimitry Andric __kmp_itt__ittapi_global = __kmp_ittapi_clean_global; 610b57cec5SDimitry Andric #endif 620b57cec5SDimitry Andric } 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric void __kmp_itt_initialize() { 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric // ITTNotify library is loaded and initialized at first call to any ittnotify 670b57cec5SDimitry Andric // function, so we do not need to explicitly load it any more. Just report OMP 680b57cec5SDimitry Andric // RTL version to ITTNotify. 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric #if USE_ITT_NOTIFY 710b57cec5SDimitry Andric // Backup a clean global state 720b57cec5SDimitry Andric __kmp_ittapi_clean_global = __kmp_itt__ittapi_global; 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric // Report OpenMP RTL version. 750b57cec5SDimitry Andric kmp_str_buf_t buf; 760b57cec5SDimitry Andric __itt_mark_type version; 770b57cec5SDimitry Andric __kmp_str_buf_init(&buf); 780b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "OMP RTL Version %d.%d.%d", __kmp_version_major, 790b57cec5SDimitry Andric __kmp_version_minor, __kmp_version_build); 800b57cec5SDimitry Andric if (__itt_api_version_ptr != NULL) { 810b57cec5SDimitry Andric __kmp_str_buf_print(&buf, ":%s", __itt_api_version()); 820b57cec5SDimitry Andric } 830b57cec5SDimitry Andric version = __itt_mark_create(buf.str); 840b57cec5SDimitry Andric __itt_mark(version, NULL); 850b57cec5SDimitry Andric __kmp_str_buf_free(&buf); 860b57cec5SDimitry Andric #endif 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric } // __kmp_itt_initialize 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric void __kmp_itt_destroy() { 910b57cec5SDimitry Andric #if USE_ITT_NOTIFY 920b57cec5SDimitry Andric __kmp_itt_fini_ittlib(); 930b57cec5SDimitry Andric #endif 940b57cec5SDimitry Andric } // __kmp_itt_destroy 950b57cec5SDimitry Andric 960b57cec5SDimitry Andric extern "C" void __itt_error_handler(__itt_error_code err, va_list args) { 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric switch (err) { 990b57cec5SDimitry Andric case __itt_error_no_module: { 1000b57cec5SDimitry Andric char const *library = va_arg(args, char const *); 1010b57cec5SDimitry Andric #if KMP_OS_WINDOWS 1020b57cec5SDimitry Andric int sys_err = va_arg(args, int); 1030b57cec5SDimitry Andric kmp_msg_t err_code = KMP_SYSERRCODE(sys_err); 1040b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(IttLoadLibFailed, library), err_code, 1050b57cec5SDimitry Andric __kmp_msg_null); 1060b57cec5SDimitry Andric if (__kmp_generate_warnings == kmp_warnings_off) { 1070b57cec5SDimitry Andric __kmp_str_free(&err_code.str); 1080b57cec5SDimitry Andric } 1090b57cec5SDimitry Andric #else 1100b57cec5SDimitry Andric char const *sys_err = va_arg(args, char const *); 1110b57cec5SDimitry Andric kmp_msg_t err_code = KMP_SYSERRMESG(sys_err); 1120b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(IttLoadLibFailed, library), err_code, 1130b57cec5SDimitry Andric __kmp_msg_null); 1140b57cec5SDimitry Andric if (__kmp_generate_warnings == kmp_warnings_off) { 1150b57cec5SDimitry Andric __kmp_str_free(&err_code.str); 1160b57cec5SDimitry Andric } 1170b57cec5SDimitry Andric #endif 1180b57cec5SDimitry Andric } break; 1190b57cec5SDimitry Andric case __itt_error_no_symbol: { 1200b57cec5SDimitry Andric char const *library = va_arg(args, char const *); 1210b57cec5SDimitry Andric char const *symbol = va_arg(args, char const *); 1220b57cec5SDimitry Andric KMP_WARNING(IttLookupFailed, symbol, library); 1230b57cec5SDimitry Andric } break; 1240b57cec5SDimitry Andric case __itt_error_unknown_group: { 1250b57cec5SDimitry Andric char const *var = va_arg(args, char const *); 1260b57cec5SDimitry Andric char const *group = va_arg(args, char const *); 1270b57cec5SDimitry Andric KMP_WARNING(IttUnknownGroup, var, group); 1280b57cec5SDimitry Andric } break; 1290b57cec5SDimitry Andric case __itt_error_env_too_long: { 1300b57cec5SDimitry Andric char const *var = va_arg(args, char const *); 1310b57cec5SDimitry Andric size_t act_len = va_arg(args, size_t); 1320b57cec5SDimitry Andric size_t max_len = va_arg(args, size_t); 1330b57cec5SDimitry Andric KMP_WARNING(IttEnvVarTooLong, var, (unsigned long)act_len, 1340b57cec5SDimitry Andric (unsigned long)max_len); 1350b57cec5SDimitry Andric } break; 1360b57cec5SDimitry Andric case __itt_error_cant_read_env: { 1370b57cec5SDimitry Andric char const *var = va_arg(args, char const *); 1380b57cec5SDimitry Andric int sys_err = va_arg(args, int); 1390b57cec5SDimitry Andric kmp_msg_t err_code = KMP_ERR(sys_err); 1400b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(CantGetEnvVar, var), err_code, 1410b57cec5SDimitry Andric __kmp_msg_null); 1420b57cec5SDimitry Andric if (__kmp_generate_warnings == kmp_warnings_off) { 1430b57cec5SDimitry Andric __kmp_str_free(&err_code.str); 1440b57cec5SDimitry Andric } 1450b57cec5SDimitry Andric } break; 1460b57cec5SDimitry Andric case __itt_error_system: { 1470b57cec5SDimitry Andric char const *func = va_arg(args, char const *); 1480b57cec5SDimitry Andric int sys_err = va_arg(args, int); 1490b57cec5SDimitry Andric kmp_msg_t err_code = KMP_SYSERRCODE(sys_err); 1500b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(IttFunctionError, func), err_code, 1510b57cec5SDimitry Andric __kmp_msg_null); 1520b57cec5SDimitry Andric if (__kmp_generate_warnings == kmp_warnings_off) { 1530b57cec5SDimitry Andric __kmp_str_free(&err_code.str); 1540b57cec5SDimitry Andric } 1550b57cec5SDimitry Andric } break; 156*fe6060f1SDimitry Andric default: { 157*fe6060f1SDimitry Andric KMP_WARNING(IttUnknownError, err); 158*fe6060f1SDimitry Andric } 1590b57cec5SDimitry Andric } 1600b57cec5SDimitry Andric } // __itt_error_handler 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric #endif /* USE_ITT_BUILD */ 163