1*0b57cec5SDimitry Andric #include "kmp_config.h" 2*0b57cec5SDimitry Andric 3*0b57cec5SDimitry Andric #if USE_ITT_BUILD 4*0b57cec5SDimitry Andric /* 5*0b57cec5SDimitry Andric * kmp_itt.cpp -- ITT Notify interface. 6*0b57cec5SDimitry Andric */ 7*0b57cec5SDimitry Andric 8*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 9*0b57cec5SDimitry Andric // 10*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 11*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 12*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 13*0b57cec5SDimitry Andric // 14*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 15*0b57cec5SDimitry Andric 16*0b57cec5SDimitry Andric #include "kmp_itt.h" 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric #if KMP_DEBUG 19*0b57cec5SDimitry Andric #include "kmp_itt.inl" 20*0b57cec5SDimitry Andric #endif 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andric #if USE_ITT_NOTIFY 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric #include "ittnotify_config.h" 25*0b57cec5SDimitry Andric __itt_global __kmp_ittapi_clean_global; 26*0b57cec5SDimitry Andric extern __itt_global __kmp_itt__ittapi_global; 27*0b57cec5SDimitry Andric kmp_int32 __kmp_barrier_domain_count; 28*0b57cec5SDimitry Andric kmp_int32 __kmp_region_domain_count; 29*0b57cec5SDimitry Andric __itt_domain *__kmp_itt_barrier_domains[KMP_MAX_FRAME_DOMAINS]; 30*0b57cec5SDimitry Andric __itt_domain *__kmp_itt_region_domains[KMP_MAX_FRAME_DOMAINS]; 31*0b57cec5SDimitry Andric __itt_domain *__kmp_itt_imbalance_domains[KMP_MAX_FRAME_DOMAINS]; 32*0b57cec5SDimitry Andric kmp_int32 __kmp_itt_region_team_size[KMP_MAX_FRAME_DOMAINS]; 33*0b57cec5SDimitry Andric __itt_domain *metadata_domain = NULL; 34*0b57cec5SDimitry Andric __itt_string_handle *string_handle_imbl = NULL; 35*0b57cec5SDimitry Andric __itt_string_handle *string_handle_loop = NULL; 36*0b57cec5SDimitry Andric __itt_string_handle *string_handle_sngl = NULL; 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric #include "kmp_i18n.h" 39*0b57cec5SDimitry Andric #include "kmp_str.h" 40*0b57cec5SDimitry Andric #include "kmp_version.h" 41*0b57cec5SDimitry Andric 42*0b57cec5SDimitry Andric KMP_BUILD_ASSERT(sizeof(kmp_itt_mark_t) == sizeof(__itt_mark_type)); 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric /* Previously used warnings: 45*0b57cec5SDimitry Andric 46*0b57cec5SDimitry Andric KMP_WARNING( IttAllNotifDisabled ); 47*0b57cec5SDimitry Andric KMP_WARNING( IttObjNotifDisabled ); 48*0b57cec5SDimitry Andric KMP_WARNING( IttMarkNotifDisabled ); 49*0b57cec5SDimitry Andric KMP_WARNING( IttUnloadLibFailed, libittnotify ); 50*0b57cec5SDimitry Andric */ 51*0b57cec5SDimitry Andric 52*0b57cec5SDimitry Andric kmp_int32 __kmp_itt_prepare_delay = 0; 53*0b57cec5SDimitry Andric kmp_bootstrap_lock_t __kmp_itt_debug_lock = 54*0b57cec5SDimitry Andric KMP_BOOTSTRAP_LOCK_INITIALIZER(__kmp_itt_debug_lock); 55*0b57cec5SDimitry Andric 56*0b57cec5SDimitry Andric #endif // USE_ITT_NOTIFY 57*0b57cec5SDimitry Andric 58*0b57cec5SDimitry Andric void __kmp_itt_reset() { 59*0b57cec5SDimitry Andric #if USE_ITT_NOTIFY 60*0b57cec5SDimitry Andric __kmp_itt__ittapi_global = __kmp_ittapi_clean_global; 61*0b57cec5SDimitry Andric #endif 62*0b57cec5SDimitry Andric } 63*0b57cec5SDimitry Andric 64*0b57cec5SDimitry Andric void __kmp_itt_initialize() { 65*0b57cec5SDimitry Andric 66*0b57cec5SDimitry Andric // ITTNotify library is loaded and initialized at first call to any ittnotify 67*0b57cec5SDimitry Andric // function, so we do not need to explicitly load it any more. Just report OMP 68*0b57cec5SDimitry Andric // RTL version to ITTNotify. 69*0b57cec5SDimitry Andric 70*0b57cec5SDimitry Andric #if USE_ITT_NOTIFY 71*0b57cec5SDimitry Andric // Backup a clean global state 72*0b57cec5SDimitry Andric __kmp_ittapi_clean_global = __kmp_itt__ittapi_global; 73*0b57cec5SDimitry Andric 74*0b57cec5SDimitry Andric // Report OpenMP RTL version. 75*0b57cec5SDimitry Andric kmp_str_buf_t buf; 76*0b57cec5SDimitry Andric __itt_mark_type version; 77*0b57cec5SDimitry Andric __kmp_str_buf_init(&buf); 78*0b57cec5SDimitry Andric __kmp_str_buf_print(&buf, "OMP RTL Version %d.%d.%d", __kmp_version_major, 79*0b57cec5SDimitry Andric __kmp_version_minor, __kmp_version_build); 80*0b57cec5SDimitry Andric if (__itt_api_version_ptr != NULL) { 81*0b57cec5SDimitry Andric __kmp_str_buf_print(&buf, ":%s", __itt_api_version()); 82*0b57cec5SDimitry Andric } 83*0b57cec5SDimitry Andric version = __itt_mark_create(buf.str); 84*0b57cec5SDimitry Andric __itt_mark(version, NULL); 85*0b57cec5SDimitry Andric __kmp_str_buf_free(&buf); 86*0b57cec5SDimitry Andric #endif 87*0b57cec5SDimitry Andric 88*0b57cec5SDimitry Andric } // __kmp_itt_initialize 89*0b57cec5SDimitry Andric 90*0b57cec5SDimitry Andric void __kmp_itt_destroy() { 91*0b57cec5SDimitry Andric #if USE_ITT_NOTIFY 92*0b57cec5SDimitry Andric __kmp_itt_fini_ittlib(); 93*0b57cec5SDimitry Andric #endif 94*0b57cec5SDimitry Andric } // __kmp_itt_destroy 95*0b57cec5SDimitry Andric 96*0b57cec5SDimitry Andric extern "C" void __itt_error_handler(__itt_error_code err, va_list args) { 97*0b57cec5SDimitry Andric 98*0b57cec5SDimitry Andric switch (err) { 99*0b57cec5SDimitry Andric case __itt_error_no_module: { 100*0b57cec5SDimitry Andric char const *library = va_arg(args, char const *); 101*0b57cec5SDimitry Andric #if KMP_OS_WINDOWS 102*0b57cec5SDimitry Andric int sys_err = va_arg(args, int); 103*0b57cec5SDimitry Andric kmp_msg_t err_code = KMP_SYSERRCODE(sys_err); 104*0b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(IttLoadLibFailed, library), err_code, 105*0b57cec5SDimitry Andric __kmp_msg_null); 106*0b57cec5SDimitry Andric if (__kmp_generate_warnings == kmp_warnings_off) { 107*0b57cec5SDimitry Andric __kmp_str_free(&err_code.str); 108*0b57cec5SDimitry Andric } 109*0b57cec5SDimitry Andric #else 110*0b57cec5SDimitry Andric char const *sys_err = va_arg(args, char const *); 111*0b57cec5SDimitry Andric kmp_msg_t err_code = KMP_SYSERRMESG(sys_err); 112*0b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(IttLoadLibFailed, library), err_code, 113*0b57cec5SDimitry Andric __kmp_msg_null); 114*0b57cec5SDimitry Andric if (__kmp_generate_warnings == kmp_warnings_off) { 115*0b57cec5SDimitry Andric __kmp_str_free(&err_code.str); 116*0b57cec5SDimitry Andric } 117*0b57cec5SDimitry Andric #endif 118*0b57cec5SDimitry Andric } break; 119*0b57cec5SDimitry Andric case __itt_error_no_symbol: { 120*0b57cec5SDimitry Andric char const *library = va_arg(args, char const *); 121*0b57cec5SDimitry Andric char const *symbol = va_arg(args, char const *); 122*0b57cec5SDimitry Andric KMP_WARNING(IttLookupFailed, symbol, library); 123*0b57cec5SDimitry Andric } break; 124*0b57cec5SDimitry Andric case __itt_error_unknown_group: { 125*0b57cec5SDimitry Andric char const *var = va_arg(args, char const *); 126*0b57cec5SDimitry Andric char const *group = va_arg(args, char const *); 127*0b57cec5SDimitry Andric KMP_WARNING(IttUnknownGroup, var, group); 128*0b57cec5SDimitry Andric } break; 129*0b57cec5SDimitry Andric case __itt_error_env_too_long: { 130*0b57cec5SDimitry Andric char const *var = va_arg(args, char const *); 131*0b57cec5SDimitry Andric size_t act_len = va_arg(args, size_t); 132*0b57cec5SDimitry Andric size_t max_len = va_arg(args, size_t); 133*0b57cec5SDimitry Andric KMP_WARNING(IttEnvVarTooLong, var, (unsigned long)act_len, 134*0b57cec5SDimitry Andric (unsigned long)max_len); 135*0b57cec5SDimitry Andric } break; 136*0b57cec5SDimitry Andric case __itt_error_cant_read_env: { 137*0b57cec5SDimitry Andric char const *var = va_arg(args, char const *); 138*0b57cec5SDimitry Andric int sys_err = va_arg(args, int); 139*0b57cec5SDimitry Andric kmp_msg_t err_code = KMP_ERR(sys_err); 140*0b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(CantGetEnvVar, var), err_code, 141*0b57cec5SDimitry Andric __kmp_msg_null); 142*0b57cec5SDimitry Andric if (__kmp_generate_warnings == kmp_warnings_off) { 143*0b57cec5SDimitry Andric __kmp_str_free(&err_code.str); 144*0b57cec5SDimitry Andric } 145*0b57cec5SDimitry Andric } break; 146*0b57cec5SDimitry Andric case __itt_error_system: { 147*0b57cec5SDimitry Andric char const *func = va_arg(args, char const *); 148*0b57cec5SDimitry Andric int sys_err = va_arg(args, int); 149*0b57cec5SDimitry Andric kmp_msg_t err_code = KMP_SYSERRCODE(sys_err); 150*0b57cec5SDimitry Andric __kmp_msg(kmp_ms_warning, KMP_MSG(IttFunctionError, func), err_code, 151*0b57cec5SDimitry Andric __kmp_msg_null); 152*0b57cec5SDimitry Andric if (__kmp_generate_warnings == kmp_warnings_off) { 153*0b57cec5SDimitry Andric __kmp_str_free(&err_code.str); 154*0b57cec5SDimitry Andric } 155*0b57cec5SDimitry Andric } break; 156*0b57cec5SDimitry Andric default: { KMP_WARNING(IttUnknownError, err); } 157*0b57cec5SDimitry Andric } 158*0b57cec5SDimitry Andric } // __itt_error_handler 159*0b57cec5SDimitry Andric 160*0b57cec5SDimitry Andric #endif /* USE_ITT_BUILD */ 161