1*b0277befSVignesh Balasubramanian /*
2*b0277befSVignesh Balasubramanian * omp-state.cpp -- OMPD states
3*b0277befSVignesh Balasubramanian */
4*b0277befSVignesh Balasubramanian
5*b0277befSVignesh Balasubramanian //===----------------------------------------------------------------------===//
6*b0277befSVignesh Balasubramanian //
7*b0277befSVignesh Balasubramanian // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
8*b0277befSVignesh Balasubramanian // See https://llvm.org/LICENSE.txt for license information.
9*b0277befSVignesh Balasubramanian // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
10*b0277befSVignesh Balasubramanian //
11*b0277befSVignesh Balasubramanian //===----------------------------------------------------------------------===//
12*b0277befSVignesh Balasubramanian
13*b0277befSVignesh Balasubramanian #include "omp-debug.h"
14*b0277befSVignesh Balasubramanian #include "ompd-private.h"
15*b0277befSVignesh Balasubramanian #include <cstring>
16*b0277befSVignesh Balasubramanian
__ompd_init_states(const ompd_callbacks_t * table)17*b0277befSVignesh Balasubramanian void __ompd_init_states(const ompd_callbacks_t *table) { callbacks = table; }
18*b0277befSVignesh Balasubramanian
get_ompd_state_name(ompd_word_t state)19*b0277befSVignesh Balasubramanian static const char *get_ompd_state_name(ompd_word_t state) {
20*b0277befSVignesh Balasubramanian switch (state) {
21*b0277befSVignesh Balasubramanian #define ompd_state_macro(state, code) \
22*b0277befSVignesh Balasubramanian case code: \
23*b0277befSVignesh Balasubramanian return #state;
24*b0277befSVignesh Balasubramanian FOREACH_OMPD_STATE(ompd_state_macro)
25*b0277befSVignesh Balasubramanian #undef ompd_state_macro
26*b0277befSVignesh Balasubramanian default:
27*b0277befSVignesh Balasubramanian return NULL;
28*b0277befSVignesh Balasubramanian }
29*b0277befSVignesh Balasubramanian }
30*b0277befSVignesh Balasubramanian
31*b0277befSVignesh Balasubramanian ompd_rc_t
ompd_enumerate_states(ompd_address_space_handle_t * address_space_handle,ompd_word_t current_state,ompd_word_t * next_state,const char ** next_state_name,ompd_word_t * more_enums)32*b0277befSVignesh Balasubramanian ompd_enumerate_states(ompd_address_space_handle_t *address_space_handle,
33*b0277befSVignesh Balasubramanian ompd_word_t current_state, ompd_word_t *next_state,
34*b0277befSVignesh Balasubramanian const char **next_state_name, ompd_word_t *more_enums) {
35*b0277befSVignesh Balasubramanian ompd_rc_t ret;
36*b0277befSVignesh Balasubramanian if (current_state > ompt_state_undefined &&
37*b0277befSVignesh Balasubramanian current_state >= OMPD_LAST_OMP_STATE) {
38*b0277befSVignesh Balasubramanian return ompd_rc_bad_input;
39*b0277befSVignesh Balasubramanian }
40*b0277befSVignesh Balasubramanian const char *find_next_state_name;
41*b0277befSVignesh Balasubramanian *next_state = (current_state == ompt_state_undefined ? ompt_state_work_serial
42*b0277befSVignesh Balasubramanian : current_state + 1);
43*b0277befSVignesh Balasubramanian while (!(find_next_state_name = get_ompd_state_name(*next_state))) {
44*b0277befSVignesh Balasubramanian ++(*next_state);
45*b0277befSVignesh Balasubramanian }
46*b0277befSVignesh Balasubramanian
47*b0277befSVignesh Balasubramanian char *next_state_name_cpy;
48*b0277befSVignesh Balasubramanian ret = callbacks->alloc_memory(strlen(find_next_state_name) + 1,
49*b0277befSVignesh Balasubramanian (void **)&next_state_name_cpy);
50*b0277befSVignesh Balasubramanian if (ret != ompd_rc_ok) {
51*b0277befSVignesh Balasubramanian return ret;
52*b0277befSVignesh Balasubramanian }
53*b0277befSVignesh Balasubramanian strcpy(next_state_name_cpy, find_next_state_name);
54*b0277befSVignesh Balasubramanian
55*b0277befSVignesh Balasubramanian *next_state_name = next_state_name_cpy;
56*b0277befSVignesh Balasubramanian
57*b0277befSVignesh Balasubramanian if (*next_state == OMPD_LAST_OMP_STATE) {
58*b0277befSVignesh Balasubramanian *more_enums = 0;
59*b0277befSVignesh Balasubramanian } else {
60*b0277befSVignesh Balasubramanian *more_enums = 1;
61*b0277befSVignesh Balasubramanian }
62*b0277befSVignesh Balasubramanian
63*b0277befSVignesh Balasubramanian return ompd_rc_ok;
64*b0277befSVignesh Balasubramanian }
65