/* Copyright (C) 2005-2022 Free Software Foundation, Inc.
   Contributed by Richard Henderson <rth@redhat.com>.

   This file is part of the GNU Offloading and Multi Processing Library
   (libgomp).

   Libgomp is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
   FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

/* This file defines the OpenMP internal control variables and arranges
   for them to be initialized from environment variables at startup.  */

#define _GNU_SOURCE
#include "libgomp.h"
#include "gomp-constants.h"
#include <limits.h>
#ifndef LIBGOMP_OFFLOADED_ONLY
#include "libgomp_f.h"
#include "oacc-int.h"
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>	/* For PRIu64.  */
#endif
#ifdef STRING_WITH_STRINGS
# include <string.h>
# include <strings.h>
#else
# ifdef HAVE_STRING_H
#  include <string.h>
# else
#  ifdef HAVE_STRINGS_H
#   include <strings.h>
#  endif
# endif
#endif
#include <errno.h>
#include "thread-stacksize.h"

#ifndef HAVE_STRTOULL
# define strtoull(ptr, eptr, base) strtoul (ptr, eptr, base)
#endif
#endif /* LIBGOMP_OFFLOADED_ONLY */

#include "secure_getenv.h"
#include "environ.h"

/* Default values of ICVs according to the OpenMP standard.  */
const struct gomp_default_icv gomp_default_icv_values = {
  .nthreads_var = 1,
  .thread_limit_var = UINT_MAX,
  .run_sched_var = GFS_DYNAMIC,
  .run_sched_chunk_size = 1,
  .default_device_var = 0,
  .max_active_levels_var = 1,
  .bind_var = omp_proc_bind_false,
  .nteams_var = 0,
  .teams_thread_limit_var = 0,
  .dyn_var = false
};

struct gomp_task_icv gomp_global_icv = {
  .nthreads_var = gomp_default_icv_values.nthreads_var,
  .thread_limit_var = gomp_default_icv_values.thread_limit_var,
  .run_sched_var = gomp_default_icv_values.run_sched_var,
  .run_sched_chunk_size = gomp_default_icv_values.run_sched_chunk_size,
  .default_device_var = gomp_default_icv_values.default_device_var,
  .dyn_var = gomp_default_icv_values.dyn_var,
  .max_active_levels_var = gomp_default_icv_values.max_active_levels_var,
  .bind_var = gomp_default_icv_values.bind_var,
  .target_data = NULL
};

/* List for initial "_DEV", "_ALL", and "_DEV_X" ICVs like OMP_NUM_TEAMS_DEV,
   OMP_NUM_TEAMS_ALL, or OMP_NUM_TEAMS_DEV_42.  */
struct gomp_icv_list *gomp_initial_icv_list = NULL;

/* List for "_DEV_X" ICVs like OMP_NUM_TEAMS_DEV_42.  This list contains all
   device-specific ICVs that are copied from host to device and back.  */
struct gomp_offload_icv_list *gomp_offload_icv_list = NULL;

bool gomp_cancel_var = false;
enum gomp_target_offload_t gomp_target_offload_var
  = GOMP_TARGET_OFFLOAD_DEFAULT;
int gomp_max_task_priority_var = 0;
#ifndef HAVE_SYNC_BUILTINS
gomp_mutex_t gomp_managed_threads_lock;
#endif
unsigned long gomp_available_cpus = 1, gomp_managed_threads = 1;
unsigned long long gomp_spin_count_var, gomp_throttled_spin_count_var;
unsigned long *gomp_nthreads_var_list, gomp_nthreads_var_list_len;
char *gomp_bind_var_list;
unsigned long gomp_bind_var_list_len;
void **gomp_places_list;
unsigned long gomp_places_list_len;
uintptr_t gomp_def_allocator = omp_default_mem_alloc;
int gomp_debug_var;
unsigned int gomp_num_teams_var;
int gomp_nteams_var;
int gomp_teams_thread_limit_var;
bool gomp_display_affinity_var;
char *gomp_affinity_format_var = "level %L thread %i affinity %A";
size_t gomp_affinity_format_len;
char *goacc_device_type;
int goacc_device_num;
int goacc_default_dims[GOMP_DIM_MAX];

#ifndef LIBGOMP_OFFLOADED_ONLY

static int wait_policy;
static unsigned long stacksize = GOMP_DEFAULT_STACKSIZE;

static void
print_env_var_error (const char *env, const char *val)
{
  gomp_error ("Invalid value for environment variable %.*s: %s",
	      (int) (val - env - 1), env, val);
}

/* Parse the OMP_SCHEDULE environment variable.  */
static bool
parse_schedule (const char *env, const char *val, void *const params[])
{
  enum gomp_schedule_type *schedule = (enum gomp_schedule_type *) params[0];
  int *chunk_size = (int *) params[1];
  char *end;
  unsigned long value;
  int monotonic = 0;

  if (val == NULL)
    return false;

  while (isspace ((unsigned char) *val))
    ++val;
  if (strncasecmp (val, "monotonic", 9) == 0)
    {
      monotonic = 1;
      val += 9;
    }
  else if (strncasecmp (val, "nonmonotonic", 12) == 0)
    {
      monotonic = -1;
      val += 12;
    }
  if (monotonic)
    {
      while (isspace ((unsigned char) *val))
	++val;
      if (*val != ':')
	goto unknown;
      ++val;
      while (isspace ((unsigned char) *val))
	++val;
    }
  if (strncasecmp (val, "static", 6) == 0)
    {
      *schedule = GFS_STATIC;
      val += 6;
    }
  else if (strncasecmp (val, "dynamic", 7) == 0)
    {
      *schedule = GFS_DYNAMIC;
      val += 7;
    }
  else if (strncasecmp (val, "guided", 6) == 0)
    {
      *schedule = GFS_GUIDED;
      val += 6;
    }
  else if (strncasecmp (val, "auto", 4) == 0)
    {
      *schedule = GFS_AUTO;
      val += 4;
    }
  else
    goto unknown;

  if (monotonic == 1
      || (monotonic == 0 && *schedule == GFS_STATIC))
    *schedule |= GFS_MONOTONIC;

  while (isspace ((unsigned char) *val))
    ++val;
  if (*val == '\0')
    {
      *chunk_size = (*schedule & ~GFS_MONOTONIC) != GFS_STATIC;
      return true;
    }
  if (*val++ != ',')
    goto unknown;
  while (isspace ((unsigned char) *val))
    ++val;
  if (*val == '\0')
    goto invalid;

  errno = 0;
  value = strtoul (val, &end, 10);
  if (errno || end == val)
    goto invalid;

  while (isspace ((unsigned char) *end))
    ++end;
  if (*end != '\0')
    goto invalid;

  if ((int)value != value)
    goto invalid;

  if (value == 0 && (*schedule & ~GFS_MONOTONIC) != GFS_STATIC)
    value = 1;
  *chunk_size = value;
  return true;

 unknown:
  print_env_var_error (env, val);
  return false;

 invalid:
  char name[val - env];
  memcpy (name, env, val - env - 1);
  name[val - env - 1] = '\0';
  gomp_error ("Invalid value for chunk size in "
	      "environment variable %s: %s", name, val);
  return false;
}

/* Parse an unsigned long environment variable.  Return true if one was
   present and it was successfully parsed.  If SECURE, use secure_getenv to the
   environment variable.  */

static bool
parse_unsigned_long_1 (const char *env, const char *val, unsigned long *pvalue,
		       bool allow_zero)
{
  char *end;
  unsigned long value;

  if (val == NULL)
    return false;

  while (isspace ((unsigned char) *val))
    ++val;
  if (*val == '\0')
    goto invalid;

  errno = 0;
  value = strtoul (val, &end, 10);
  if (errno || end == val || (long) value <= 0 - allow_zero)
    goto invalid;

  while (isspace ((unsigned char) *end))
    ++end;
  if (*end != '\0')
    goto invalid;

  *pvalue = value;
  return true;

 invalid:
  print_env_var_error (env, val);
  return false;
}

/* As parse_unsigned_long_1, but always use getenv.  */

static bool
parse_unsigned_long (const char *env, const char *val, void *const params[])
{
  unsigned upper = (unsigned long) params[2];
  unsigned long pvalue = 0;
  bool ret = parse_unsigned_long_1 (env, val, &pvalue, (bool) params[1]);
  if (!ret)
    return false;

  if (upper == 0)
    *(unsigned long *) params[0] = pvalue;
  else
    {
      if (pvalue > upper)
	pvalue = upper;
      if (upper <= UCHAR_MAX)
	*(unsigned char *) params[0] = pvalue;
      else if (upper <= UINT_MAX)
	*(unsigned int *) params[0] = pvalue;
      else
	*(unsigned long *) params[0] = pvalue;
    }

  return ret;
}

/* Parse a positive int environment variable.  Return true if one was
   present and it was successfully parsed.  If SECURE, use secure_getenv to the
   environment variable.  */

static bool
parse_int_1 (const char *env, const char *val, int *pvalue, bool allow_zero)
{
  unsigned long value;
  if (!parse_unsigned_long_1 (env, val, &value, allow_zero))
    return false;
  if (value > INT_MAX)
    {
      print_env_var_error (env, val);
      return false;
    }
  *pvalue = (int) value;
  return true;
}

static bool
parse_int (const char *env, const char *val, void *const params[])
{
  return parse_int_1 (env, val, (int *) params[0], (bool) params[1]);
}

