/* 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 long upper = (uintptr_t) 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 */
