xref: /freebsd/contrib/llvm-project/openmp/runtime/src/kmp_itt.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
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;
27*349cc55cSDimitry Andric 
28*349cc55cSDimitry Andric kmp_itthash_t __kmp_itt_barrier_domains = {{0}, 0};
29*349cc55cSDimitry Andric kmp_itthash_t __kmp_itt_region_domains = {{0}, 0};
300b57cec5SDimitry Andric __itt_domain *metadata_domain = NULL;
310b57cec5SDimitry Andric __itt_string_handle *string_handle_imbl = NULL;
320b57cec5SDimitry Andric __itt_string_handle *string_handle_loop = NULL;
330b57cec5SDimitry Andric __itt_string_handle *string_handle_sngl = NULL;
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric #include "kmp_i18n.h"
360b57cec5SDimitry Andric #include "kmp_str.h"
370b57cec5SDimitry Andric #include "kmp_version.h"
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric KMP_BUILD_ASSERT(sizeof(kmp_itt_mark_t) == sizeof(__itt_mark_type));
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric /* Previously used warnings:
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric    KMP_WARNING( IttAllNotifDisabled );
440b57cec5SDimitry Andric    KMP_WARNING( IttObjNotifDisabled );
450b57cec5SDimitry Andric    KMP_WARNING( IttMarkNotifDisabled );
460b57cec5SDimitry Andric    KMP_WARNING( IttUnloadLibFailed, libittnotify );
470b57cec5SDimitry Andric */
480b57cec5SDimitry Andric 
490b57cec5SDimitry Andric kmp_int32 __kmp_itt_prepare_delay = 0;
500b57cec5SDimitry Andric kmp_bootstrap_lock_t __kmp_itt_debug_lock =
510b57cec5SDimitry Andric     KMP_BOOTSTRAP_LOCK_INITIALIZER(__kmp_itt_debug_lock);
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric #endif // USE_ITT_NOTIFY
540b57cec5SDimitry Andric 
__kmp_itt_reset()550b57cec5SDimitry Andric void __kmp_itt_reset() {
560b57cec5SDimitry Andric #if USE_ITT_NOTIFY
570b57cec5SDimitry Andric   __kmp_itt__ittapi_global = __kmp_ittapi_clean_global;
580b57cec5SDimitry Andric #endif
590b57cec5SDimitry Andric }
600b57cec5SDimitry Andric 
__kmp_itt_initialize()610b57cec5SDimitry Andric void __kmp_itt_initialize() {
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   // ITTNotify library is loaded and initialized at first call to any ittnotify
640b57cec5SDimitry Andric   // function, so we do not need to explicitly load it any more. Just report OMP
650b57cec5SDimitry Andric   // RTL version to ITTNotify.
660b57cec5SDimitry Andric 
670b57cec5SDimitry Andric #if USE_ITT_NOTIFY
680b57cec5SDimitry Andric   // Backup a clean global state
690b57cec5SDimitry Andric   __kmp_ittapi_clean_global = __kmp_itt__ittapi_global;
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric   // Report OpenMP RTL version.
720b57cec5SDimitry Andric   kmp_str_buf_t buf;
730b57cec5SDimitry Andric   __itt_mark_type version;
740b57cec5SDimitry Andric   __kmp_str_buf_init(&buf);
750b57cec5SDimitry Andric   __kmp_str_buf_print(&buf, "OMP RTL Version %d.%d.%d", __kmp_version_major,
760b57cec5SDimitry Andric                       __kmp_version_minor, __kmp_version_build);
770b57cec5SDimitry Andric   if (__itt_api_version_ptr != NULL) {
780b57cec5SDimitry Andric     __kmp_str_buf_print(&buf, ":%s", __itt_api_version());
790b57cec5SDimitry Andric   }
800b57cec5SDimitry Andric   version = __itt_mark_create(buf.str);
810b57cec5SDimitry Andric   __itt_mark(version, NULL);
820b57cec5SDimitry Andric   __kmp_str_buf_free(&buf);
830b57cec5SDimitry Andric #endif
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric } // __kmp_itt_initialize
860b57cec5SDimitry Andric 
__kmp_itt_destroy()870b57cec5SDimitry Andric void __kmp_itt_destroy() {
880b57cec5SDimitry Andric #if USE_ITT_NOTIFY
890b57cec5SDimitry Andric   __kmp_itt_fini_ittlib();
900b57cec5SDimitry Andric #endif
910b57cec5SDimitry Andric } // __kmp_itt_destroy
920b57cec5SDimitry Andric 
__itt_error_handler(__itt_error_code err,va_list args)930b57cec5SDimitry Andric extern "C" void __itt_error_handler(__itt_error_code err, va_list args) {
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   switch (err) {
960b57cec5SDimitry Andric   case __itt_error_no_module: {
970b57cec5SDimitry Andric     char const *library = va_arg(args, char const *);
980b57cec5SDimitry Andric #if KMP_OS_WINDOWS
990b57cec5SDimitry Andric     int sys_err = va_arg(args, int);
1000b57cec5SDimitry Andric     kmp_msg_t err_code = KMP_SYSERRCODE(sys_err);
1010b57cec5SDimitry Andric     __kmp_msg(kmp_ms_warning, KMP_MSG(IttLoadLibFailed, library), err_code,
1020b57cec5SDimitry Andric               __kmp_msg_null);
1030b57cec5SDimitry Andric     if (__kmp_generate_warnings == kmp_warnings_off) {
1040b57cec5SDimitry Andric       __kmp_str_free(&err_code.str);
1050b57cec5SDimitry Andric     }
1060b57cec5SDimitry Andric #else
1070b57cec5SDimitry Andric     char const *sys_err = va_arg(args, char const *);
1080b57cec5SDimitry Andric     kmp_msg_t err_code = KMP_SYSERRMESG(sys_err);
1090b57cec5SDimitry Andric     __kmp_msg(kmp_ms_warning, KMP_MSG(IttLoadLibFailed, library), err_code,
1100b57cec5SDimitry Andric               __kmp_msg_null);
1110b57cec5SDimitry Andric     if (__kmp_generate_warnings == kmp_warnings_off) {
1120b57cec5SDimitry Andric       __kmp_str_free(&err_code.str);
1130b57cec5SDimitry Andric     }
1140b57cec5SDimitry Andric #endif
1150b57cec5SDimitry Andric   } break;
1160b57cec5SDimitry Andric   case __itt_error_no_symbol: {
1170b57cec5SDimitry Andric     char const *library = va_arg(args, char const *);
1180b57cec5SDimitry Andric     char const *symbol = va_arg(args, char const *);
1190b57cec5SDimitry Andric     KMP_WARNING(IttLookupFailed, symbol, library);
1200b57cec5SDimitry Andric   } break;
1210b57cec5SDimitry Andric   case __itt_error_unknown_group: {
1220b57cec5SDimitry Andric     char const *var = va_arg(args, char const *);
1230b57cec5SDimitry Andric     char const *group = va_arg(args, char const *);
1240b57cec5SDimitry Andric     KMP_WARNING(IttUnknownGroup, var, group);
1250b57cec5SDimitry Andric   } break;
1260b57cec5SDimitry Andric   case __itt_error_env_too_long: {
1270b57cec5SDimitry Andric     char const *var = va_arg(args, char const *);
1280b57cec5SDimitry Andric     size_t act_len = va_arg(args, size_t);
1290b57cec5SDimitry Andric     size_t max_len = va_arg(args, size_t);
1300b57cec5SDimitry Andric     KMP_WARNING(IttEnvVarTooLong, var, (unsigned long)act_len,
1310b57cec5SDimitry Andric                 (unsigned long)max_len);
1320b57cec5SDimitry Andric   } break;
1330b57cec5SDimitry Andric   case __itt_error_cant_read_env: {
1340b57cec5SDimitry Andric     char const *var = va_arg(args, char const *);
1350b57cec5SDimitry Andric     int sys_err = va_arg(args, int);
1360b57cec5SDimitry Andric     kmp_msg_t err_code = KMP_ERR(sys_err);
1370b57cec5SDimitry Andric     __kmp_msg(kmp_ms_warning, KMP_MSG(CantGetEnvVar, var), err_code,
1380b57cec5SDimitry Andric               __kmp_msg_null);
1390b57cec5SDimitry Andric     if (__kmp_generate_warnings == kmp_warnings_off) {
1400b57cec5SDimitry Andric       __kmp_str_free(&err_code.str);
1410b57cec5SDimitry Andric     }
1420b57cec5SDimitry Andric   } break;
1430b57cec5SDimitry Andric   case __itt_error_system: {
1440b57cec5SDimitry Andric     char const *func = va_arg(args, char const *);
1450b57cec5SDimitry Andric     int sys_err = va_arg(args, int);
1460b57cec5SDimitry Andric     kmp_msg_t err_code = KMP_SYSERRCODE(sys_err);
1470b57cec5SDimitry Andric     __kmp_msg(kmp_ms_warning, KMP_MSG(IttFunctionError, func), err_code,
1480b57cec5SDimitry Andric               __kmp_msg_null);
1490b57cec5SDimitry Andric     if (__kmp_generate_warnings == kmp_warnings_off) {
1500b57cec5SDimitry Andric       __kmp_str_free(&err_code.str);
1510b57cec5SDimitry Andric     }
1520b57cec5SDimitry Andric   } break;
153fe6060f1SDimitry Andric   default: {
154fe6060f1SDimitry Andric     KMP_WARNING(IttUnknownError, err);
155fe6060f1SDimitry Andric   }
1560b57cec5SDimitry Andric   }
1570b57cec5SDimitry Andric } // __itt_error_handler
1580b57cec5SDimitry Andric 
1590b57cec5SDimitry Andric #endif /* USE_ITT_BUILD */
160