/* As parse_int_1, but use getenv_secure.  */

static bool
parse_int_secure (const char *env, int *pvalue, bool allow_zero)
{
  return parse_int_1 (env, secure_getenv (env), pvalue, allow_zero);
}

/* Parse an unsigned long list environment variable.  Return true if one was
   present and it was successfully parsed.  */

static bool
parse_unsigned_long_list (const char *env, const char *val,
			  void *const params[])
{
  unsigned long *p1stvalue = (unsigned long *) params[0];
  unsigned long **pvalues = (unsigned long **) params[1];
  unsigned long *pnvalues = (unsigned long *) params[2];
  char *end;
  unsigned long value, *values = NULL;

  if (val == NULL)
    return false;

  while (isspace ((unsigned char) *val))
    ++val;
  if (*val == '\0')
    goto invalid;

  errno = 0;
  value = strtoul (val, &end, 10);
  if (errno || (long) value <= 0)
    goto invalid;

  while (isspace ((unsigned char) *end))
    ++end;
  if (*end != '\0')
    {
      if (*end == ',')
	{
	  unsigned long nvalues = 0, nalloced = 0;

	  do
	    {
	      val = end + 1;
	      if (nvalues == nalloced)
		{
		  unsigned long *n;
		  nalloced = nalloced ? nalloced * 2 : 16;
		  n = realloc (values, nalloced * sizeof (unsigned long));
		  if (n == NULL)
		    {
		      free (values);
		      char name[val - env];
		      memcpy (name, env, val - env - 1);
		      name[val - env - 1] = '\0';
		      gomp_error ("Out of memory while trying to parse"
				  " environment variable %s", name);
		      return false;
		    }
		  values = n;
		  if (nvalues == 0)
		    values[nvalues++] = value;
		}

	      while (isspace ((unsigned char) *val))
		++val;
	      if (*val == '\0')
		goto invalid;

	      errno = 0;
	      value = strtoul (val, &end, 10);
	      if (errno || (long) value <= 0)
		goto invalid;

	      values[nvalues++] = value;
	      while (isspace ((unsigned char) *end))
		++end;
	      if (*end == '\0')
		break;
	      if (*end != ',')
		goto invalid;
	    }
	  while (1);
	  *p1stvalue = values[0];
	  *pvalues = values;
	  *pnvalues = nvalues;
	  return true;
	}
      goto invalid;
    }
  else
    {
      *pnvalues = 0;
      *pvalues = NULL;
    }

  *p1stvalue = value;
  return true;

 invalid:
  free (values);
  print_env_var_error (env, val);
  return false;
}

static bool
parse_target_offload (const char *env, const char *val, void *const params[])
{
  int new_offload = -1;

  if (val == NULL)
    return false;

  while (isspace ((unsigned char) *val))
    ++val;
  if (strncasecmp (val, "default", 7) == 0)
    {
      val += 7;
      new_offload = GOMP_TARGET_OFFLOAD_DEFAULT;
    }
  else if (strncasecmp (val, "mandatory", 9) == 0)
    {
      val += 9;
      new_offload = GOMP_TARGET_OFFLOAD_MANDATORY;
    }
  else if (strncasecmp (val, "disabled", 8) == 0)
    {
      val += 8;
      new_offload = GOMP_TARGET_OFFLOAD_DISABLED;
    }
  while (isspace ((unsigned char) *val))
    ++val;
  if (new_offload != -1 && *val == '\0')
    {
      *(enum gomp_target_offload_t *) params[0] = new_offload;
      return true;
    }

  print_env_var_error (env, val);
  return false;
}

/* Parse environment variable set to a boolean or list of omp_proc_bind_t
   enum values.  Return true if one was present and it was successfully
   parsed.  */

static bool
parse_bind_var (const char *env, const char *val, void *const params[])
{
  char *p1stvalue = (char *) params[0];
  char **pvalues = (char **) params[1];
  unsigned long *pnvalues = (unsigned long *) params[2];
  char value = omp_proc_bind_false, *values = NULL;
  int i;
  static struct proc_bind_kinds
  {
    const char name[7];
    const char len;
    omp_proc_bind_t kind;
  } kinds[] =
  {
    { "false", 5, omp_proc_bind_false },
    { "true", 4, omp_proc_bind_true },
    { "master", 6, omp_proc_bind_master },
    { "primary", 7, omp_proc_bind_primary },
    { "close", 5, omp_proc_bind_close },
    { "spread", 6, omp_proc_bind_spread }
  };

  if (val == NULL)
    return false;

  while (isspace ((unsigned char) *val))
    ++val;
  if (*val == '\0')
    goto invalid;

  for (i = 0; i < 6; i++)
    if (strncasecmp (val, kinds[i].name, kinds[i].len) == 0)
      {
	value = kinds[i].kind;
	val += kinds[i].len;
	break;
      }
  if (i == 6)
    goto invalid;

  while (isspace ((unsigned char) *val))
    ++val;
  if (*val != '\0')
    {
      if (*val == ',')
	{
	  unsigned long nvalues = 0, nalloced = 0;

	  if (value == omp_proc_bind_false
	      || value == omp_proc_bind_true)
	    goto invalid;

	  do
	    {
	      val++;
	      if (nvalues == nalloced)
		{
		  char *n;
		  nalloced = nalloced ? nalloced * 2 : 16;
		  n = realloc (values, nalloced);
		  if (n == NULL)
		    {
		      free (values);
		      char name[val - env];
		      memcpy (name, env, val - env - 1);
		      name[val - env - 1] = '\0';
		      gomp_error ("Out of memory while trying to parse"
				  " environment variable %s", name);
		      return false;
		    }
		  values = n;
		  if (nvalues == 0)
		    values[nvalues++] = value;
		}

	      while (isspace ((unsigned char) *val))
		++val;
	      if (*val == '\0')
		goto invalid;

	      for (i = 2; i < 6; i++)
		if (strncasecmp (val, kinds[i].name, kinds[i].len) == 0)
		  {
		    value = kinds[i].kind;
		    val += kinds[i].len;
		    break;
		  }
	      if (i == 6)
		goto invalid;

	      values[nvalues++] = value;
	      while (isspace ((unsigned char) *val))
		++val;
	      if (*val == '\0')
		break;
	      if (*val != ',')
		goto invalid;
	    }
	  while (1);
	  *p1stvalue = values[0];
	  *pvalues = values;
	  *pnvalues = nvalues;
	  return true;
	}
      goto invalid;
    }

  *p1stvalue = value;
  return true;

 invalid:
  free (values);
  print_env_var_error (env, val);
  return false;
}

static bool
parse_one_place (char **envp, bool *negatep, unsigned long *lenp,
		 long *stridep)
{
  char *env = *envp, *start;
  void *p = gomp_places_list ? gomp_places_list[gomp_places_list_len] : NULL;
  unsigned long len = 1;
  long stride = 1;
  int pass;
  bool any_negate = false;
  bool has_braces = true;
  *negatep = false;
  while (isspace ((unsigned char) *env))
    ++env;
  if (*env == '!')
    {
      *negatep = true;
      ++env;
      while (isspace ((unsigned char) *env))
	++env;
    }
  if (*env != '{')
    {
      char *end;
      unsigned long this_num;

      errno = 0;
      this_num = strtoul (env, &end, 10);
      if (errno || end == env)
	return false;
      env = end - 1;
      has_braces = false;
      if (gomp_places_list
	  && !gomp_affinity_add_cpus (p, this_num, 1, 1, false))
	return false;
    }
  else
    {
      ++env;
      while (isspace ((unsigned char) *env))
	++env;
    }
  start = env;
  for (pass = 0; pass < (any_negate ? 2 : has_braces); pass++)
    {
      env = start;
      do
	{
	  unsigned long this_num, this_len = 1;
	  long this_stride = 1;
	  bool this_negate = (*env == '!');
	  char *end;
	  if (this_negate)
	    {
	      if (gomp_places_list)
		any_negate = true;
	      ++env;
	      while (isspace ((unsigned char) *env))
		++env;
	    }

	  errno = 0;
	  this_num = strtoul (env, &end, 10);
	  if (errno || end == env)
	    return false;
	  env = end;
	  while (isspace ((unsigned char) *env))
	    ++env;
	  if (*env == ':')
	    {
	      ++env;
	      if (this_negate)
		return false;
	      while (isspace ((unsigned char) *env))
		++env;
	      errno = 0;
	      this_len = strtoul (env, &env, 10);
	      if (errno || this_len == 0)
		return false;
	      while (isspace ((unsigned char) *env))
		++env;
	      if (*env == ':')
		{
		  ++env;
		  while (isspace ((unsigned char) *env))
		    ++env;
		  errno = 0;
		  this_stride = strtol (env, &end, 10);
		  if (errno || end == env)
		    return false;
		  env = end;
		  while (isspace ((unsigned char) *env))
		    ++env;
		}
	    }
	  if (gomp_places_list && pass == this_negate)
	    {
	      if (this_negate)
		{
		  if (!gomp_affinity_remove_cpu (p, this_num))
		    return false;
		}
	      else if (!gomp_affinity_add_cpus (p, this_num, this_len,
						this_stride, false))
		return false;
	    }
	  if (*env == '}')
	    break;
	  if (*env != ',')
	    return false;
	  ++env;
	}
      while (1);
    }

  ++env;
  while (isspace ((unsigned char) *env))
    ++env;
  if (*env == ':')
    {
      char *end;
      if (*negatep)
	return false;
      ++env;
      while (isspace ((unsigned char) *env))
	++env;
      errno = 0;
      len = strtoul (env, &env, 10);
      if (errno || len == 0 || len >= 65536)
	return false;
      while (isspace ((unsigned char) *env))
	++env;
      if (*env == ':')
	{
	  ++env;
	  while (isspace ((unsigned char) *env))
	    ++env;
	  errno = 0;
	  stride = strtol (env, &end, 10);
	  if (errno || end == env)
	    return false;
	  env = end;
	  while (isspace ((unsigned char) *env))
	    ++env;
	}
    }
  *envp = env;
  *lenp = len;
  *stridep = stride;
  return true;
}

