xref: /llvm-project/openmp/libompd/gdb-plugin/ompd/ompd_handles.py (revision f98ee40f4b5d7474fc67e82824bf6abbaedb7b1c)
1d2a6e165SVignesh Balasubramanianimport ompdModule
2d2a6e165SVignesh Balasubramanianimport imp
3d2a6e165SVignesh Balasubramanian
4d2a6e165SVignesh Balasubramanian
5*f98ee40fSTobias Hietaclass ompd_parallel(object):
6d2a6e165SVignesh Balasubramanian    def __init__(self, parallel_handle):
7d2a6e165SVignesh Balasubramanian        """Initializes an ompd_parallel object with the pointer
8d2a6e165SVignesh Balasubramanian        to a handle of a parallel region."""
9d2a6e165SVignesh Balasubramanian        self.parallel_handle = parallel_handle
10d2a6e165SVignesh Balasubramanian        self.threads = {}
11d2a6e165SVignesh Balasubramanian        self.itasks = {}
12d2a6e165SVignesh Balasubramanian        self.enclosing_parallel_handle = None
13d2a6e165SVignesh Balasubramanian        self.enclosing_parallel = False
14d2a6e165SVignesh Balasubramanian        self.task_handle = None
15d2a6e165SVignesh Balasubramanian
16d2a6e165SVignesh Balasubramanian    def get_thread_in_parallel(self, thread_num):
17d2a6e165SVignesh Balasubramanian        """Obtains thread handles for the threads associated with the
18d2a6e165SVignesh Balasubramanian        parallel region specified by parallel_handle."""
19d2a6e165SVignesh Balasubramanian        if not thread_num in self.threads:
20*f98ee40fSTobias Hieta            thread_handle = ompdModule.call_ompd_get_thread_in_parallel(
21*f98ee40fSTobias Hieta                self.parallel_handle, thread_num
22*f98ee40fSTobias Hieta            )
23d2a6e165SVignesh Balasubramanian            self.threads[thread_num] = ompd_thread(thread_handle)
24d2a6e165SVignesh Balasubramanian        return self.threads[thread_num]
25d2a6e165SVignesh Balasubramanian
26d2a6e165SVignesh Balasubramanian    def get_enclosing_parallel_handle(self):
27d2a6e165SVignesh Balasubramanian        """Obtains a parallel handle for the parallel region enclosing
28d2a6e165SVignesh Balasubramanian        the parallel region specified by parallel_handle."""
29d2a6e165SVignesh Balasubramanian        if not self.enclosing_parallel_handle:
30*f98ee40fSTobias Hieta            self.enclosing_parallel_handle = (
31*f98ee40fSTobias Hieta                ompdModule.call_ompd_get_enclosing_parallel_handle(self.parallel_handle)
32*f98ee40fSTobias Hieta            )
33d2a6e165SVignesh Balasubramanian        return self.enclosing_parallel_handle
34d2a6e165SVignesh Balasubramanian
35d2a6e165SVignesh Balasubramanian    def get_enclosing_parallel(self):
36d2a6e165SVignesh Balasubramanian        if not self.enclosing_parallel:
37*f98ee40fSTobias Hieta            self.enclosing_parallel = ompd_parallel(
38*f98ee40fSTobias Hieta                self.get_enclosing_parallel_handle()
39*f98ee40fSTobias Hieta            )
40d2a6e165SVignesh Balasubramanian        return self.enclosing_parallel
41d2a6e165SVignesh Balasubramanian
42d2a6e165SVignesh Balasubramanian    def get_task_in_parallel(self, thread_num):
43d2a6e165SVignesh Balasubramanian        """Obtains handles for the implicit tasks associated with the
44d2a6e165SVignesh Balasubramanian        parallel region specified by parallel_handle."""
45d2a6e165SVignesh Balasubramanian        if not thread_num in self.itasks:
46*f98ee40fSTobias Hieta            task_handle = ompdModule.call_ompd_get_task_in_parallel(
47*f98ee40fSTobias Hieta                self.parallel_handle, thread_num
48*f98ee40fSTobias Hieta            )
49d2a6e165SVignesh Balasubramanian            self.itasks[thread_num] = ompd_task(task_handle)
50d2a6e165SVignesh Balasubramanian        return self.itasks[thread_num]
51d2a6e165SVignesh Balasubramanian
52d2a6e165SVignesh Balasubramanian    def __del__(self):
53d2a6e165SVignesh Balasubramanian        """Releases the parallel handle."""
54d2a6e165SVignesh Balasubramanian        pass  # let capsule destructors do the job
55d2a6e165SVignesh Balasubramanian
56d2a6e165SVignesh Balasubramanian
57*f98ee40fSTobias Hietaclass ompd_task(object):
58d2a6e165SVignesh Balasubramanian    def __init__(self, task_handle):
59d2a6e165SVignesh Balasubramanian        """Initializes a new ompd_task_handle object and sets the attribute
60d2a6e165SVignesh Balasubramanian        to the task handle specified."""
61d2a6e165SVignesh Balasubramanian        self.task_handle = task_handle
62d2a6e165SVignesh Balasubramanian        self.task_parallel_handle = False
63d2a6e165SVignesh Balasubramanian        self.generating_task_handle = False
64d2a6e165SVignesh Balasubramanian        self.scheduling_task_handle = False
65d2a6e165SVignesh Balasubramanian        self.task_parallel = False
66d2a6e165SVignesh Balasubramanian        self.generating_task = False
67d2a6e165SVignesh Balasubramanian        self.scheduling_task = False
68d2a6e165SVignesh Balasubramanian        self.task_frames = None
69d2a6e165SVignesh Balasubramanian        self.task_frame_flags = None
70d2a6e165SVignesh Balasubramanian
71d2a6e165SVignesh Balasubramanian    def get_task_parallel_handle(self):
72d2a6e165SVignesh Balasubramanian        """Obtains a task parallel handle for the parallel region enclosing
73d2a6e165SVignesh Balasubramanian        the task region specified."""
74d2a6e165SVignesh Balasubramanian        if not self.task_parallel_handle:
75*f98ee40fSTobias Hieta            self.task_parallel_handle = ompdModule.call_ompd_get_task_parallel_handle(
76*f98ee40fSTobias Hieta                self.task_handle
77*f98ee40fSTobias Hieta            )
78d2a6e165SVignesh Balasubramanian        return self.task_parallel_handle
79d2a6e165SVignesh Balasubramanian
80d2a6e165SVignesh Balasubramanian    def get_task_parallel(self):
81d2a6e165SVignesh Balasubramanian        if not self.task_parallel:
82d2a6e165SVignesh Balasubramanian            self.task_parallel = ompd_parallel(self.get_task_parallel_handle())
83d2a6e165SVignesh Balasubramanian        return self.task_parallel
84d2a6e165SVignesh Balasubramanian
85d2a6e165SVignesh Balasubramanian    def get_generating_task_handle(self):
86d2a6e165SVignesh Balasubramanian        """Obtains the task handle for the task that created the task specified
87d2a6e165SVignesh Balasubramanian        by the task handle."""
88d2a6e165SVignesh Balasubramanian        if not self.generating_task_handle:
89*f98ee40fSTobias Hieta            self.generating_task_handle = (
90*f98ee40fSTobias Hieta                ompdModule.call_ompd_get_generating_task_handle(self.task_handle)
91*f98ee40fSTobias Hieta            )
92d2a6e165SVignesh Balasubramanian        return self.generating_task_handle
93d2a6e165SVignesh Balasubramanian
94d2a6e165SVignesh Balasubramanian    def get_generating_task(self):
95d2a6e165SVignesh Balasubramanian        if not self.generating_task:
96*f98ee40fSTobias Hieta            self.generating_task = ompd_task(
97*f98ee40fSTobias Hieta                ompdModule.call_ompd_get_generating_task_handle(self.task_handle)
98*f98ee40fSTobias Hieta            )
99d2a6e165SVignesh Balasubramanian        return self.generating_task
100d2a6e165SVignesh Balasubramanian
101d2a6e165SVignesh Balasubramanian    def get_scheduling_task_handle(self):
102d2a6e165SVignesh Balasubramanian        """Obtains the task handle for the task that scheduled the task specified."""
103d2a6e165SVignesh Balasubramanian        if not self.scheduling_task_handle:
104*f98ee40fSTobias Hieta            self.scheduling_task_handle = (
105*f98ee40fSTobias Hieta                ompdModule.call_ompd_get_scheduling_task_handle(self.task_handle)
106*f98ee40fSTobias Hieta            )
107d2a6e165SVignesh Balasubramanian        return self.scheduling_task_handle
108d2a6e165SVignesh Balasubramanian
109d2a6e165SVignesh Balasubramanian    def get_scheduling_task(self):
110d2a6e165SVignesh Balasubramanian        """Returns ompd_task object for the task that scheduled the current task."""
111d2a6e165SVignesh Balasubramanian        if not self.scheduling_task:
112d2a6e165SVignesh Balasubramanian            self.scheduling_task = ompd_task(self.get_scheduling_task_handle())
113d2a6e165SVignesh Balasubramanian        return self.scheduling_task
114d2a6e165SVignesh Balasubramanian
115d2a6e165SVignesh Balasubramanian    def get_task_function(self):
116d2a6e165SVignesh Balasubramanian        """Returns long with address of function entry point."""
117d2a6e165SVignesh Balasubramanian        return ompdModule.call_ompd_get_task_function(self.task_handle)
118d2a6e165SVignesh Balasubramanian
119d2a6e165SVignesh Balasubramanian    def get_task_frame_with_flags(self):
120d2a6e165SVignesh Balasubramanian        """Returns enter frame address and flag, exit frame address and flag for current task handle."""
121d2a6e165SVignesh Balasubramanian        if self.task_frames is None or self.task_frame_flags is None:
122d2a6e165SVignesh Balasubramanian            ret_value = ompdModule.call_ompd_get_task_frame(self.task_handle)
123d2a6e165SVignesh Balasubramanian            if isinstance(ret_value, tuple):
124d2a6e165SVignesh Balasubramanian                self.task_frames = (ret_value[0], ret_value[2])
125d2a6e165SVignesh Balasubramanian                self.task_frame_flags = (ret_value[1], ret_value[3])
126d2a6e165SVignesh Balasubramanian            else:
127d2a6e165SVignesh Balasubramanian                return ret_value
128*f98ee40fSTobias Hieta        return (
129*f98ee40fSTobias Hieta            self.task_frames[0],
130*f98ee40fSTobias Hieta            self.task_frame_flags[0],
131*f98ee40fSTobias Hieta            self.task_frames[1],
132*f98ee40fSTobias Hieta            self.task_frame_flags[1],
133*f98ee40fSTobias Hieta        )
134d2a6e165SVignesh Balasubramanian
135d2a6e165SVignesh Balasubramanian    def get_task_frame(self):
136d2a6e165SVignesh Balasubramanian        """Returns enter and exit frame address for current task handle."""
137d2a6e165SVignesh Balasubramanian        if self.task_frames is None:
138d2a6e165SVignesh Balasubramanian            ret_value = ompdModule.call_ompd_get_task_frame(self.task_handle)
139d2a6e165SVignesh Balasubramanian            if isinstance(ret_value, tuple):
140d2a6e165SVignesh Balasubramanian                self.task_frames = (ret_value[0], ret_value[2])
141d2a6e165SVignesh Balasubramanian            else:
142d2a6e165SVignesh Balasubramanian                return ret_value
143d2a6e165SVignesh Balasubramanian        return self.task_frames
144d2a6e165SVignesh Balasubramanian
145d2a6e165SVignesh Balasubramanian    def __del__(self):
146d2a6e165SVignesh Balasubramanian        """Releases the task handle."""
147d2a6e165SVignesh Balasubramanian        pass  # let capsule destructors do the job
148d2a6e165SVignesh Balasubramanian
149d2a6e165SVignesh Balasubramanian
150d2a6e165SVignesh Balasubramanianclass ompd_thread(object):
151d2a6e165SVignesh Balasubramanian    def __init__(self, thread_handle):
152d2a6e165SVignesh Balasubramanian        """Initializes an ompd_thread with the data received from
153d2a6e165SVignesh Balasubramanian        GDB."""
154d2a6e165SVignesh Balasubramanian        self.thread_handle = thread_handle
155d2a6e165SVignesh Balasubramanian        self.parallel_handle = None
156d2a6e165SVignesh Balasubramanian        self.task_handle = None
157d2a6e165SVignesh Balasubramanian        self.current_task = False
158d2a6e165SVignesh Balasubramanian        self.current_parallel = False
159d2a6e165SVignesh Balasubramanian        self.thread_id = False
160d2a6e165SVignesh Balasubramanian
161d2a6e165SVignesh Balasubramanian    def get_current_parallel_handle(self):
162d2a6e165SVignesh Balasubramanian        """Obtains the parallel handle for the parallel region associated with
163d2a6e165SVignesh Balasubramanian        the given thread handle."""
164d2a6e165SVignesh Balasubramanian        # TODO: invalidate thread objects based on `gdb.event.cont`. This should invalidate all internal state.
165*f98ee40fSTobias Hieta        self.parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(
166*f98ee40fSTobias Hieta            self.thread_handle
167*f98ee40fSTobias Hieta        )
168d2a6e165SVignesh Balasubramanian        return self.parallel_handle
169d2a6e165SVignesh Balasubramanian
170d2a6e165SVignesh Balasubramanian    def get_current_parallel(self):
171d2a6e165SVignesh Balasubramanian        """Returns parallel object for parallel handle of the parallel region
172d2a6e165SVignesh Balasubramanian        associated with the current thread handle."""
173d2a6e165SVignesh Balasubramanian        if not self.current_parallel:
174d2a6e165SVignesh Balasubramanian            self.current_parallel = ompd_parallel(self.get_current_parallel_handle())
175d2a6e165SVignesh Balasubramanian        return self.current_parallel
176d2a6e165SVignesh Balasubramanian
177d2a6e165SVignesh Balasubramanian    def get_current_task_handle(self):
178d2a6e165SVignesh Balasubramanian        """Obtains the task handle for the current task region of the
179d2a6e165SVignesh Balasubramanian        given thread."""
180d2a6e165SVignesh Balasubramanian        return ompdModule.call_ompd_get_curr_task_handle(self.thread_handle)
181d2a6e165SVignesh Balasubramanian
182d2a6e165SVignesh Balasubramanian    def get_thread_id(self):
183d2a6e165SVignesh Balasubramanian        """Obtains the ID for the given thread."""
184d2a6e165SVignesh Balasubramanian        if not self.thread_id:
185d2a6e165SVignesh Balasubramanian            self.thread_id = ompdModule.call_ompd_get_thread_id(self.thread_handle)
186d2a6e165SVignesh Balasubramanian        return self.thread_id
187d2a6e165SVignesh Balasubramanian
188d2a6e165SVignesh Balasubramanian    def get_current_task(self):
189d2a6e165SVignesh Balasubramanian        """Returns task object for task handle of the current task region."""
190d2a6e165SVignesh Balasubramanian        return ompd_task(self.get_current_task_handle())
191d2a6e165SVignesh Balasubramanian
192d2a6e165SVignesh Balasubramanian    def get_state(self):
193d2a6e165SVignesh Balasubramanian        """Returns tuple with OMPD state (long) and wait_id, in case the thread is in a
194d2a6e165SVignesh Balasubramanian        waiting state. Helper function for 'ompd threads' command."""
195d2a6e165SVignesh Balasubramanian        (state, wait_id) = ompdModule.call_ompd_get_state(self.thread_handle)
196d2a6e165SVignesh Balasubramanian        return (state, wait_id)
197d2a6e165SVignesh Balasubramanian
198d2a6e165SVignesh Balasubramanian    def __del__(self):
199d2a6e165SVignesh Balasubramanian        """Releases the given thread handle."""
200d2a6e165SVignesh Balasubramanian        pass  # let capsule destructors do the job
201