xref: /freebsd/contrib/llvm-project/openmp/runtime/src/kmp_itt.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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