static bool
parse_places_var (const char *name, bool ignore)
{
  char *env = getenv (name), *end;
  bool any_negate = false;
  int level = 0;
  unsigned long count = 0;
  if (env == NULL)
    return false;

  while (isspace ((unsigned char) *env))
    ++env;
  if (*env == '\0')
    goto invalid;

  if (strncasecmp (env, "threads", 7) == 0)
    {
      env += 7;
      level = 1;
    }
  else if (strncasecmp (env, "cores", 5) == 0)
    {
      env += 5;
      level = 2;
    }
  else if (strncasecmp (env, "sockets", 7) == 0)
    {
      env += 7;
      level = 3;
    }
  else if (strncasecmp (env, "ll_caches", 9) == 0)
    {
      env += 9;
      level = 4;
    }
  else if (strncasecmp (env, "numa_domains", 12) == 0)
    {
      env += 12;
      level = 5;
    }
  if (level)
    {
      count = ULONG_MAX;
      while (isspace ((unsigned char) *env))
	++env;
      if (*env != '\0')
	{
	  if (*env++ != '(')
	    goto invalid;
	  while (isspace ((unsigned char) *env))
	    ++env;

	  errno = 0;
	  count = strtoul (env, &end, 10);
	  if (errno || end == env)
	    goto invalid;
	  env = end;
	  while (isspace ((unsigned char) *env))
	    ++env;
	  if (*env != ')')
	    goto invalid;
	  ++env;
	  while (isspace ((unsigned char) *env))
	    ++env;
	  if (*env != '\0')
	    goto invalid;
	}

      if (ignore)
	return false;

      return gomp_affinity_init_level (level, count, false);
    }

  count = 0;
  end = env;
  do
    {
      bool negate;
      unsigned long len;
      long stride;
      if (!parse_one_place (&end, &negate, &len, &stride))
	goto invalid;
      if (negate)
	{
	  if (!any_negate)
	    count++;
	  any_negate = true;
	}
      else
	count += len;
      if (count > 65536)
	goto invalid;
      if (*end == '\0')
	break;
      if (*end != ',')
	goto invalid;
      end++;
    }
  while (1);

  if (ignore)
    return false;

  gomp_places_list_len = 0;
  gomp_places_list = gomp_affinity_alloc (count, false);
  if (gomp_places_list == NULL)
    return false;

  do
    {
      bool negate;
      unsigned long len;
      long stride;
      gomp_affinity_init_place (gomp_places_list[gomp_places_list_len]);
      if (!parse_one_place (&env, &negate, &len, &stride))
	goto invalid;
      if (negate)
	{
	  void *p;
	  for (count = 0; count < gomp_places_list_len; count++)
	    if (gomp_affinity_same_place
			(gomp_places_list[count],
			 gomp_places_list[gomp_places_list_len]))
	      break;
	  if (count == gomp_places_list_len)
	    {
	      gomp_error ("Trying to remove a non-existing place from list "
			  "of places");
	      goto invalid;
	    }
	  p = gomp_places_list[count];
	  memmove (&gomp_places_list[count],
		   &gomp_places_list[count + 1],
		   (gomp_places_list_len - count - 1) * sizeof (void *));
	  --gomp_places_list_len;
	  gomp_places_list[gomp_places_list_len] = p;
	}
      else if (len == 1)
	++gomp_places_list_len;
      else
	{
	  for (count = 0; count < len - 1; count++)
	    if (!gomp_affinity_copy_place
			(gomp_places_list[gomp_places_list_len + count + 1],
			 gomp_places_list[gomp_places_list_len + count],
			 stride))
	      goto invalid;
	  gomp_places_list_len += len;
	}
      if (*env == '\0')
	break;
      env++;
    }
  while (1);

  if (gomp_places_list_len == 0)
    {
      gomp_error ("All places have been removed");
      goto invalid;
    }
  if (!gomp_affinity_finalize_place_list (false))
    goto invalid;
  return true;

 invalid:
  free (gomp_places_list);
  gomp_places_list = NULL;
  gomp_places_list_len = 0;
  gomp_error ("Invalid value for environment variable %s", name);
  return false;
}

/* Parse the OMP_STACKSIZE environment varible.  Return true if one was
   present and it was successfully parsed.  */

static bool
parse_stacksize (const char *env, const char *val, void *const params[])
{
  char *end;
  unsigned long value, shift = 10;

  if (val == NULL)
    return false;

  while (isspace ((unsigned char) *val))
    ++val;
  if (*val == '\0')
    goto invalid;

  errno = 0;
  value = strtoul (val, &end, 10);
  if (errno || end == val)
    goto invalid;

  while (isspace ((unsigned char) *end))
    ++end;
  if (*end != '\0')
    {
      switch (tolower ((unsigned char) *end))
	{
	case 'b':
	  shift = 0;
	  break;
	case 'k':
	  break;
	case 'm':
	  shift = 20;
	  break;
	case 'g':
	  shift = 30;
	  break;
	default:
	  goto invalid;
	}
      ++end;
      while (isspace ((unsigned char) *end))
	++end;
      if (*end != '\0')
	goto invalid;
    }

  if (((value << shift) >> shift) != value)
    goto invalid;

  *(unsigned long *) params[0] = value << shift;
  return true;

 invalid:
  print_env_var_error (env, val);
  return false;
}

/* Parse the GOMP_SPINCOUNT environment varible.  Return true if one was
   present and it was successfully parsed.  */

static bool
parse_spincount (const char *name, unsigned long long *pvalue)
{
  char *env, *end;
  unsigned long long value, mult = 1;

  env = getenv (name);
  if (env == NULL)
    return false;

  while (isspace ((unsigned char) *env))
    ++env;
  if (*env == '\0')
    goto invalid;

  if (strncasecmp (env, "infinite", 8) == 0
      || strncasecmp (env, "infinity", 8) == 0)
    {
      value = ~0ULL;
      end = env + 8;
      goto check_tail;
    }

  errno = 0;
  value = strtoull (env, &end, 10);
  if (errno || end == env)
    goto invalid;

  while (isspace ((unsigned char) *end))
    ++end;
  if (*end != '\0')
    {
      switch (tolower ((unsigned char) *end))
	{
	case 'k':
	  mult = 1000LL;
	  break;
	case 'm':
	  mult = 1000LL * 1000LL;
	  break;
	case 'g':
	  mult = 1000LL * 1000LL * 1000LL;
	  break;
	case 't':
	  mult = 1000LL * 1000LL * 1000LL * 1000LL;
	  break;
	default:
	  goto invalid;
	}
      ++end;
     check_tail:
      while (isspace ((unsigned char) *end))
	++end;
      if (*end != '\0')
	goto invalid;
    }

  if (value > ~0ULL / mult)
    value = ~0ULL;
  else
    value *= mult;

  *pvalue = value;
  return true;

 invalid:
  gomp_error ("Invalid value for environment variable %s", name);
  return false;
}

/* Parse a boolean value for environment variable NAME and store the
   result in VALUE.  Return true if one was present and it was
   successfully parsed.  */
static bool
parse_boolean (const char *env, const char *val, void *const params[])
{
  bool *value = (bool *) params[0];

  if (val == NULL)
    return false;

  while (isspace ((unsigned char) *val))
    ++val;
  if (strncasecmp (val, "true", 4) == 0)
    {
      *value = true;
      val += 4;
    }
  else if (strncasecmp (val, "false", 5) == 0)
    {
      *value = false;
      val += 5;
    }
  else
    val = "X";
  while (isspace ((unsigned char) *val))
    ++val;
  if (*val != '\0')
    {
      print_env_var_error (env, val);
      return false;
    }
  return true;
}

/* Parse the OMP_WAIT_POLICY environment variable and return the value.  */

static bool
parse_wait_policy (const char *env, const char *val, void *const params[])
{
  int *pvalue = (int *) params[0];
  int ret = -1;

  if (val == NULL)
  {
    *pvalue = -1;
    return false;
  }

  while (isspace ((unsigned char) *val))
    ++val;
  if (strncasecmp (val, "active", 6) == 0)
    {
      ret = 1;
      val += 6;
    }
  else if (strncasecmp (val, "passive", 7) == 0)
    {
      ret = 0;
      val += 7;
    }
  else
    val = "X";
  while (isspace ((unsigned char) *val))
    ++val;
  if (*val == '\0')
    {
      *pvalue = ret;
      return true;
    }
  print_env_var_error (env, val);
  *pvalue = -1;
  return false;
}

/* Parse the GOMP_CPU_AFFINITY environment varible.  Return true if one was
   present and it was successfully parsed.  */

