Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / libgomp / icv.c
1 /* Copyright (C) 2005-2018 Free Software Foundation, Inc.
2    Contributed by Richard Henderson <rth@redhat.com>.
3
4    This file is part of the GNU Offloading and Multi Processing Library
5    (libgomp).
6
7    Libgomp is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11
12    Libgomp is distributed in the hope that it will be useful, but WITHOUT ANY
13    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14    FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15    more details.
16
17    Under Section 7 of GPL version 3, you are granted additional
18    permissions described in the GCC Runtime Library Exception, version
19    3.1, as published by the Free Software Foundation.
20
21    You should have received a copy of the GNU General Public License and
22    a copy of the GCC Runtime Library Exception along with this program;
23    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24    <http://www.gnu.org/licenses/>.  */
25
26 /* This file defines the OpenMP API entry points that operate on internal
27    control variables.  */
28
29 #include "libgomp.h"
30 #include "gomp-constants.h"
31 #include <limits.h>
32
33 void
34 omp_set_num_threads (int n)
35 {
36   struct gomp_task_icv *icv = gomp_icv (true);
37   icv->nthreads_var = (n > 0 ? n : 1);
38 }
39
40 void
41 omp_set_dynamic (int val)
42 {
43   struct gomp_task_icv *icv = gomp_icv (true);
44   icv->dyn_var = val;
45 }
46
47 int
48 omp_get_dynamic (void)
49 {
50   struct gomp_task_icv *icv = gomp_icv (false);
51   return icv->dyn_var;
52 }
53
54 void
55 omp_set_nested (int val)
56 {
57   struct gomp_task_icv *icv = gomp_icv (true);
58   icv->nest_var = val;
59 }
60
61 int
62 omp_get_nested (void)
63 {
64   struct gomp_task_icv *icv = gomp_icv (false);
65   return icv->nest_var;
66 }
67
68 void
69 omp_set_schedule (omp_sched_t kind, int chunk_size)
70 {
71   struct gomp_task_icv *icv = gomp_icv (true);
72   switch (kind)
73     {
74     case omp_sched_static:
75       if (chunk_size < 1)
76         chunk_size = 0;
77       icv->run_sched_chunk_size = chunk_size;
78       break;
79     case omp_sched_dynamic:
80     case omp_sched_guided:
81       if (chunk_size < 1)
82         chunk_size = 1;
83       icv->run_sched_chunk_size = chunk_size;
84       break;
85     case omp_sched_auto:
86       break;
87     default:
88       return;
89     }
90   icv->run_sched_var = kind;
91 }
92
93 void
94 omp_get_schedule (omp_sched_t *kind, int *chunk_size)
95 {
96   struct gomp_task_icv *icv = gomp_icv (false);
97   *kind = icv->run_sched_var;
98   *chunk_size = icv->run_sched_chunk_size;
99 }
100
101 int
102 omp_get_max_threads (void)
103 {
104   struct gomp_task_icv *icv = gomp_icv (false);
105   return icv->nthreads_var;
106 }
107
108 int
109 omp_get_thread_limit (void)
110 {
111   struct gomp_task_icv *icv = gomp_icv (false);
112   return icv->thread_limit_var > INT_MAX ? INT_MAX : icv->thread_limit_var;
113 }
114
115 void
116 omp_set_max_active_levels (int max_levels)
117 {
118   if (max_levels >= 0)
119     gomp_max_active_levels_var = max_levels;
120 }
121
122 int
123 omp_get_max_active_levels (void)
124 {
125   return gomp_max_active_levels_var;
126 }
127
128 int
129 omp_get_cancellation (void)
130 {
131   return gomp_cancel_var;
132 }
133
134 int
135 omp_get_max_task_priority (void)
136 {
137   return gomp_max_task_priority_var;
138 }
139
140 omp_proc_bind_t
141 omp_get_proc_bind (void)
142 {
143   struct gomp_task_icv *icv = gomp_icv (false);
144   return icv->bind_var;
145 }
146
147 int
148 omp_get_initial_device (void)
149 {
150   return GOMP_DEVICE_HOST_FALLBACK;
151 }
152
153 int
154 omp_get_num_places (void)
155 {
156   return gomp_places_list_len;
157 }
158
159 int
160 omp_get_place_num (void)
161 {
162   if (gomp_places_list == NULL)
163     return -1;
164
165   struct gomp_thread *thr = gomp_thread ();
166   if (thr->place == 0)
167     gomp_init_affinity ();
168
169   return (int) thr->place - 1;
170 }
171
172 int
173 omp_get_partition_num_places (void)
174 {
175   if (gomp_places_list == NULL)
176     return 0;
177
178   struct gomp_thread *thr = gomp_thread ();
179   if (thr->place == 0)
180     gomp_init_affinity ();
181
182   return thr->ts.place_partition_len;
183 }
184
185 void
186 omp_get_partition_place_nums (int *place_nums)
187 {
188   if (gomp_places_list == NULL)
189     return;
190
191   struct gomp_thread *thr = gomp_thread ();
192   if (thr->place == 0)
193     gomp_init_affinity ();
194
195   unsigned int i;
196   for (i = 0; i < thr->ts.place_partition_len; i++)
197     *place_nums++ = thr->ts.place_partition_off + i;
198 }
199
200 ialias (omp_set_dynamic)
201 ialias (omp_set_nested)
202 ialias (omp_set_num_threads)
203 ialias (omp_get_dynamic)
204 ialias (omp_get_nested)
205 ialias (omp_set_schedule)
206 ialias (omp_get_schedule)
207 ialias (omp_get_max_threads)
208 ialias (omp_get_thread_limit)
209 ialias (omp_set_max_active_levels)
210 ialias (omp_get_max_active_levels)
211 ialias (omp_get_cancellation)
212 ialias (omp_get_proc_bind)
213 ialias (omp_get_initial_device)
214 ialias (omp_get_max_task_priority)
215 ialias (omp_get_num_places)
216 ialias (omp_get_place_num)
217 ialias (omp_get_partition_num_places)
218 ialias (omp_get_partition_place_nums)