Index: openmp/runtime/src/dllexports =================================================================== --- openmp/runtime/src/dllexports +++ openmp/runtime/src/dllexports @@ -533,6 +533,7 @@ omp_pause_resource_all 757 omp_get_supported_active_levels 758 omp_fulfill_event 759 + omp_display_env 899 omp_null_allocator DATA omp_default_mem_alloc DATA Index: openmp/runtime/src/include/omp.h.var =================================================================== --- openmp/runtime/src/include/omp.h.var +++ openmp/runtime/src/include/omp.h.var @@ -355,6 +355,9 @@ extern int __KAI_KMPC_CONVENTION omp_get_supported_active_levels(void); + /* OpenMP 5.1 Display Environment */ + extern void omp_display_env(int verbose); + # undef __KAI_KMPC_CONVENTION # undef __KMP_IMP Index: openmp/runtime/src/include/omp_lib.h.var =================================================================== --- openmp/runtime/src/include/omp_lib.h.var +++ openmp/runtime/src/include/omp_lib.h.var @@ -580,6 +580,11 @@ integer (kind=kmp_size_t_kind) :: omp_capture_affinity end function omp_capture_affinity + subroutine omp_display_env(verbose) bind(c) + import + logical (kind=omp_logical_kind), value :: verbose + end subroutine omp_display_env + ! *** ! *** kmp_* entry points ! *** Index: openmp/runtime/src/include/omp_lib.f.var =================================================================== --- openmp/runtime/src/include/omp_lib.f.var +++ openmp/runtime/src/include/omp_lib.f.var @@ -488,6 +488,11 @@ integer (kind=kmp_size_t_kind) omp_capture_affinity end function omp_capture_affinity + subroutine omp_display_env(verbose) bind(c) + use omp_lib_kinds + logical (kind=omp_logical_kind) verbose + end subroutine omp_display_env + ! *** ! *** kmp_* entry points ! *** Index: openmp/runtime/src/include/omp_lib.f90.var =================================================================== --- openmp/runtime/src/include/omp_lib.f90.var +++ openmp/runtime/src/include/omp_lib.f90.var @@ -503,6 +503,12 @@ integer (kind=kmp_size_t_kind) :: omp_capture_affinity end function omp_capture_affinity + subroutine omp_display_env(verbose) bind(c) + use omp_lib_kinds + logical (kind=omp_logical_kind), value :: verbose + end subroutine omp_display_env + + ! *** ! *** kmp_* entry points ! *** Index: openmp/runtime/src/kmp.h =================================================================== --- openmp/runtime/src/kmp.h +++ openmp/runtime/src/kmp.h @@ -3908,6 +3908,8 @@ } } +extern void __kmp_omp_display_env(int verbose); + #ifdef __cplusplus } #endif Index: openmp/runtime/src/kmp_ftn_entry.h =================================================================== --- openmp/runtime/src/kmp_ftn_entry.h +++ openmp/runtime/src/kmp_ftn_entry.h @@ -1371,6 +1371,13 @@ #endif } +// display environment variables when requested +void FTN_STDCALL FTN_DISPLAY_ENV(int verbose) { +#ifndef KMP_STUB + __kmp_omp_display_env(verbose); +#endif +} + // GCC compatibility (versioned symbols) #ifdef KMP_USE_VERSION_SYMBOLS Index: openmp/runtime/src/kmp_ftn_os.h =================================================================== --- openmp/runtime/src/kmp_ftn_os.h +++ openmp/runtime/src/kmp_ftn_os.h @@ -133,6 +133,7 @@ #define FTN_PAUSE_RESOURCE omp_pause_resource #define FTN_PAUSE_RESOURCE_ALL omp_pause_resource_all #define FTN_GET_SUPPORTED_ACTIVE_LEVELS omp_get_supported_active_levels +#define FTN_DISPLAY_ENV omp_display_env #define FTN_FULFILL_EVENT omp_fulfill_event #endif /* KMP_FTN_PLAIN */ @@ -256,6 +257,7 @@ #define FTN_PAUSE_RESOURCE omp_pause_resource_ #define FTN_PAUSE_RESOURCE_ALL omp_pause_resource_all_ #define FTN_GET_SUPPORTED_ACTIVE_LEVELS omp_get_supported_active_levels_ +#define FTN_DISPLAY_ENV omp_display_env_ #define FTN_FULFILL_EVENT omp_fulfill_event_ #endif /* KMP_FTN_APPEND */ @@ -377,6 +379,7 @@ #define FTN_PAUSE_RESOURCE OMP_PAUSE_RESOURCE #define FTN_PAUSE_RESOURCE_ALL OMP_PAUSE_RESOURCE_ALL #define FTN_GET_SUPPORTED_ACTIVE_LEVELS OMP_GET_SUPPORTED_ACTIVE_LEVELS +#define FTN_DISPLAY_ENV OMP_DISPLAY_ENV #define FTN_FULFILL_EVENT OMP_FULFILL_EVENT #endif /* KMP_FTN_UPPER */ @@ -500,6 +503,7 @@ #define FTN_PAUSE_RESOURCE OMP_PAUSE_RESOURCE_ #define FTN_PAUSE_RESOURCE_ALL OMP_PAUSE_RESOURCE_ALL_ #define FTN_GET_SUPPORTED_ACTIVE_LEVELS OMP_GET_SUPPORTED_ACTIVE_LEVELS_ +#define FTN_DISPLAY_ENV OMP_DISPLAY_ENV_ #define FTN_FULFILL_EVENT OMP_FULFILL_EVENT_ #endif /* KMP_FTN_UAPPEND */ Index: openmp/runtime/src/kmp_runtime.cpp =================================================================== --- openmp/runtime/src/kmp_runtime.cpp +++ openmp/runtime/src/kmp_runtime.cpp @@ -8217,7 +8217,6 @@ return (retval); } - // this function is for testing set/get/determine reduce method kmp_int32 __kmp_get_reduce_method(void) { return ((__kmp_entry_thread()->th.th_local.packed_reduction_method) >> 8); @@ -8297,3 +8296,13 @@ return 1; } } + + +void __kmp_omp_display_env(int verbose) { + // TODO: do we have to init the runtime here? + __kmp_acquire_bootstrap_lock(&__kmp_initz_lock); + if (__kmp_init_serial == 0) + __kmp_do_serial_initialize(); + __kmp_display_env_impl(!verbose, verbose); + __kmp_release_bootstrap_lock(&__kmp_initz_lock); +} Index: openmp/runtime/src/kmp_settings.h =================================================================== --- openmp/runtime/src/kmp_settings.h +++ openmp/runtime/src/kmp_settings.h @@ -17,6 +17,7 @@ void __kmp_env_initialize(char const *); void __kmp_env_print(); void __kmp_env_print_2(); +void __kmp_display_env_impl(int display_env, int display_env_verbose); int __kmp_initial_threads_capacity(int req_nproc); void __kmp_init_dflt_team_nth(); Index: openmp/runtime/src/kmp_settings.cpp =================================================================== --- openmp/runtime/src/kmp_settings.cpp +++ openmp/runtime/src/kmp_settings.cpp @@ -5720,7 +5720,7 @@ } // __kmp_env_print void __kmp_env_print_2() { - +#if 0 kmp_env_blk_t block; kmp_str_buf_t buffer; @@ -5754,7 +5754,47 @@ __kmp_str_buf_free(&buffer); __kmp_printf("\n"); +#endif + __kmp_display_env_impl(__kmp_display_env, __kmp_display_env_verbose); } // __kmp_env_print_2 + +void __kmp_display_env_impl(int display_env, int display_env_verbose) { + kmp_env_blk_t block; + kmp_str_buf_t buffer; + + __kmp_env_format = 1; + + __kmp_stg_init(); + __kmp_str_buf_init(&buffer); + + __kmp_env_blk_init(&block, NULL); + __kmp_env_blk_sort(&block); + + __kmp_str_buf_print(&buffer, "\n%s\n", KMP_I18N_STR(DisplayEnvBegin)); + __kmp_str_buf_print(&buffer, " _OPENMP='%d'\n", __kmp_openmp_version); + + for (int i = 0; i < __kmp_stg_count; ++i) { + if (__kmp_stg_table[i].print != NULL && + ((display_env && + strncmp(__kmp_stg_table[i].name, "OMP_", 4) == 0) || + display_env_verbose)) { + __kmp_stg_table[i].print(&buffer, __kmp_stg_table[i].name, + __kmp_stg_table[i].data); + } + } + + __kmp_str_buf_print(&buffer, "%s\n", KMP_I18N_STR(DisplayEnvEnd)); + __kmp_str_buf_print(&buffer, "\n"); + + __kmp_printf("%s", buffer.str); + + __kmp_env_blk_free(&block); + __kmp_str_buf_free(&buffer); + + __kmp_printf("\n"); +} + // end of file + Index: openmp/runtime/test/api/omp_display_env0.c =================================================================== --- /dev/null +++ openmp/runtime/test/api/omp_display_env0.c @@ -0,0 +1,10 @@ +// RUN: %libomp-compile-and-run +// RUN: %libomp-cxx-compile-and-run +#include +#include +int main() +{ + omp_display_env(0); + printf("passed\n"); + return 0; +}