static bool
parse_affinity (bool ignore)
{
  char *env, *end, *start;
  int pass;
  unsigned long cpu_beg, cpu_end, cpu_stride;
  size_t count = 0, needed;

  env = getenv ("GOMP_CPU_AFFINITY");
  if (env == NULL)
    return false;

  start = env;
  for (pass = 0; pass < 2; pass++)
    {
      env = start;
      if (pass == 1)
	{
	  if (ignore)
	    return false;

	  gomp_places_list_len = 0;
	  gomp_places_list = gomp_affinity_alloc (count, true);
	  if (gomp_places_list == NULL)
	    return false;
	}
      do
	{
	  while (isspace ((unsigned char) *env))
	    ++env;

	  errno = 0;
	  cpu_beg = strtoul (env, &end, 0);
	  if (errno || end == env || cpu_beg >= 65536)
	    goto invalid;
	  cpu_end = cpu_beg;
	  cpu_stride = 1;

	  env = end;
	  if (*env == '-')
	    {
	      errno = 0;
	      cpu_end = strtoul (++env, &end, 0);
	      if (errno || end == env || cpu_end >= 65536 || cpu_end < cpu_beg)
		goto invalid;

	      env = end;
	      if (*env == ':')
		{
		  errno = 0;
		  cpu_stride = strtoul (++env, &end, 0);
		  if (errno || cpu_stride == 0 || cpu_stride >= 65536)
		    goto invalid;

		  env = end;
		}
	    }

	  needed = (cpu_end - cpu_beg) / cpu_stride + 1;
	  if (pass == 0)
	    count += needed;
	  else
	    {
	      while (needed--)
		{
		  void *p = gomp_places_list[gomp_places_list_len];
		  gomp_affinity_init_place (p);
		  if (gomp_affinity_add_cpus (p, cpu_beg, 1, 0, true))
		    ++gomp_places_list_len;
		  cpu_beg += cpu_stride;
		}
	    }

	  while (isspace ((unsigned char) *env))
	    ++env;

	  if (*env == ',')
	    env++;
	  else if (*env == '\0')
	    break;
	}
      while (1);
    }

  if (gomp_places_list_len == 0)
    {
      free (gomp_places_list);
      gomp_places_list = NULL;
      return false;
    }
  return true;

 invalid:
  gomp_error ("Invalid value for enviroment variable GOMP_CPU_AFFINITY");
  return false;
}

