I know OpenMP 5.1 is not really a focus yet but adding this new interface should not be problematic. I stumbled across this part of the spec and the functionality is really already mostly there in the form of OMP_DISPLAY_ENV=verbose etc. This is just a function interface to the same functionality.
Aside from the busywork to add a new interface (headers, map file) the only real question was how to deal with the two parameters which are passed to handle_omp_display_env in the current implementation. The omp_display_env interface is supposed to show the information of the initial values and therefore I think the right implementation is to store the values determined in the constructor in two global, static variables and reuse them. The rest should be completely boring and therefore not distracting anyone from OpenMP 5.0 work. OK to commit? diff --git a/libgomp/env.c b/libgomp/env.c index a24deabcd58..84038eb4683 100644 --- a/libgomp/env.c +++ b/libgomp/env.c @@ -99,6 +99,9 @@ int goacc_default_dims[GOMP_DIM_MAX]; #ifndef LIBGOMP_OFFLOADED_ONLY +static int wait_policy; +static unsigned long stacksize = GOMP_DEFAULT_STACKSIZE; + /* Parse the OMP_SCHEDULE environment variable. */ static void @@ -1210,46 +1213,11 @@ parse_gomp_openacc_dim (void) } } -static void -handle_omp_display_env (unsigned long stacksize, int wait_policy) +void +omp_display_env (int verbose) { - const char *env; - bool display = false; - bool verbose = false; int i; - env = getenv ("OMP_DISPLAY_ENV"); - if (env == NULL) - return; - - while (isspace ((unsigned char) *env)) - ++env; - if (strncasecmp (env, "true", 4) == 0) - { - display = true; - env += 4; - } - else if (strncasecmp (env, "false", 5) == 0) - { - display = false; - env += 5; - } - else if (strncasecmp (env, "verbose", 7) == 0) - { - display = true; - verbose = true; - env += 7; - } - else - env = "X"; - while (isspace ((unsigned char) *env)) - ++env; - if (*env != '\0') - gomp_error ("Invalid value for environment variable OMP_DISPLAY_ENV"); - - if (!display) - return; - fputs ("\nOPENMP DISPLAY ENVIRONMENT BEGIN\n", stderr); fputs (" _OPENMP = '201511'\n", stderr); @@ -1409,13 +1377,52 @@ handle_omp_display_env (unsigned long stacksize, int wait_policy) fputs ("OPENMP DISPLAY ENVIRONMENT END\n", stderr); } +static void +handle_omp_display_env (void) +{ + const char *env; + bool display = false; + bool verbose = false; + + env = getenv ("OMP_DISPLAY_ENV"); + if (env == NULL) + return; + + while (isspace ((unsigned char) *env)) + ++env; + if (strncasecmp (env, "true", 4) == 0) + { + display = true; + env += 4; + } + else if (strncasecmp (env, "false", 5) == 0) + { + display = false; + env += 5; + } + else if (strncasecmp (env, "verbose", 7) == 0) + { + display = true; + verbose = true; + env += 7; + } + else + env = "X"; + while (isspace ((unsigned char) *env)) + ++env; + if (*env != '\0') + gomp_error ("Invalid value for environment variable OMP_DISPLAY_ENV"); + + if (display) + omp_display_env (verbose); +} + static void __attribute__((constructor)) initialize_env (void) { - unsigned long thread_limit_var, stacksize = GOMP_DEFAULT_STACKSIZE; + unsigned long thread_limit_var; unsigned long max_active_levels_var; - int wait_policy; /* Do a compile time check that mkomp_h.pl did good job. */ omp_check_defines (); @@ -1546,7 +1553,7 @@ initialize_env (void) gomp_error ("Stack size change failed: %s", strerror (err)); } - handle_omp_display_env (stacksize, wait_policy); + handle_omp_display_env (); /* OpenACC. */ diff --git a/libgomp/fortran.c b/libgomp/fortran.c index 4ec39c4e61b..2f36e326624 100644 --- a/libgomp/fortran.c +++ b/libgomp/fortran.c @@ -736,3 +736,9 @@ omp_get_default_allocator_ () { return (intptr_t) omp_get_default_allocator (); } + +void +omp_display_env_ (const int32_t *verbose) +{ + omp_display_env (*verbose); +} diff --git a/libgomp/libgomp.map b/libgomp/libgomp.map index 8ea27b5565f..fe51d3dbd46 100644 --- a/libgomp/libgomp.map +++ b/libgomp/libgomp.map @@ -199,6 +199,12 @@ OMP_5.0.1 { omp_fulfill_event_; } OMP_5.0; +OMP_5.1 { + global: + omp_display_env; + omp_display_env_; +} OMP_5.0.1; + GOMP_1.0 { global: GOMP_atomic_end; diff --git a/libgomp/omp.h.in b/libgomp/omp.h.in index 69f96f09124..c93db968d2e 100644 --- a/libgomp/omp.h.in +++ b/libgomp/omp.h.in @@ -293,6 +293,8 @@ extern void omp_free (void *, omp_allocator_handle_t __GOMP_DEFAULT_NULL_ALLOCATOR) __GOMP_NOTHROW; +extern void omp_display_env (int) __GOMP_NOTHROW; + #ifdef __cplusplus } #endif diff --git a/libgomp/omp_lib.f90.in b/libgomp/omp_lib.f90.in index 851f85f5316..4939bfd9751 100644 --- a/libgomp/omp_lib.f90.in +++ b/libgomp/omp_lib.f90.in @@ -653,6 +653,12 @@ end function end interface + interface + subroutine omp_display_env (verbose) + logical,intent(in) :: verbose + end subroutine + end interface + #if _OPENMP >= 201811 !GCC$ ATTRIBUTES DEPRECATED :: omp_get_nested, omp_set_nested #endif diff --git a/libgomp/omp_lib.h.in b/libgomp/omp_lib.h.in index 06d17b5fcdc..9873cea9ac1 100644 --- a/libgomp/omp_lib.h.in +++ b/libgomp/omp_lib.h.in @@ -264,3 +264,5 @@ external omp_set_default_allocator external omp_get_default_allocator integer (omp_allocator_handle_kind) omp_get_default_allocator + + external omp_display_env