blob: ca05ed50c1812d689500407093752b8023c5f0a4 [file] [log] [blame]
/* Copyright (C) The GNU Toolchain Authors.
Contributed by Mohamed Atef <mohamedatef1698@gmail.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 contains the source code of functions
declared in ompd-helper.h. */
#include "ompd-helper.h"
ompd_device_type_sizes_t target_sizes;
/* Get global ICVs. */
ompd_rc_t
gompd_get_cancellation (ompd_address_space_handle_t *ah,
ompd_word_t *cancel_var)
{
CHECK (ah);
ompd_word_t cancel = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_cancel_var", cancel, cancel,
target_sizes.sizeof_char, 1, ret, symbol_addr);
*cancel_var = cancel;
return ret;
}
ompd_rc_t
gompd_get_max_task_priority (ompd_address_space_handle_t *ah,
ompd_word_t *task_p)
{
CHECK (ah);
ompd_word_t task_priority = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_max_task_priority_var", task_priority,
task_priority, target_sizes.sizeof_int, 1, ret, symbol_addr);
*task_p = task_priority;
return ret;
}
ompd_rc_t
gompd_get_stacksize (ompd_address_space_handle_t *ah, ompd_word_t *stacksize)
{
CHECK (ah);
ompd_word_t stack_var = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "stacksize", stack_var, stack_var,
target_sizes.sizeof_long, 1, ret, symbol_addr);
*stacksize = stack_var;
return ret;
}
ompd_rc_t
gompd_get_debug (ompd_address_space_handle_t *ah, ompd_word_t *debug_var)
{
CHECK (ah);
ompd_word_t debug = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_debug_var", debug, debug,
target_sizes.sizeof_int, 1, ret, symbol_addr);
*debug_var = debug;
return ret;
}
ompd_rc_t
gompd_get_display_affinity (ompd_address_space_handle_t *ah, ompd_word_t *aff)
{
CHECK (ah);
ompd_word_t affin = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_display_affinity_var", affin, affin,
target_sizes.sizeof_char, 1, ret, symbol_addr);
*aff = affin;
return ret;
}
ompd_rc_t
gompd_get_affinity_format_len (ompd_address_space_handle_t *ah,
ompd_word_t *len)
{
CHECK (ah);
ompd_word_t len_var = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_affinity_format_len", len_var, len_var,
target_sizes.sizeof_int, 1, ret, symbol_addr);
*len = len_var;
return ret;
}
ompd_rc_t
gompd_get_affinity_format (ompd_address_space_handle_t *ah, const char **string)
{
CHECK (ah);
ompd_word_t len = 100;
ompd_rc_t ret;
char *temp_str;
ompd_word_t addr;
ret = callbacks->alloc_memory (len + 1, (void **) &temp_str);
CHECK_RET (ret);
temp_str[len] = '\0';
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
ret = callbacks->symbol_addr_lookup (ah->context, NULL,
"gomp_affinity_format_var", &symbol_addr,
NULL);
CHECK_RET (ret);
ret = callbacks->read_memory (ah->context, NULL, &symbol_addr,
target_sizes.sizeof_pointer, &addr);
CHECK_RET (ret);
symbol_addr.address = addr;
ret = callbacks->read_string (ah->context, NULL, &symbol_addr, len,
(void *) temp_str);
CHECK_RET (ret);
ret = callbacks->device_to_host (ah->context, &temp_str,
target_sizes.sizeof_char, len, &temp_str);
*string = temp_str;
return ret;
}
ompd_rc_t
gompd_get_wait_policy (ompd_address_space_handle_t *ah,
ompd_word_t *wait_policy)
{
CHECK (ah);
ompd_word_t wait_p = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "wait_policy", wait_p, wait_p,
target_sizes.sizeof_int, 1, ret, symbol_addr);
*wait_policy = wait_p;
return ret;
}
ompd_rc_t
gompd_get_num_teams (ompd_address_space_handle_t *ah, ompd_word_t *num_teams)
{
CHECK (ah);
ompd_word_t num_t = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_num_teams_var", num_t, num_t,
target_sizes.sizeof_int, 1, ret, symbol_addr);
*num_teams = num_t;
return ret;
}
ompd_rc_t
gompd_get_teams_thread_limit (ompd_address_space_handle_t *ah,
ompd_word_t *thread_limit)
{
CHECK (ah);
ompd_word_t thr_lim = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_teams_thread_limit_var", thr_lim, thr_lim,
target_sizes.sizeof_int, 1, ret, symbol_addr);
*thread_limit = thr_lim;
return ret;
}
ompd_rc_t
gompd_get_spin_count (ompd_address_space_handle_t *ah, ompd_word_t *spin_count)
{
CHECK (ah);
ompd_word_t spins = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_spin_count_var", spins, spins,
target_sizes.sizeof_long_long, 1, ret, symbol_addr);
*spin_count = spins;
return ret;
}
ompd_rc_t
gompd_get_available_cpus (ompd_address_space_handle_t *ah, ompd_word_t *procs)
{
CHECK (ah);
ompd_word_t cpus = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_available_cpus", cpus, cpus,
target_sizes.sizeof_long, 1, ret, symbol_addr);
*procs = cpus;
return ret;
}
ompd_rc_t
gompd_get_throttled_spin_count (ompd_address_space_handle_t *ah,
ompd_word_t *throt)
{
CHECK (ah);
ompd_word_t temp = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_throttled_spin_count_var", temp, temp,
target_sizes.sizeof_long_long, 1, ret, symbol_addr);
*throt = temp;
return ret;
}
ompd_rc_t
gompd_get_managed_threads (ompd_address_space_handle_t *ah, ompd_word_t *man_th)
{
CHECK (ah);
ompd_word_t temp = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gomp_managed_threads", temp, temp,
target_sizes.sizeof_long, 1, ret, symbol_addr);
*man_th = temp;
return ret;
}
ompd_rc_t
gompd_get_gompd_enabled (ompd_address_space_handle_t *ah, const char **string)
{
CHECK (ah);
ompd_word_t temp = 0;
ompd_rc_t ret;
ompd_address_t symbol_addr = {OMPD_SEGMENT_UNSPECIFIED, 0};
GET_VALUE (ah->context, NULL, "gompd_enabled", temp, temp,
target_sizes.sizeof_int, 1, ret, symbol_addr);
static const char *temp_string = "disabled";
if (temp == 1)
temp_string = "enabled";
else if (temp == -1)
temp_string = "undefined";
*string = temp_string;
return ret;
}
/* End of global ICVs functions. */
/* Get per thread ICVs. */
ompd_rc_t
gompd_get_nthread (ompd_thread_handle_t *thread_handle,
ompd_word_t *nthreads_var)
{
/* gomp_thread->task->gomp_task_icv.nthreads_var. */
if (thread_handle == NULL)
return ompd_rc_stale_handle;
if (nthreads_var == NULL)
return ompd_rc_bad_input;
CHECK (thread_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = thread_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = thread_handle->ah->context;
ompd_thread_context_t *t_context = thread_handle->thread_context;
ompd_rc_t ret;
/* gomp_thread->task. */
ACCESS_VALUE (context, t_context, "gompd_access_gomp_thread_task",
temp_offset, 1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_thread->task->task_icv. */
ACCESS_VALUE (context, t_context, "gompd_access_gomp_task_icv", temp_offset,
1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_thread->task->task_icv.nthreads_var. */
ACCESS_VALUE (context, t_context, "gompd_access_gomp_task_icv_nthreads_var",
temp_offset, 0, ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, t_context, symbol_addr, target_sizes.sizeof_long_long,
1, res, ret, 0);
*nthreads_var = res;
return ompd_rc_ok;
}
ompd_rc_t
gompd_get_default_device (ompd_thread_handle_t *thread_handle,
ompd_word_t *default_device_var)
{
/* gomp_thread->task->gomp_task_icv.default_device_var. */
if (thread_handle == NULL)
return ompd_rc_stale_handle;
if (default_device_var == NULL)
return ompd_rc_bad_input;
CHECK (thread_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = thread_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = thread_handle->ah->context;
ompd_thread_context_t *t_context = thread_handle->thread_context;
ompd_rc_t ret;
/* gomp_thread->task. */
ACCESS_VALUE (context, t_context, "gompd_access_gomp_thread_task",
temp_offset, 1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_thread->task->task_icv. */
ACCESS_VALUE (context, t_context, "gompd_access_gomp_task_icv", temp_offset,
1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_thread->task->task_icv.default_device_var. */
ACCESS_VALUE (context, t_context,
"gompd_access_gomp_task_icv_default_device_var", temp_offset, 0,
ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, t_context, symbol_addr, target_sizes.sizeof_int, 1,
res, ret, 0);
*default_device_var = res;
return ompd_rc_ok;
}
ompd_rc_t
gompd_get_dynamic (ompd_thread_handle_t *thread_handle, ompd_word_t *dyn_var)
{
/* gomp_thread->task->gomp_task_icv.dyn_var. */
if (thread_handle == NULL)
return ompd_rc_stale_handle;
if (dyn_var == NULL)
return ompd_rc_bad_input;
CHECK (thread_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = thread_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = thread_handle->ah->context;
ompd_thread_context_t *t_context = thread_handle->thread_context;
ompd_rc_t ret;
/* gomp_thread->task. */
ACCESS_VALUE (context, t_context, "gompd_access_gomp_thread_task",
temp_offset, 1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_thread->task->task_icv. */
ACCESS_VALUE (context, t_context, "gompd_access_gomp_task_icv", temp_offset,
1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_thread->task->task_icv.dyn_var. */
ACCESS_VALUE (context, t_context, "gompd_access_gomp_task_icv_dyn_var",
temp_offset, 0, ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, t_context, symbol_addr, target_sizes.sizeof_char, 1,
res, ret, 0);
*dyn_var = res;
return ompd_rc_ok;
}
/* End of per thread ICVs. */
/* Get per task ICVs. */
ompd_rc_t
gompd_get_thread_limit (ompd_task_handle_t *task_handle,
ompd_word_t *thread_limit_var)
{
/* gomp_task->gomp_task_icv.thread_limit_var. */
if (task_handle == NULL)
return ompd_rc_stale_handle;
if (thread_limit_var == NULL)
return ompd_rc_bad_input;
CHECK (task_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = task_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = task_handle->ah->context;
ompd_rc_t ret;
/* gomp_task->task_icv. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_icv", temp_offset,
1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_task->task_icv.thread_limit_var. */
ACCESS_VALUE (context, NULL,
"gompd_access_gomp_task_icv_thread_limit_var", temp_offset, 0,
ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, NULL, symbol_addr, target_sizes.sizeof_int, 1,
res, ret, 0);
*thread_limit_var = res;
return ompd_rc_ok;
}
ompd_rc_t
gompd_get_run_sched_chunk_size (ompd_task_handle_t *task_handle,
ompd_word_t *run_sched_chunk_size)
{
/* gomp_task->gomp_task_icv.run_sched_chunk_size. */
if (task_handle == NULL)
return ompd_rc_stale_handle;
if (run_sched_chunk_size == NULL)
return ompd_rc_bad_input;
CHECK (task_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = task_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = task_handle->ah->context;
ompd_rc_t ret;
/* gomp_task->task_icv. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_icv", temp_offset,
1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_task->task_icv.run_sched_chunk_size. */
ACCESS_VALUE (context, NULL,
"gompd_access_gomp_task_icv_run_sched_chunk_size", temp_offset,
0, ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, NULL, symbol_addr, target_sizes.sizeof_int, 1,
res, ret, 0);
*run_sched_chunk_size = res;
return ompd_rc_ok;
}
ompd_rc_t
gompd_get_run_sched (ompd_task_handle_t *task_handle,
ompd_word_t *run_sched_var)
{
/* gomp_task->gomp_task_icv.run_sched_var. */
if (task_handle == NULL)
return ompd_rc_stale_handle;
if (run_sched_var == NULL)
return ompd_rc_bad_input;
CHECK (task_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = task_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = task_handle->ah->context;
ompd_rc_t ret;
/* gomp_task->task_icv. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_icv", temp_offset,
1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_task->task_icv.run_sched_var. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_icv_run_sched_var",
temp_offset, 0, ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, NULL, symbol_addr, target_sizes.sizeof_int, 1,
res, ret, 0);
*run_sched_var = res;
return ompd_rc_ok;
}
ompd_rc_t
gompd_get_max_active_levels (ompd_task_handle_t *task_handle,
ompd_word_t *max_active_levels_var)
{
/* gomp_task->gomp_task_icv.max_active_levels_var. */
if (task_handle == NULL)
return ompd_rc_stale_handle;
if (max_active_levels_var == NULL)
return ompd_rc_bad_input;
CHECK (task_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = task_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = task_handle->ah->context;
ompd_rc_t ret;
/* gomp_task->task_icv. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_icv", temp_offset,
1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_task->task_icv.run_sched_var. */
ACCESS_VALUE (context, NULL,
"gompd_access_gomp_task_icv_max_active_levels_var", temp_offset,
0, ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, NULL, symbol_addr, target_sizes.sizeof_char, 1,
res, ret, 0);
*max_active_levels_var = res;
return ompd_rc_ok;
}
ompd_rc_t
gompd_get_proc_bind (ompd_task_handle_t *task_handle, const char **bind_var)
{
/* gomp_task->gomp_task_icv.bind_var. */
if (task_handle == NULL)
return ompd_rc_stale_handle;
if (bind_var == NULL)
return ompd_rc_bad_input;
CHECK (task_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = task_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = task_handle->ah->context;
ompd_rc_t ret;
/* gomp_task->task_icv. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_icv", temp_offset,
1, ret, symbol_addr, temp_sym_addr, temp_addr);
/* gomp_task->task_icv.bind_var. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_icv_bind_var",
temp_offset, 0, ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, NULL, symbol_addr, target_sizes.sizeof_char, 1,
res, ret, 0);
static const char *temp_string = "undefined";
if (res == 0)
temp_string = "FALSE";
else if (res == 1)
temp_string = "TRUE";
else if (res == 2)
temp_string = "PRIMARY";
else if (res == 3)
temp_string = "CLOSE";
else if (res == 4)
temp_string = "SPREAD";
else
return ompd_rc_error;
*bind_var = temp_string;
return ompd_rc_ok;
}
ompd_rc_t
gompd_is_final (ompd_task_handle_t *task_handle, ompd_word_t *final_task)
{
/* gomp_task->final_task. */
if (task_handle == NULL)
return ompd_rc_stale_handle;
if (final_task == NULL)
return ompd_rc_bad_input;
CHECK (task_handle->ah);
ompd_word_t res = 0;
ompd_address_t symbol_addr = task_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = task_handle->ah->context;
ompd_rc_t ret;
/* gomp_task->final_task. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_final_task", temp_offset,
0, ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, NULL, symbol_addr, target_sizes.sizeof_char, 1,
res, ret, 0);
*final_task = res;
return ompd_rc_ok;
}
ompd_rc_t
gompd_is_implicit (ompd_task_handle_t *task_handle, ompd_word_t *task_kind)
{
/* gomp_task->kind. */
if (task_handle == NULL)
return ompd_rc_stale_handle;
if (task_kind == NULL)
return ompd_rc_bad_input;
CHECK (task_handle->ah);
ompd_word_t res = -1;
ompd_address_t symbol_addr = task_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = task_handle->ah->context;
ompd_rc_t ret;
/* gomp_task->kind. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_task_kind", temp_offset, 0,
ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, NULL, symbol_addr, target_sizes.sizeof_int, 1, res,
ret, 0);
/* if task is implicit, then res = 0. */
res = res ? -1: 0;
*task_kind = res;
return ompd_rc_ok;
}
/* End of task ICVs. */
/* Get per parallel handle ICVs. */
ompd_rc_t
gompd_get_team_size (ompd_parallel_handle_t *parallel_handle,
ompd_word_t *nthreads)
{
/* gomp_team->nthreads. */
if (parallel_handle == NULL)
return ompd_rc_stale_handle;
if (nthreads == NULL)
return ompd_rc_bad_input;
CHECK (parallel_handle->ah);
ompd_word_t res = -1;
ompd_address_t symbol_addr = parallel_handle->th;
ompd_word_t temp_offset;
ompd_address_t temp_sym_addr;
ompd_addr_t temp_addr;
ompd_address_space_context_t *context = parallel_handle->ah->context;
ompd_rc_t ret;
/* gomp_team->nthreads. */
ACCESS_VALUE (context, NULL, "gompd_access_gomp_team_nthreads", temp_offset,
0, ret, symbol_addr, temp_sym_addr, temp_addr);
DEREFERENCE (context, NULL, symbol_addr, target_sizes.sizeof_int, 1,
res, ret, 0);
*nthreads = res;
return ompd_rc_ok;
}
/* End of parallel handle ICVs. */
ompd_rc_t
gompd_get_sizes (ompd_address_space_context_t *context)
{
if (context == NULL)
return ompd_rc_bad_input;
static bool inited = false;
static ompd_rc_t ret;
if (inited)
return ret;
ret = callbacks->sizeof_type (context, &target_sizes);
if (ret != ompd_rc_ok)
return ret;
inited = true;
return ret;
}