/* Parse the OMP_ALLOCATOR environment variable and return the value.  */
static bool
parse_allocator (const char *env, const char *val, void *const params[])
{
  uintptr_t *ret = (uintptr_t *) params[0];
  *ret = omp_default_mem_alloc;

  if (val == NULL)
    return false;

  while (isspace ((unsigned char) *val))
    ++val;
  if (0)
    ;
#define C(v) \
  else if (strncasecmp (val, #v, sizeof (#v) - 1) == 0)	\
    {							\
      *ret = v;						\
      val += sizeof (#v) - 1;				\
    }
  C (omp_default_mem_alloc)
  C (omp_large_cap_mem_alloc)
  C (omp_const_mem_alloc)
  C (omp_high_bw_mem_alloc)
  C (omp_low_lat_mem_alloc)
  C (omp_cgroup_mem_alloc)
  C (omp_pteam_mem_alloc)
  C (omp_thread_mem_alloc)
#undef C
  else
    val = "X";
  while (isspace ((unsigned char) *val))
    ++val;
  if (*val == '\0')
    return true;
  print_env_var_error (env, val);
  *ret = omp_default_mem_alloc;
  return false;
}

static void
parse_acc_device_type (void)
{
  const char *env = getenv ("ACC_DEVICE_TYPE");

  if (env && *env != '\0')
    goacc_device_type = strdup (env);
  else
    goacc_device_type = NULL;
}

static void
parse_gomp_openacc_dim (void)
{
  /* The syntax is the same as for the -fopenacc-dim compilation option.  */
  const char *var_name = "GOMP_OPENACC_DIM";
  const char *env_var = getenv (var_name);
  const char *pos = env_var;
  int i;

  if (!env_var)
    return;

  for (i = 0; *pos && i != GOMP_DIM_MAX; i++)
    {
      char *eptr;
      long val;

      if (i && *pos++ != ':')
	break;

      if (*pos == ':')
	continue;

      errno = 0;
      val = strtol (pos, &eptr, 10);
      if (errno || eptr == pos || val < 0 || (unsigned)val != val)
	break;

      goacc_default_dims[i] = (int)val;
      pos = (const char *) eptr;
    }
}

/* Helper function for omp_display_env which prints the values of run_sched_var.
   'device' can be 'host', 'dev', 'all' or a particular device number.  */

static void
print_schedule (enum gomp_schedule_type run_sched_var, int run_sched_chunk_size,
		const char *device)
{
  fprintf (stderr, "  [%s] OMP_SCHEDULE = '", device);
  if ((run_sched_var & GFS_MONOTONIC))
    {
      if (run_sched_var != (GFS_MONOTONIC | GFS_STATIC))
	fputs ("MONOTONIC:", stderr);
    }
  else if (run_sched_var == GFS_STATIC)
    fputs ("NONMONOTONIC:", stderr);
  switch (run_sched_var & ~GFS_MONOTONIC)
    {
    case GFS_RUNTIME:
      fputs ("RUNTIME", stderr);
      if (run_sched_chunk_size != 1)
	fprintf (stderr, ",%d", run_sched_chunk_size);
      break;
    case GFS_STATIC:
      fputs ("STATIC", stderr);
      if (run_sched_chunk_size != 0)
	fprintf (stderr, ",%d", run_sched_chunk_size);
      break;
    case GFS_DYNAMIC:
      fputs ("DYNAMIC", stderr);
      if (run_sched_chunk_size != 1)
	fprintf (stderr, ",%d", run_sched_chunk_size);
      break;
    case GFS_GUIDED:
      fputs ("GUIDED", stderr);
      if (run_sched_chunk_size != 1)
	fprintf (stderr, ",%d", run_sched_chunk_size);
      break;
    case GFS_AUTO:
      fputs ("AUTO", stderr);
      break;
    }
  fputs ("'\n", stderr);
}

/* Helper function for omp_display_env which prints the values of proc_bind_var.
   'device' can be 'host', 'dev', 'all', or a particular device number.  */

static void
print_proc_bind (char proc_bind_var, unsigned long len, char **list,
		 const char *device)
{
  fprintf (stderr, "  [%s] OMP_PROC_BIND = '", device);
  switch (proc_bind_var)
    {
    case omp_proc_bind_false:
      fputs ("FALSE", stderr);
      break;
    case omp_proc_bind_true:
      fputs ("TRUE", stderr);
      break;
    case omp_proc_bind_master:
      fputs ("MASTER", stderr); /* TODO: Change to PRIMARY for OpenMP 5.1.  */
      break;
    case omp_proc_bind_close:
      fputs ("CLOSE", stderr);
      break;
    case omp_proc_bind_spread:
      fputs ("SPREAD", stderr);
      break;
    }
  for (int i = 1; i < len; i++)
    switch ((*list)[i])
      {
      case omp_proc_bind_master:
	fputs (",MASTER", stderr); /* TODO: Change to PRIMARY for OpenMP 5.1. */
	break;
      case omp_proc_bind_close:
	fputs (",CLOSE", stderr);
	break;
      case omp_proc_bind_spread:
	fputs (",SPREAD", stderr);
	break;
      }
  fputs ("'\n", stderr);
}

enum gomp_parse_type
{
  PARSE_INT = 1,
  PARSE_BOOL = 2,
  PARSE_UINT = 3,
  PARSE_ULONG = 4,
  PARSE_UCHAR = 5,
  PARSE_SCHEDULE =6,
  PARSE_BIND = 7
};

/* The following table contains items that help parsing environment variables
   and fill corresponding ICVs with values.  FLAG_VARS contain all ICVS which
   are affected by the environment variable.  FLAGS determine what variant of
   environment variable is allowed.  */

#define ENTRY(NAME) NAME, sizeof (NAME) - 1
static const struct envvar
{
  const char *name;
  int name_len;
  uint8_t flag_vars[3];
  uint8_t flag;
  bool (*parse_func) (const char *, const char *, void *const[]);
} envvars[] = {
  { ENTRY ("SCHEDULE"),
    { GOMP_ICV_SCHEDULE, GOMP_ICV_SCHEDULE_CHUNK_SIZE },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_schedule },
  { ENTRY ("NUM_TEAMS"),
    { GOMP_ICV_NTEAMS },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_int },
  { ENTRY ("DYNAMIC"),
    { GOMP_ICV_DYNAMIC },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_boolean },
  { ENTRY ("TEAMS_THREAD_LIMIT"),
    { GOMP_ICV_TEAMS_THREAD_LIMIT },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_int },
  { ENTRY ("THREAD_LIMIT"),
    { GOMP_ICV_THREAD_LIMIT },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_unsigned_long },
  { ENTRY ("NUM_THREADS"),
    { GOMP_ICV_NTHREADS, GOMP_ICV_NTHREADS_LIST, GOMP_ICV_NTHREADS_LIST_LEN },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_unsigned_long_list },
  { ENTRY ("PROC_BIND"),
    { GOMP_ICV_BIND, GOMP_ICV_BIND_LIST, GOMP_ICV_BIND_LIST_LEN },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_bind_var },
  { ENTRY ("MAX_ACTIVE_LEVELS"),
    { GOMP_ICV_MAX_ACTIVE_LEVELS },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_unsigned_long },
  { ENTRY ("WAIT_POLICY"),
    { GOMP_ICV_WAIT_POLICY },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_wait_policy },
  { ENTRY ("STACKSIZE"),
    { GOMP_ICV_STACKSIZE },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_stacksize },
  { ENTRY ("CANCELLATION"), { GOMP_ICV_CANCELLATION }, 0, &parse_boolean },
  { ENTRY ("DISPLAY_AFFINITY"), { GOMP_ICV_DISPLAY_AFFINITY }, 0,
    &parse_boolean },
  { ENTRY ("TARGET_OFFLOAD"), { GOMP_ICV_TARGET_OFFLOAD }, 0,
    &parse_target_offload },
  { ENTRY ("MAX_TASK_PRIORITY"), { GOMP_ICV_MAX_TASK_PRIORITY }, 0,
    &parse_int },
  { ENTRY ("ALLOCATOR"), { GOMP_ICV_ALLOCATOR }, 0, &parse_allocator },
  { ENTRY ("DEFAULT_DEVICE"), { GOMP_ICV_DEFAULT_DEVICE },
    GOMP_ENV_SUFFIX_DEV | GOMP_ENV_SUFFIX_ALL | GOMP_ENV_SUFFIX_DEV_X,
    &parse_int }
};
#undef ENTRY
#define OMP_VAR_CNT (sizeof (envvars) / sizeof (envvars[0]))

/* The following table is used to apply the hierarchy of ICV variants for host
   variables, e.g. nteams_var is set to OMP_NUM_TEAMS_ALL if OMP_NUM_TEAMS is
   undefined.  */

static const struct host_envvar
{
  unsigned char flag_var;
  void *dest[3];
  int type_code;
} host_envvars[] = {
  { GOMP_ICV_NTEAMS, { &gomp_nteams_var }, PARSE_INT },
  { GOMP_ICV_DYNAMIC, { &gomp_global_icv.dyn_var }, PARSE_BOOL },
  { GOMP_ICV_DEFAULT_DEVICE, { &gomp_global_icv.default_device_var },
    PARSE_INT },
  { GOMP_ICV_TEAMS_THREAD_LIMIT, { &gomp_teams_thread_limit_var }, PARSE_INT },
  { GOMP_ICV_SCHEDULE,
    { &gomp_global_icv.run_sched_var, &gomp_global_icv.run_sched_chunk_size },
    PARSE_SCHEDULE },
  { GOMP_ICV_THREAD_LIMIT, { &gomp_global_icv.thread_limit_var }, PARSE_UINT },
  { GOMP_ICV_NTHREADS,
    { &gomp_global_icv.nthreads_var, &gomp_nthreads_var_list,
      &gomp_nthreads_var_list_len }, PARSE_ULONG },
  { GOMP_ICV_BIND,
    { &gomp_global_icv.bind_var, &gomp_bind_var_list, &gomp_bind_var_list_len },
    PARSE_BIND },
  { GOMP_ICV_MAX_ACTIVE_LEVELS, { &gomp_global_icv.max_active_levels_var },
    PARSE_UCHAR },
};
#define OMP_HOST_VAR_CNT (sizeof (host_envvars) / sizeof (host_envvars[0]))

#define INT_MAX_STR_LEN 10

bool
gomp_get_icv_flag (uint32_t value, enum gomp_icvs icv)
{
  return value & (1 << (icv - 1));
}

static void
gomp_set_icv_flag (uint32_t *value, enum gomp_icvs icv)
{
  *value |= 1 << (icv - 1);
}

static void
print_device_specific_icvs (int icv_code)
{
  struct gomp_icv_list *list = gomp_initial_icv_list;
  int i;
  char dev_num[INT_MAX_STR_LEN + 1];

  while (list != NULL)
    {
      if (list->device_num < 0)
	{
	  list = list->next;
	  continue;
	}

      switch (icv_code)
	{
	case GOMP_ICV_NTEAMS:
	  if (gomp_get_icv_flag (list->flags, GOMP_ICV_NTEAMS))
	    fprintf (stderr, "  [%d] OMP_NUM_TEAMS = '%d'\n",
		     list->device_num, list->icvs.nteams_var);
	  break;
	case GOMP_ICV_DYNAMIC:
	  if (gomp_get_icv_flag (list->flags, GOMP_ICV_DYNAMIC))
	    fprintf (stderr, "  [%d] OMP_DYNAMIC = '%s'\n",
		     list->device_num, list->icvs.dyn_var ? "TRUE" : "FALSE");
	  break;
	case GOMP_ICV_TEAMS_THREAD_LIMIT:
	  if (gomp_get_icv_flag (list->flags, GOMP_ICV_TEAMS_THREAD_LIMIT))
	    fprintf (stderr, "  [%d] OMP_TEAMS_THREAD_LIMIT = '%u'\n",
		     list->device_num, list->icvs.teams_thread_limit_var);
	  break;
	case GOMP_ICV_SCHEDULE:
	  if (!(gomp_get_icv_flag (list->flags, GOMP_ICV_SCHEDULE)))
	    break;
	  sprintf (dev_num, "%d", list->device_num);
	  print_schedule (list->icvs.run_sched_var,
			  list->icvs.run_sched_chunk_size,
			  dev_num);
	  break;
	case GOMP_ICV_THREAD_LIMIT:
	  if (gomp_get_icv_flag (list->flags, GOMP_ICV_THREAD_LIMIT))
	    fprintf (stderr, "  [%d] OMP_THREAD_LIMIT = '%d'\n",
		     list->device_num, list->icvs.thread_limit_var);
	  break;
	case GOMP_ICV_NTHREADS:
	  if (!(gomp_get_icv_flag (list->flags, GOMP_ICV_NTHREADS)))
	    break;
	  fprintf (stderr, "  [%d] OMP_NUM_THREADS = '%lu", list->device_num,
		   list->icvs.nthreads_var);
	  for (i = 1; i < list->icvs.nthreads_var_list_len; i++)
	    fprintf (stderr, ",%lu", list->icvs.nthreads_var_list[i]);
	  fputs ("'\n", stderr);
	  break;
	case GOMP_ICV_MAX_ACTIVE_LEVELS:
	  fprintf (stderr, "  [%d] OMP_MAX_ACTIVE_LEVELS = '%u'\n",
		   list->device_num, list->icvs.max_active_levels_var);
	  break;
	case GOMP_ICV_BIND:
	  if (!(gomp_get_icv_flag (list->flags, GOMP_ICV_BIND)))
	    break;
	  sprintf (dev_num, "%d", list->device_num);
	  print_proc_bind (list->icvs.bind_var, list->icvs.bind_var_list_len,
			   &list->icvs.bind_var_list, dev_num);
	  break;
	case GOMP_ICV_WAIT_POLICY:
	  if (gomp_get_icv_flag (list->flags, GOMP_ICV_WAIT_POLICY))
	    fprintf (stderr, "  [%d] OMP_WAIT_POLICY = '%s'\n",
		     list->device_num,
		     list->icvs.wait_policy > 0 ? "ACTIVE" : "PASSIVE");
	  break;
	case GOMP_ICV_STACKSIZE:
	  if (gomp_get_icv_flag (list->flags, GOMP_ICV_STACKSIZE))
	    fprintf (stderr, "  [%d] OMP_STACKSIZE = '%lu'\n",
		     list->device_num, list->icvs.stacksize);
	  break;
	}
      list = list->next;
    }
}

void
omp_display_env (int verbose)
{
  int i;
  struct gomp_icv_list *dev
    = gomp_get_initial_icv_item (GOMP_DEVICE_NUM_FOR_DEV);
  struct gomp_icv_list *all
    = gomp_get_initial_icv_item (GOMP_DEVICE_NUM_FOR_ALL);
  struct gomp_icv_list *none
    = gomp_get_initial_icv_item (GOMP_DEVICE_NUM_FOR_NO_SUFFIX);

  fputs ("\nOPENMP DISPLAY ENVIRONMENT BEGIN\n", stderr);

  fputs ("  _OPENMP = '201511'\n", stderr);

  fprintf (stderr, "  [host] OMP_DYNAMIC = '%s'\n",
	   none->icvs.dyn_var ? "TRUE" : "FALSE");
  if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_DYNAMIC))
    fprintf (stderr, "  [all] OMP_DYNAMIC = '%s'\n",
	     all->icvs.dyn_var ? "TRUE" : "FALSE");
  if (dev != NULL && gomp_get_icv_flag (dev->flags, GOMP_ICV_DYNAMIC))
    fprintf (stderr, "  [device] OMP_DYNAMIC = '%s'\n",
	     dev->icvs.dyn_var ? "TRUE" : "FALSE");
  print_device_specific_icvs (GOMP_ICV_DYNAMIC);

  /* The OMP_NESTED environment variable has been deprecated.  */
  fprintf (stderr, "  [host] OMP_NESTED = '%s'\n",
	   none->icvs.max_active_levels_var > 1 ? "TRUE" : "FALSE");

  fprintf (stderr, "  [host] OMP_NUM_THREADS = '%lu",
	   none->icvs.nthreads_var);
  for (i = 1; i < none->icvs.nthreads_var_list_len; i++)
    fprintf (stderr, ",%lu", none->icvs.nthreads_var_list[i]);
  fputs ("'\n", stderr);
  if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_NTHREADS))
    {
      fprintf (stderr, "  [all] OMP_NUM_THREADS = '%lu",
	       all->icvs.nthreads_var);
      for (i = 1; i < all->icvs.nthreads_var_list_len; i++)
	fprintf (stderr, ",%lu", all->icvs.nthreads_var_list[i]);
      fputs ("'\n", stderr);
    }
  if (dev != NULL && gomp_get_icv_flag (dev->flags, GOMP_ICV_NTHREADS))
    {
      fprintf (stderr, "  [device] OMP_NUM_THREADS = '%lu",
	       dev->icvs.nthreads_var);
      for (i = 1; i < dev->icvs.nthreads_var_list_len; i++)
	fprintf (stderr, ",%lu", dev->icvs.nthreads_var_list[i]);
      fputs ("'\n", stderr);
    }
  print_device_specific_icvs (GOMP_ICV_NTHREADS);


  print_schedule (none->icvs.run_sched_var,
		  none->icvs.run_sched_chunk_size, "host");
  if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_SCHEDULE))
    print_schedule (all->icvs.run_sched_var,
		    all->icvs.run_sched_chunk_size, "all");
  if (dev != NULL && gomp_get_icv_flag (dev->flags, GOMP_ICV_SCHEDULE))
    print_schedule (dev->icvs.run_sched_var,
		    dev->icvs.run_sched_chunk_size, "device");
  print_device_specific_icvs (GOMP_ICV_SCHEDULE);

  print_proc_bind (none->icvs.bind_var,
		   none->icvs.bind_var_list_len,
		   &none->icvs.bind_var_list, "host");
  if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_BIND))
    print_proc_bind (all->icvs.bind_var,
		     all->icvs.bind_var_list_len,
		     &all->icvs.bind_var_list, "all");
  if (dev != NULL && gomp_get_icv_flag (dev->flags, GOMP_ICV_BIND))
    print_proc_bind (dev->icvs.bind_var,
		     dev->icvs.bind_var_list_len,
		     &dev->icvs.bind_var_list, "device");
  print_device_specific_icvs (GOMP_ICV_BIND);

  fputs ("  [host] OMP_PLACES = '", stderr);
  for (i = 0; i < gomp_places_list_len; i++)
    {
      fputs ("{", stderr);
      gomp_affinity_print_place (gomp_places_list[i]);
      fputs (i + 1 == gomp_places_list_len ? "}" : "},", stderr);
    }
  fputs ("'\n", stderr);

  fprintf (stderr, "  [host] OMP_STACKSIZE = '%lu'\n",
	   none->icvs.stacksize);
  if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_STACKSIZE))
    fprintf (stderr, "  [all] OMP_STACKSIZE = '%lu'\n",
	     all->icvs.stacksize);
  if (dev != NULL && gomp_get_icv_flag (dev->flags, GOMP_ICV_STACKSIZE))
    fprintf (stderr, "  [device] OMP_STACKSIZE = '%lu'\n",
	     dev->icvs.stacksize);
  print_device_specific_icvs (GOMP_ICV_STACKSIZE);

  /* GOMP's default value is actually neither active nor passive.  */
  fprintf (stderr, "  [host] OMP_WAIT_POLICY = '%s'\n",
	   none->icvs.wait_policy > 0 ? "ACTIVE" : "PASSIVE");
  if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_WAIT_POLICY))
    fprintf (stderr, "  [all] OMP_WAIT_POLICY = '%s'\n",
	     all->icvs.wait_policy > 0 ? "ACTIVE" : "PASSIVE");
  if (dev != NULL && gomp_get_icv_flag (dev->flags, GOMP_ICV_WAIT_POLICY))
    fprintf (stderr, "  [device] OMP_WAIT_POLICY = '%s'\n",
	     dev->icvs.wait_policy > 0 ? "ACTIVE" : "PASSIVE");
  print_device_specific_icvs (GOMP_ICV_WAIT_POLICY);

  fprintf (stderr, "  [host] OMP_THREAD_LIMIT = '%u'\n",
	   none->icvs.thread_limit_var);
  if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_THREAD_LIMIT))
    fprintf (stderr, "  [all] OMP_THREAD_LIMIT = '%d'\n",
	     all->icvs.thread_limit_var);
  if (dev != NULL && gomp_get_icv_flag (dev->flags, GOMP_ICV_THREAD_LIMIT))
    fprintf (stderr, "  [device] OMP_THREAD_LIMIT = '%d'\n",
	     dev->icvs.thread_limit_var);
  print_device_specific_icvs (GOMP_ICV_THREAD_LIMIT);

  fprintf (stderr, "  [host] OMP_MAX_ACTIVE_LEVELS = '%u'\n",
	   none->icvs.max_active_levels_var);
  if (all != NULL && gomp_get_icv_flag (all->flags,
			 GOMP_ICV_MAX_ACTIVE_LEVELS))
    fprintf (stderr, "  [all] OMP_MAX_ACTIVE_LEVELS = '%u'\n",
	     all->icvs.max_active_levels_var);
  if (dev != NULL && gomp_get_icv_flag (dev->flags,
			 GOMP_ICV_MAX_ACTIVE_LEVELS))
    fprintf (stderr, "  [device] OMP_MAX_ACTIVE_LEVELS = '%u'\n",
	     dev->icvs.max_active_levels_var);
  print_device_specific_icvs (GOMP_ICV_MAX_ACTIVE_LEVELS);


  fprintf (stderr, "  [host] OMP_NUM_TEAMS = '%d'\n",
	   none->icvs.nteams_var);
  if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_NTEAMS))
    fprintf (stderr, "  [all] OMP_NUM_TEAMS = '%d'\n",
	     all->icvs.nteams_var);
  if (dev != NULL && gomp_get_icv_flag (dev->flags, GOMP_ICV_NTEAMS))
    fprintf (stderr, "  [device] OMP_NUM_TEAMS = '%d'\n",
	     dev->icvs.nteams_var);
  print_device_specific_icvs (GOMP_ICV_NTEAMS);

  fprintf (stderr, "  [host] OMP_TEAMS_THREAD_LIMIT = '%u'\n",
	   none->icvs.teams_thread_limit_var);
  if (all != NULL && gomp_get_icv_flag (all->flags,
			 GOMP_ICV_TEAMS_THREAD_LIMIT))
    fprintf (stderr, "  [all] OMP_TEAMS_THREAD_LIMIT = '%u'\n",
	     all->icvs.teams_thread_limit_var);
  if (dev != NULL && gomp_get_icv_flag (dev->flags,
			 GOMP_ICV_TEAMS_THREAD_LIMIT))
    fprintf (stderr, "  [device] OMP_TEAMS_THREAD_LIMIT = '%u'\n",
	     dev->icvs.teams_thread_limit_var);
  print_device_specific_icvs (GOMP_ICV_TEAMS_THREAD_LIMIT);

  fprintf (stderr, "  [all] OMP_CANCELLATION = '%s'\n",
	   gomp_cancel_var ? "TRUE" : "FALSE");

  fprintf (stderr, "  [all] OMP_DEFAULT_DEVICE = '%d'\n",
	   none->icvs.default_device_var);

  fprintf (stderr, "  [all] OMP_MAX_TASK_PRIORITY = '%d'\n",
	   gomp_max_task_priority_var);
  fprintf (stderr, "  [all] OMP_DISPLAY_AFFINITY = '%s'\n",
	   gomp_display_affinity_var ? "TRUE" : "FALSE");
  fprintf (stderr, "  [host] OMP_AFFINITY_FORMAT = '%s'\n",
	   gomp_affinity_format_var);
  fprintf (stderr, "  [host] OMP_ALLOCATOR = '");
  switch (gomp_def_allocator)
    {
#define C(v) case v: fputs (#v, stderr); break;
    C (omp_default_mem_alloc)
    C (omp_large_cap_mem_alloc)
    C (omp_const_mem_alloc)
    C (omp_high_bw_mem_alloc)
    C (omp_low_lat_mem_alloc)
    C (omp_cgroup_mem_alloc)
    C (omp_pteam_mem_alloc)
    C (omp_thread_mem_alloc)
#undef C
    default: break;
    }
  fputs ("'\n", stderr);

  fputs ("  [all] OMP_TARGET_OFFLOAD = '", stderr);
  switch (gomp_target_offload_var)
    {
    case GOMP_TARGET_OFFLOAD_DEFAULT:
      fputs ("DEFAULT", stderr);
      break;
    case GOMP_TARGET_OFFLOAD_MANDATORY:
      fputs ("MANDATORY", stderr);
      break;
    case GOMP_TARGET_OFFLOAD_DISABLED:
      fputs ("DISABLED", stderr);
      break;
    }
  fputs ("'\n", stderr);

  if (verbose)
    {
      fputs ("  [host] GOMP_CPU_AFFINITY = ''\n", stderr);
      fprintf (stderr, "  [host] GOMP_STACKSIZE = '%lu'\n", stacksize);
#ifdef HAVE_INTTYPES_H
      fprintf (stderr, "  [host] GOMP_SPINCOUNT = '%"PRIu64"'\n",
	       (uint64_t) gomp_spin_count_var);
#else
      fprintf (stderr, "  [host] GOMP_SPINCOUNT = '%lu'\n",
	       (unsigned long) gomp_spin_count_var);
#endif
    }

  fputs ("OPENMP DISPLAY ENVIRONMENT END\n", stderr);
}
ialias (omp_display_env)

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)
    ialias_call (omp_display_env) (verbose);
}

/* Helper function for initialize_env.  Extracts the device number from
   an environment variable name.  ENV is the complete environment variable.
   DEV_NUM_PTR points to the start of the device number in the environment
   variable string.  DEV_NUM_LEN is the returned length of the device num
   string.  */

static bool
get_device_num (char *env, char *dev_num_ptr, int *dev_num, int *dev_num_len)
{
  char *end;
  unsigned long val = strtoul (dev_num_ptr, &end, 10);
  if (val > INT_MAX
      || *end != '='
      || (dev_num_ptr[0] == '0' && end != dev_num_ptr + 1)
      || (dev_num_ptr[0] < '0' || dev_num_ptr[0] > '9'))
    {
      gomp_error ("Invalid device number in %s", env);
      return false;
    }
  *dev_num = val;
  *dev_num_len = end - dev_num_ptr;
  return true;
}

static void
get_icv_member_addr (struct gomp_initial_icvs *icvs, int icv_code,
		     void *icv_addr[3])
{
  if (icv_code == 0 || icv_addr == NULL)
    return;

  icv_addr[0] = icv_addr[1] = icv_addr[2] = NULL;

  switch (icv_code)
    {
    case GOMP_ICV_NTEAMS:
      icv_addr[0] = &icvs->nteams_var;
      /* icv_addr[1] = (void *) false; */
      break;
    case GOMP_ICV_DYNAMIC:
      icv_addr[0] = &(*icvs).dyn_var;
      break;
    case GOMP_ICV_TEAMS_THREAD_LIMIT:
      icv_addr[0] = &icvs->teams_thread_limit_var;
      /* icv_addr[1] = (void *) false; */
      break;
    case GOMP_ICV_SCHEDULE:
      icv_addr[0] = &icvs->run_sched_var;
      icv_addr[1] = &icvs->run_sched_chunk_size;
      break;
    case GOMP_ICV_THREAD_LIMIT:
      icv_addr[0] = &icvs->thread_limit_var;
      /* icv_addr[1] = (void *) false; */
      icv_addr[2] = (void *) UINT_MAX;
      break;
    case GOMP_ICV_NTHREADS:
      icv_addr[0] = &icvs->nthreads_var;
      icv_addr[1] = &icvs->nthreads_var_list;
      icv_addr[2] = &icvs->nthreads_var_list_len;
      break;
    case GOMP_ICV_MAX_ACTIVE_LEVELS:
      icv_addr[0] = &icvs->max_active_levels_var;
      icv_addr[1] = (void *) true;
      icv_addr[2] = (void *) gomp_supported_active_levels;
      break;
    case GOMP_ICV_BIND:
      icv_addr[0] = &icvs->bind_var;
      icv_addr[1] = &icvs->bind_var_list;
      icv_addr[2] = &icvs->bind_var_list_len;
      break;
    case GOMP_ICV_WAIT_POLICY:
      icv_addr[0] = &icvs->wait_policy;
      break;
    case GOMP_ICV_STACKSIZE:
      icv_addr[0] = &icvs->stacksize;
      break;
    case GOMP_ICV_CANCELLATION:
      icv_addr[0] = &gomp_cancel_var;
      break;
    case GOMP_ICV_DISPLAY_AFFINITY:
      icv_addr[0] = &gomp_display_affinity_var;
      break;
    case GOMP_ICV_TARGET_OFFLOAD:
      icv_addr[0] = &gomp_target_offload_var;
      break;
    case GOMP_ICV_MAX_TASK_PRIORITY:
      icv_addr[0] = &gomp_max_task_priority_var;
      break;
    case GOMP_ICV_ALLOCATOR:
      icv_addr[0] = &gomp_def_allocator;
      break;
    case GOMP_ICV_DEFAULT_DEVICE:
      icv_addr[0] = &icvs->default_device_var;
      icv_addr[1] = (void *) true;
      break;
    }
}

struct gomp_icv_list *
gomp_get_initial_icv_item (int dev_num)
{
  struct gomp_icv_list *l = gomp_initial_icv_list;
  while (l != NULL && l->device_num != dev_num)
    l = l->next;

  return l;
}

static void
initialize_icvs (struct gomp_initial_icvs *icvs)
{
  icvs->nthreads_var_list = NULL;
  icvs->bind_var_list = NULL;
  icvs->nthreads_var = gomp_default_icv_values.nthreads_var;
  icvs->nthreads_var_list_len = 0;
  icvs->bind_var_list_len = 0;
  icvs->stacksize = 0;
  icvs->thread_limit_var = gomp_default_icv_values.thread_limit_var;
  icvs->run_sched_var = gomp_default_icv_values.run_sched_var;
  icvs->run_sched_chunk_size = gomp_default_icv_values.run_sched_chunk_size;
  icvs->default_device_var = gomp_default_icv_values.default_device_var;
  icvs->dyn_var = gomp_default_icv_values.dyn_var;
  icvs->max_active_levels_var = gomp_default_icv_values.max_active_levels_var;
  icvs->bind_var = gomp_default_icv_values.bind_var;
  icvs->nteams_var = gomp_default_icv_values.nteams_var;
  icvs->teams_thread_limit_var = gomp_default_icv_values.teams_thread_limit_var;
  icvs->wait_policy = 0;
}

/* Helper function for initialize_env to add a device specific ICV value
   to gomp_initial_icv_list.  */

static uint32_t *
add_initial_icv_to_list (int dev_num, int icv_code, void *icv_addr[3])
{
  struct gomp_icv_list *last = NULL, *l = gomp_initial_icv_list;
  while (l != NULL && l->device_num != dev_num)
    {
      last = l;
      l = l->next;
    }

  if (l == NULL)
    {
      l = ((struct gomp_icv_list *)
	   gomp_malloc_cleared (sizeof (struct gomp_icv_list)));
      l->device_num = dev_num;
      initialize_icvs (&l->icvs);
      if (dev_num < 0)
	{
	  l->next = gomp_initial_icv_list;
	  gomp_initial_icv_list = l;
	}
      else
	{
	  l->next = NULL;
	  if (last == NULL)
	    gomp_initial_icv_list = l;
	  else
	    last->next = l;
	}
    }

  get_icv_member_addr (&l->icvs, icv_code, icv_addr);

  return &l->flags;
}

/* Return true if STR string starts with PREFIX.  */

static inline bool
startswith (const char *str, const char *prefix)
{
  return strncmp (str, prefix, strlen (prefix)) == 0;
}

static void __attribute__((constructor))
initialize_env (void)
{
  char **env;
  int omp_var, dev_num = 0, dev_num_len = 0, i;
  bool ignore = false;
  char *env_val;
  void *params[3];
  uint32_t *flag_var_addr = NULL;
  unsigned pos;
  struct gomp_icv_list *all, *none;

  /* Do a compile time check that mkomp_h.pl did good job.  */
  omp_check_defines ();

#ifndef HAVE_SYNC_BUILTINS
  gomp_mutex_init (&gomp_managed_threads_lock);
#endif
  gomp_init_num_threads ();
  gomp_available_cpus = gomp_global_icv.nthreads_var;

  /* Initial values for host environment variables should always exist even if
     there is no explicitly set host environment variable.  Moreover, they are
     set to the initial global values.  */
  add_initial_icv_to_list (GOMP_DEVICE_NUM_FOR_NO_SUFFIX, 0, NULL);
  none = gomp_get_initial_icv_item (GOMP_DEVICE_NUM_FOR_NO_SUFFIX);
  initialize_icvs (&none->icvs);

  for (env = environ; *env != 0; env++)
    {
      if (!startswith (*env, "OMP_"))
	continue;

     /* Name of the environment variable without suffix "OMP_".  */
     char *name = *env + sizeof ("OMP_") - 1;
     for (omp_var = 0; omp_var < OMP_VAR_CNT; omp_var++)
	{
	  if (startswith (name, envvars[omp_var].name))
	    {
	      pos = envvars[omp_var].name_len;
	      if (name[pos] == '=')
		{
		  pos++;
		  flag_var_addr
		    = add_initial_icv_to_list (GOMP_DEVICE_NUM_FOR_NO_SUFFIX,
					       envvars[omp_var].flag_vars[0],
					       params);
		}
	      else if (startswith (&name[pos], "_DEV=")
		       && envvars[omp_var].flag & GOMP_ENV_SUFFIX_DEV)
		{
		  pos += 5;
		  flag_var_addr
		    = add_initial_icv_to_list (GOMP_DEVICE_NUM_FOR_DEV,
					       envvars[omp_var].flag_vars[0],
					       params);
		}
	      else if (startswith (&name[pos], "_ALL=")
		       && envvars[omp_var].flag & GOMP_ENV_SUFFIX_ALL)
		{
		  pos += 5;
		  flag_var_addr
		    = add_initial_icv_to_list (GOMP_DEVICE_NUM_FOR_ALL,
					       envvars[omp_var].flag_vars[0],
					       params);
		}
	      else if (startswith (&name[pos], "_DEV_")
		       && envvars[omp_var].flag & GOMP_ENV_SUFFIX_DEV_X)
		{
		  pos += 5;
		  if (!get_device_num (*env, &name[pos], &dev_num,
				       &dev_num_len))
		    break;

		  pos += dev_num_len + 1;
		  flag_var_addr
		    = add_initial_icv_to_list (dev_num,
					       envvars[omp_var].flag_vars[0],
					       params);
		}
	      else
		{
		  gomp_error ("Invalid environment variable in %s", *env);
		  break;
		}
	      env_val = &name[pos];

	      if (envvars[omp_var].parse_func (*env, env_val, params))
		{
		  for (i = 0; i < 3; ++i)
		    if (envvars[omp_var].flag_vars[i])
		      gomp_set_icv_flag (flag_var_addr,
					 envvars[omp_var].flag_vars[i]);
		    else
		      break;
		}

	      break;
	    }
	}
    }

    all = gomp_get_initial_icv_item (GOMP_DEVICE_NUM_FOR_ALL);
    for (omp_var = 0; omp_var < OMP_HOST_VAR_CNT; omp_var++)
      {
	if (none != NULL
	    && gomp_get_icv_flag (none->flags, host_envvars[omp_var].flag_var))
	  get_icv_member_addr (&none->icvs,
			       host_envvars[omp_var].flag_var, params);
	else if (all != NULL
		 && gomp_get_icv_flag (all->flags,
				       host_envvars[omp_var].flag_var))
	  get_icv_member_addr (&all->icvs, host_envvars[omp_var].flag_var,
			       params);
	else
	  continue;

	switch (host_envvars[omp_var].type_code)
	  {
	  case PARSE_INT:
	    for (i = 0; i < 3; ++i)
	      if (host_envvars[omp_var].dest[i] != NULL && params[i] != NULL)
		*(int *) (host_envvars[omp_var].dest[i]) = *(int *) params[i];
	    break;
	  case PARSE_BOOL:
	    for (i = 0; i < 3; ++i)
	      if (host_envvars[omp_var].dest[i] != NULL && params[i] != NULL)
		*(bool *) (host_envvars[omp_var].dest[i]) = *(bool *) params[i];
	    break;
	  case PARSE_UINT:
	    for (i = 0; i < 3; ++i)
	      if (host_envvars[omp_var].dest[i] != NULL && params[i] != NULL)
		*(unsigned int *) (host_envvars[omp_var].dest[i])
		  = *(unsigned int *) params[i];
	    break;
	  case PARSE_ULONG:
	    for (i = 0; i < 3; ++i)
	      if (host_envvars[omp_var].dest[i] != NULL && params[i] != NULL)
		*(unsigned long *) (host_envvars[omp_var].dest[i])
		  = *(unsigned long *) params[i];
	    break;
	  case PARSE_UCHAR:
	    for (i = 0; i < 3; ++i)
	      if (host_envvars[omp_var].dest[i] != NULL && params[i] != NULL)
		*(unsigned char *) (host_envvars[omp_var].dest[i])
		  = *(unsigned char *) params[i];
	    break;
	  case PARSE_SCHEDULE:
	    *(enum gomp_schedule_type *) (host_envvars[omp_var].dest[0])
	      = *(enum gomp_schedule_type *) params[0];
	    *(int *) (host_envvars[omp_var].dest[1]) = *(int *) params[1];
	    break;
	  case PARSE_BIND:
	    *(char *) (host_envvars[omp_var].dest[0]) = *(char *) params[0];
	    *(char **) (host_envvars[omp_var].dest[1]) = *(char **) params[1];
	    *(unsigned long *) (host_envvars[omp_var].dest[2])
	      = *(unsigned long *) params[2];
	    break;
	  }
      }

  if (((none != NULL && gomp_get_icv_flag (none->flags, GOMP_ICV_BIND))
       || (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_BIND)))
      && gomp_global_icv.bind_var == omp_proc_bind_false)
    ignore = true;

  if (!((none != NULL
	 && gomp_get_icv_flag (none->flags, GOMP_ICV_MAX_ACTIVE_LEVELS))
       || (all != NULL
	   && gomp_get_icv_flag (all->flags, GOMP_ICV_MAX_ACTIVE_LEVELS))))
    {
      bool nested = true;
      const char *env = getenv ("OMP_NESTED");

      /* OMP_NESTED is deprecated in OpenMP 5.0.  */
      if (parse_boolean ("OMP_NESTED", env, (void *[]) {&nested}))
	gomp_global_icv.max_active_levels_var
	  = nested ? gomp_supported_active_levels : 1;
      else if (gomp_nthreads_var_list_len > 1 || gomp_bind_var_list_len > 1)
	gomp_global_icv.max_active_levels_var = gomp_supported_active_levels;
    }

  /* Process GOMP_* variables and dependencies between parsed ICVs.  */
  parse_int_secure ("GOMP_DEBUG", &gomp_debug_var, true);

  /* Make sure OMP_PLACES and GOMP_CPU_AFFINITY env vars are always
     parsed if present in the environment.  If OMP_PROC_BIND was set
     explicitly to false, don't populate places list though.  If places
     list was successfully set from OMP_PLACES, only parse but don't process
     GOMP_CPU_AFFINITY.  If OMP_PROC_BIND was not set in the environment,
     default to OMP_PROC_BIND=true if OMP_PLACES or GOMP_CPU_AFFINITY
     was successfully parsed into a places list, otherwise to
     OMP_PROC_BIND=false.  */
  if (parse_places_var ("OMP_PLACES", ignore))
    {
      if (gomp_global_icv.bind_var == omp_proc_bind_false)
	gomp_global_icv.bind_var = true;
      ignore = true;
    }
  if (parse_affinity (ignore))
    {
      if (gomp_global_icv.bind_var == omp_proc_bind_false)
	gomp_global_icv.bind_var = true;
      ignore = true;
    }
  if (gomp_global_icv.bind_var != omp_proc_bind_false)
    gomp_init_affinity ();

  {
    const char *env = getenv ("OMP_AFFINITY_FORMAT");
    if (env != NULL)
      gomp_set_affinity_format (env, strlen (env));
  }

  if (none != NULL && gomp_get_icv_flag (none->flags, GOMP_ICV_WAIT_POLICY))
    wait_policy = none->icvs.wait_policy;
  else if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_WAIT_POLICY))
    wait_policy = all->icvs.wait_policy;

  if (!parse_spincount ("GOMP_SPINCOUNT", &gomp_spin_count_var))
    {
      /* Using a rough estimation of 100000 spins per msec,
	 use 5 min blocking for OMP_WAIT_POLICY=active,
	 3 msec blocking when OMP_WAIT_POLICY is not specificed
	 and 0 when OMP_WAIT_POLICY=passive.
	 Depending on the CPU speed, this can be e.g. 5 times longer
	 or 5 times shorter.  */
      if (wait_policy > 0)
	gomp_spin_count_var = 30000000000LL;
      else if (wait_policy < 0)
	gomp_spin_count_var = 300000LL;
    }
  /* gomp_throttled_spin_count_var is used when there are more libgomp
     managed threads than available CPUs.  Use very short spinning.  */
  if (wait_policy > 0)
    gomp_throttled_spin_count_var = 1000LL;
  else if (wait_policy < 0)
    gomp_throttled_spin_count_var = 100LL;
  if (gomp_throttled_spin_count_var > gomp_spin_count_var)
    gomp_throttled_spin_count_var = gomp_spin_count_var;

  /* Not strictly environment related, but ordering constructors is tricky.  */
  pthread_attr_init (&gomp_thread_attr);

  if (!(none != NULL && gomp_get_icv_flag (none->flags, GOMP_ICV_STACKSIZE)))
    {
      const char *env = getenv ("GOMP_STACKSIZE");
      if (env != NULL
	  && parse_stacksize ("GOMP_STACKSIZE", env,
			      (void *[3]) {&none->icvs.stacksize}))
	gomp_set_icv_flag (&none->flags, GOMP_ICV_STACKSIZE);
    }
  if (none != NULL && gomp_get_icv_flag (none->flags, GOMP_ICV_STACKSIZE))
    stacksize = none->icvs.stacksize;
  else if (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_STACKSIZE))
    stacksize = all->icvs.stacksize;

  if ((none != NULL && gomp_get_icv_flag (none->flags, GOMP_ICV_STACKSIZE))
      || (all != NULL && gomp_get_icv_flag (all->flags, GOMP_ICV_STACKSIZE))
      || GOMP_DEFAULT_STACKSIZE)
    {
      int err;

      err = pthread_attr_setstacksize (&gomp_thread_attr, stacksize);

#ifdef PTHREAD_STACK_MIN
      if (err == EINVAL)
	{
	  if (stacksize < PTHREAD_STACK_MIN)
	    gomp_error ("Stack size less than minimum of %luk",
			PTHREAD_STACK_MIN / 1024ul
			+ (PTHREAD_STACK_MIN % 1024 != 0));
	  else
	    gomp_error ("Stack size larger than system limit");
	}
      else
#endif
      if (err != 0)
	gomp_error ("Stack size change failed: %s", strerror (err));
    }

  handle_omp_display_env ();

  /* OpenACC.  */

  if (!parse_int ("ACC_DEVICE_NUM", getenv ("ACC_DEVICE_NUM"),
		  (void *[]) {&goacc_device_num, (void *) true}))
    goacc_device_num = 0;

  parse_acc_device_type ();
  parse_gomp_openacc_dim ();

  goacc_runtime_initialize ();

  goacc_profiling_initialize ();
}
#endif /* LIBGOMP_OFFLOADED_ONLY */
