xref: /llvm-project/openmp/libompd/gdb-plugin/ompd/ompd_address_space.py (revision f98ee40f4b5d7474fc67e82824bf6abbaedb7b1c)
1d2a6e165SVignesh Balasubramanianfrom __future__ import print_function
2d2a6e165SVignesh Balasubramanianimport ompdModule
3d2a6e165SVignesh Balasubramanianfrom ompd_handles import ompd_thread, ompd_task, ompd_parallel
4d2a6e165SVignesh Balasubramanianimport gdb
5d2a6e165SVignesh Balasubramanianimport sys
6d2a6e165SVignesh Balasubramanianimport traceback
7d2a6e165SVignesh Balasubramanianfrom enum import Enum
8d2a6e165SVignesh Balasubramanian
9*f98ee40fSTobias Hieta
10d2a6e165SVignesh Balasubramanianclass ompd_scope(Enum):
11d2a6e165SVignesh Balasubramanian    ompd_scope_global = 1
12d2a6e165SVignesh Balasubramanian    ompd_scope_address_space = 2
13d2a6e165SVignesh Balasubramanian    ompd_scope_thread = 3
14d2a6e165SVignesh Balasubramanian    ompd_scope_parallel = 4
15d2a6e165SVignesh Balasubramanian    ompd_scope_implicit_task = 5
16d2a6e165SVignesh Balasubramanian    ompd_scope_task = 6
17d2a6e165SVignesh Balasubramanian
18d2a6e165SVignesh Balasubramanian
19*f98ee40fSTobias Hietaclass ompd_address_space(object):
20d2a6e165SVignesh Balasubramanian    def __init__(self):
21d2a6e165SVignesh Balasubramanian        """Initializes an ompd_address_space object by calling ompd_initialize
22d2a6e165SVignesh Balasubramanian        in ompdModule.c
23d2a6e165SVignesh Balasubramanian        """
24d2a6e165SVignesh Balasubramanian        self.addr_space = ompdModule.call_ompd_initialize()
25d2a6e165SVignesh Balasubramanian        # maps thread_num (thread id given by gdb) to ompd_thread object with thread handle
26d2a6e165SVignesh Balasubramanian        self.threads = {}
27d2a6e165SVignesh Balasubramanian        self.states = None
28d2a6e165SVignesh Balasubramanian        self.icv_map = None
29d2a6e165SVignesh Balasubramanian        self.ompd_tool_test_bp = None
30*f98ee40fSTobias Hieta        self.scope_map = {
31*f98ee40fSTobias Hieta            1: "global",
32*f98ee40fSTobias Hieta            2: "address_space",
33*f98ee40fSTobias Hieta            3: "thread",
34*f98ee40fSTobias Hieta            4: "parallel",
35*f98ee40fSTobias Hieta            5: "implicit_task",
36*f98ee40fSTobias Hieta            6: "task",
37*f98ee40fSTobias Hieta        }
38*f98ee40fSTobias Hieta        self.sched_map = {1: "static", 2: "dynamic", 3: "guided", 4: "auto"}
39d2a6e165SVignesh Balasubramanian        gdb.events.stop.connect(self.handle_stop_event)
40*f98ee40fSTobias Hieta        self.new_thread_breakpoint = gdb.Breakpoint(
41*f98ee40fSTobias Hieta            "ompd_bp_thread_begin", internal=True
42*f98ee40fSTobias Hieta        )
43d2a6e165SVignesh Balasubramanian        tool_break_symbol = gdb.lookup_global_symbol("ompd_tool_break")
44*f98ee40fSTobias Hieta        if tool_break_symbol is not None:
45d2a6e165SVignesh Balasubramanian            self.ompd_tool_test_bp = gdb.Breakpoint("ompd_tool_break", internal=True)
46d2a6e165SVignesh Balasubramanian
47d2a6e165SVignesh Balasubramanian    def handle_stop_event(self, event):
48d2a6e165SVignesh Balasubramanian        """Sets a breakpoint at different events, e.g. when a new OpenMP
49d2a6e165SVignesh Balasubramanian        thread is created.
50d2a6e165SVignesh Balasubramanian        """
51*f98ee40fSTobias Hieta        if isinstance(event, gdb.BreakpointEvent):
52d2a6e165SVignesh Balasubramanian            # check if breakpoint has already been hit
53*f98ee40fSTobias Hieta            if self.new_thread_breakpoint in event.breakpoints:
54d2a6e165SVignesh Balasubramanian                self.add_thread()
55*f98ee40fSTobias Hieta                gdb.execute("continue")
56d2a6e165SVignesh Balasubramanian                return
57*f98ee40fSTobias Hieta            elif (
58*f98ee40fSTobias Hieta                self.ompd_tool_test_bp is not None
59*f98ee40fSTobias Hieta                and self.ompd_tool_test_bp in event.breakpoints
60*f98ee40fSTobias Hieta            ):
61d2a6e165SVignesh Balasubramanian                try:
62d2a6e165SVignesh Balasubramanian                    self.compare_ompt_data()
63*f98ee40fSTobias Hieta                    gdb.execute("continue")
64d2a6e165SVignesh Balasubramanian                except ():
65d2a6e165SVignesh Balasubramanian                    traceback.print_exc()
66*f98ee40fSTobias Hieta        elif isinstance(event, gdb.SignalEvent):
67d2a6e165SVignesh Balasubramanian            # TODO: what do we need to do on SIGNALS?
68d2a6e165SVignesh Balasubramanian            pass
69d2a6e165SVignesh Balasubramanian        else:
70d2a6e165SVignesh Balasubramanian            # TODO: probably not possible?
71d2a6e165SVignesh Balasubramanian            pass
72d2a6e165SVignesh Balasubramanian
73d2a6e165SVignesh Balasubramanian    def get_icv_map(self):
74*f98ee40fSTobias Hieta        """Fills ICV map."""
75d2a6e165SVignesh Balasubramanian        self.icv_map = {}
76d2a6e165SVignesh Balasubramanian        current = 0
77d2a6e165SVignesh Balasubramanian        more = 1
78d2a6e165SVignesh Balasubramanian        while more > 0:
79d2a6e165SVignesh Balasubramanian            tup = ompdModule.call_ompd_enumerate_icvs(self.addr_space, current)
80d2a6e165SVignesh Balasubramanian            (current, next_icv, next_scope, more) = tup
81d2a6e165SVignesh Balasubramanian            self.icv_map[next_icv] = (current, next_scope, self.scope_map[next_scope])
82*f98ee40fSTobias Hieta        print("Initialized ICV map successfully for checking OMP API values.")
83d2a6e165SVignesh Balasubramanian
84d2a6e165SVignesh Balasubramanian    def compare_ompt_data(self):
85*f98ee40fSTobias Hieta        """Compares OMPT tool data about parallel region to data returned by OMPD functions."""
86d2a6e165SVignesh Balasubramanian        # make sure all threads and states are set
87d2a6e165SVignesh Balasubramanian        self.list_threads(False)
88d2a6e165SVignesh Balasubramanian
89d2a6e165SVignesh Balasubramanian        thread_id = gdb.selected_thread().ptid[1]
90d2a6e165SVignesh Balasubramanian        curr_thread = self.get_curr_thread()
91d2a6e165SVignesh Balasubramanian
92d2a6e165SVignesh Balasubramanian        # check if current thread is LWP thread; return if "ompd_rc_unavailable"
93d2a6e165SVignesh Balasubramanian        thread_handle = ompdModule.get_thread_handle(thread_id, self.addr_space)
94d2a6e165SVignesh Balasubramanian        if thread_handle == -1:
95d2a6e165SVignesh Balasubramanian            print("Skipping OMPT-OMPD checks for non-LWP thread.")
96d2a6e165SVignesh Balasubramanian            return
97d2a6e165SVignesh Balasubramanian
98*f98ee40fSTobias Hieta        print("Comparing OMPT data to OMPD data...")
99*f98ee40fSTobias Hieta        field_names = [i.name for i in gdb.parse_and_eval("thread_data").type.fields()]
100*f98ee40fSTobias Hieta        thread_data = gdb.parse_and_eval("thread_data")
101d2a6e165SVignesh Balasubramanian
102d2a6e165SVignesh Balasubramanian        if self.icv_map is None:
103d2a6e165SVignesh Balasubramanian            self.get_icv_map()
104d2a6e165SVignesh Balasubramanian
105d2a6e165SVignesh Balasubramanian        # compare state values
106*f98ee40fSTobias Hieta        if "ompt_state" in field_names:
107d2a6e165SVignesh Balasubramanian            if self.states is None:
108d2a6e165SVignesh Balasubramanian                self.enumerate_states()
109*f98ee40fSTobias Hieta            ompt_state = str(thread_data["ompt_state"])
110d2a6e165SVignesh Balasubramanian            ompd_state = str(self.states[curr_thread.get_state()[0]])
111d2a6e165SVignesh Balasubramanian            if ompt_state != ompd_state:
112*f98ee40fSTobias Hieta                print(
113*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: ompt_state (%s) does not match OMPD state (%s)!"
114*f98ee40fSTobias Hieta                    % (ompt_state, ompd_state)
115*f98ee40fSTobias Hieta                )
116d2a6e165SVignesh Balasubramanian
117d2a6e165SVignesh Balasubramanian        # compare wait_id values
118*f98ee40fSTobias Hieta        if "ompt_wait_id" in field_names:
119*f98ee40fSTobias Hieta            ompt_wait_id = thread_data["ompt_wait_id"]
120d2a6e165SVignesh Balasubramanian            ompd_wait_id = curr_thread.get_state()[1]
121d2a6e165SVignesh Balasubramanian            if ompt_wait_id != ompd_wait_id:
122*f98ee40fSTobias Hieta                print(
123*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: ompt_wait_id (%d) does not match OMPD wait id (%d)!"
124*f98ee40fSTobias Hieta                    % (ompt_wait_id, ompd_wait_id)
125*f98ee40fSTobias Hieta                )
126d2a6e165SVignesh Balasubramanian
127d2a6e165SVignesh Balasubramanian        # compare thread id
128*f98ee40fSTobias Hieta        if "omp_thread_num" in field_names and "thread-num-var" in self.icv_map:
129*f98ee40fSTobias Hieta            ompt_thread_num = thread_data["omp_thread_num"]
130*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
131*f98ee40fSTobias Hieta                curr_thread.thread_handle,
132*f98ee40fSTobias Hieta                self.icv_map["thread-num-var"][1],
133*f98ee40fSTobias Hieta                self.icv_map["thread-num-var"][0],
134*f98ee40fSTobias Hieta            )
135d2a6e165SVignesh Balasubramanian            if ompt_thread_num != icv_value:
136*f98ee40fSTobias Hieta                print(
137*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: omp_thread_num (%d) does not match OMPD thread num according to ICVs (%d)!"
138*f98ee40fSTobias Hieta                    % (ompt_thread_num, icv_value)
139*f98ee40fSTobias Hieta                )
140d2a6e165SVignesh Balasubramanian
141d2a6e165SVignesh Balasubramanian        # compare thread data
142*f98ee40fSTobias Hieta        if "ompt_thread_data" in field_names:
143*f98ee40fSTobias Hieta            ompt_thread_data = thread_data["ompt_thread_data"].dereference()["value"]
144*f98ee40fSTobias Hieta            ompd_value = ompdModule.call_ompd_get_tool_data(
145*f98ee40fSTobias Hieta                3, curr_thread.thread_handle
146*f98ee40fSTobias Hieta            )[0]
147d2a6e165SVignesh Balasubramanian            if ompt_thread_data != ompd_value:
148*f98ee40fSTobias Hieta                print(
149*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: value of ompt_thread_data (%d) does not match that of OMPD data union (%d)!"
150*f98ee40fSTobias Hieta                    % (ompt_thread_data, ompd_value)
151*f98ee40fSTobias Hieta                )
152d2a6e165SVignesh Balasubramanian
153d2a6e165SVignesh Balasubramanian        # compare number of threads
154*f98ee40fSTobias Hieta        if "omp_num_threads" in field_names and "team-size-var" in self.icv_map:
155*f98ee40fSTobias Hieta            ompt_num_threads = thread_data["omp_num_threads"]
156*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
157*f98ee40fSTobias Hieta                curr_thread.get_current_parallel_handle(),
158*f98ee40fSTobias Hieta                self.icv_map["team-size-var"][1],
159*f98ee40fSTobias Hieta                self.icv_map["team-size-var"][0],
160*f98ee40fSTobias Hieta            )
161d2a6e165SVignesh Balasubramanian            if ompt_num_threads != icv_value:
162*f98ee40fSTobias Hieta                print(
163*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: omp_num_threads (%d) does not match OMPD num threads according to ICVs (%d)!"
164*f98ee40fSTobias Hieta                    % (ompt_num_threads, icv_value)
165*f98ee40fSTobias Hieta                )
166d2a6e165SVignesh Balasubramanian
167d2a6e165SVignesh Balasubramanian        # compare omp level
168*f98ee40fSTobias Hieta        if "omp_level" in field_names and "levels-var" in self.icv_map:
169*f98ee40fSTobias Hieta            ompt_levels = thread_data["omp_level"]
170*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
171*f98ee40fSTobias Hieta                curr_thread.get_current_parallel_handle(),
172*f98ee40fSTobias Hieta                self.icv_map["levels-var"][1],
173*f98ee40fSTobias Hieta                self.icv_map["levels-var"][0],
174*f98ee40fSTobias Hieta            )
175d2a6e165SVignesh Balasubramanian            if ompt_levels != icv_value:
176*f98ee40fSTobias Hieta                print(
177*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: omp_level (%d) does not match OMPD levels according to ICVs (%d)!"
178*f98ee40fSTobias Hieta                    % (ompt_levels, icv_value)
179*f98ee40fSTobias Hieta                )
180d2a6e165SVignesh Balasubramanian
181d2a6e165SVignesh Balasubramanian        # compare active level
182*f98ee40fSTobias Hieta        if "omp_active_level" in field_names and "active-levels-var" in self.icv_map:
183*f98ee40fSTobias Hieta            ompt_active_levels = thread_data["omp_active_level"]
184*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
185*f98ee40fSTobias Hieta                curr_thread.get_current_parallel_handle(),
186*f98ee40fSTobias Hieta                self.icv_map["active-levels-var"][1],
187*f98ee40fSTobias Hieta                self.icv_map["active-levels-var"][0],
188*f98ee40fSTobias Hieta            )
189d2a6e165SVignesh Balasubramanian            if ompt_active_levels != icv_value:
190*f98ee40fSTobias Hieta                print(
191*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: active levels (%d) do not match active levels according to ICVs (%d)!"
192*f98ee40fSTobias Hieta                    % (ompt_active_levels, icv_value)
193*f98ee40fSTobias Hieta                )
194d2a6e165SVignesh Balasubramanian
195d2a6e165SVignesh Balasubramanian        # compare parallel data
196*f98ee40fSTobias Hieta        if "ompt_parallel_data" in field_names:
197*f98ee40fSTobias Hieta            ompt_parallel_data = thread_data["ompt_parallel_data"].dereference()[
198*f98ee40fSTobias Hieta                "value"
199*f98ee40fSTobias Hieta            ]
200d2a6e165SVignesh Balasubramanian            current_parallel_handle = curr_thread.get_current_parallel_handle()
201*f98ee40fSTobias Hieta            ompd_value = ompdModule.call_ompd_get_tool_data(4, current_parallel_handle)[
202*f98ee40fSTobias Hieta                0
203*f98ee40fSTobias Hieta            ]
204d2a6e165SVignesh Balasubramanian            if ompt_parallel_data != ompd_value:
205*f98ee40fSTobias Hieta                print(
206*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: value of ompt_parallel_data (%d) does not match that of OMPD data union (%d)!"
207*f98ee40fSTobias Hieta                    % (ompt_parallel_data, ompd_value)
208*f98ee40fSTobias Hieta                )
209d2a6e165SVignesh Balasubramanian
210d2a6e165SVignesh Balasubramanian        # compare max threads
211*f98ee40fSTobias Hieta        if "omp_max_threads" in field_names and "nthreads-var" in self.icv_map:
212*f98ee40fSTobias Hieta            ompt_max_threads = thread_data["omp_max_threads"]
213*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
214*f98ee40fSTobias Hieta                curr_thread.thread_handle,
215*f98ee40fSTobias Hieta                self.icv_map["nthreads-var"][1],
216*f98ee40fSTobias Hieta                self.icv_map["nthreads-var"][0],
217*f98ee40fSTobias Hieta            )
218d2a6e165SVignesh Balasubramanian            if icv_value is None:
219*f98ee40fSTobias Hieta                icv_string = ompdModule.call_ompd_get_icv_string_from_scope(
220*f98ee40fSTobias Hieta                    curr_thread.thread_handle,
221*f98ee40fSTobias Hieta                    self.icv_map["nthreads-var"][1],
222*f98ee40fSTobias Hieta                    self.icv_map["nthreads-var"][0],
223*f98ee40fSTobias Hieta                )
224d2a6e165SVignesh Balasubramanian                if icv_string is None:
225*f98ee40fSTobias Hieta                    print(
226*f98ee40fSTobias Hieta                        "OMPT-OMPD mismatch: omp_max_threads (%d) does not match OMPD thread limit according to ICVs (None Object)"
227*f98ee40fSTobias Hieta                        % (ompt_max_threads)
228*f98ee40fSTobias Hieta                    )
229d2a6e165SVignesh Balasubramanian                else:
230*f98ee40fSTobias Hieta                    if ompt_max_threads != int(icv_string.split(",")[0]):
231*f98ee40fSTobias Hieta                        print(
232*f98ee40fSTobias Hieta                            "OMPT-OMPD mismatch: omp_max_threads (%d) does not match OMPD thread limit according to ICVs (%d)!"
233*f98ee40fSTobias Hieta                            % (ompt_max_threads, int(icv_string.split(",")[0]))
234*f98ee40fSTobias Hieta                        )
235d2a6e165SVignesh Balasubramanian            else:
236d2a6e165SVignesh Balasubramanian                if ompt_max_threads != icv_value:
237*f98ee40fSTobias Hieta                    print(
238*f98ee40fSTobias Hieta                        "OMPT-OMPD mismatch: omp_max_threads (%d) does not match OMPD thread limit according to ICVs (%d)!"
239*f98ee40fSTobias Hieta                        % (ompt_max_threads, icv_value)
240*f98ee40fSTobias Hieta                    )
241d2a6e165SVignesh Balasubramanian
242d2a6e165SVignesh Balasubramanian        # compare omp_parallel
243d2a6e165SVignesh Balasubramanian        # NOTE: omp_parallel = true if active-levels-var > 0
244*f98ee40fSTobias Hieta        if "omp_parallel" in field_names:
245*f98ee40fSTobias Hieta            ompt_parallel = thread_data["omp_parallel"]
246*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
247*f98ee40fSTobias Hieta                curr_thread.get_current_parallel_handle(),
248*f98ee40fSTobias Hieta                self.icv_map["active-levels-var"][1],
249*f98ee40fSTobias Hieta                self.icv_map["active-levels-var"][0],
250*f98ee40fSTobias Hieta            )
251*f98ee40fSTobias Hieta            if (
252*f98ee40fSTobias Hieta                ompt_parallel == 1
253*f98ee40fSTobias Hieta                and icv_value <= 0
254*f98ee40fSTobias Hieta                or ompt_parallel == 0
255*f98ee40fSTobias Hieta                and icv_value > 0
256*f98ee40fSTobias Hieta            ):
257*f98ee40fSTobias Hieta                print(
258*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: ompt_parallel (%d) does not match OMPD parallel according to ICVs (%d)!"
259*f98ee40fSTobias Hieta                    % (ompt_parallel, icv_value)
260*f98ee40fSTobias Hieta                )
261d2a6e165SVignesh Balasubramanian
262d2a6e165SVignesh Balasubramanian        # compare omp_final
263*f98ee40fSTobias Hieta        if "omp_final" in field_names and "final-task-var" in self.icv_map:
264*f98ee40fSTobias Hieta            ompt_final = thread_data["omp_final"]
265d2a6e165SVignesh Balasubramanian            current_task_handle = curr_thread.get_current_task_handle()
266*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
267*f98ee40fSTobias Hieta                current_task_handle,
268*f98ee40fSTobias Hieta                self.icv_map["final-task-var"][1],
269*f98ee40fSTobias Hieta                self.icv_map["final-task-var"][0],
270*f98ee40fSTobias Hieta            )
271d2a6e165SVignesh Balasubramanian            if icv_value != ompt_final:
272*f98ee40fSTobias Hieta                print(
273*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: omp_final (%d) does not match OMPD final according to ICVs (%d)!"
274*f98ee40fSTobias Hieta                    % (ompt_final, icv_value)
275*f98ee40fSTobias Hieta                )
276d2a6e165SVignesh Balasubramanian
277d2a6e165SVignesh Balasubramanian        # compare omp_dynamic
278*f98ee40fSTobias Hieta        if "omp_dynamic" in field_names and "dyn-var" in self.icv_map:
279*f98ee40fSTobias Hieta            ompt_dynamic = thread_data["omp_dynamic"]
280*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
281*f98ee40fSTobias Hieta                curr_thread.thread_handle,
282*f98ee40fSTobias Hieta                self.icv_map["dyn-var"][1],
283*f98ee40fSTobias Hieta                self.icv_map["dyn-var"][0],
284*f98ee40fSTobias Hieta            )
285d2a6e165SVignesh Balasubramanian            if icv_value != ompt_dynamic:
286*f98ee40fSTobias Hieta                print(
287*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: omp_dynamic (%d) does not match OMPD dynamic according to ICVs (%d)!"
288*f98ee40fSTobias Hieta                    % (ompt_dynamic, icv_value)
289*f98ee40fSTobias Hieta                )
290d2a6e165SVignesh Balasubramanian
291d2a6e165SVignesh Balasubramanian        # compare omp_max_active_levels
292*f98ee40fSTobias Hieta        if (
293*f98ee40fSTobias Hieta            "omp_max_active_levels" in field_names
294*f98ee40fSTobias Hieta            and "max-active-levels-var" in self.icv_map
295*f98ee40fSTobias Hieta        ):
296*f98ee40fSTobias Hieta            ompt_max_active_levels = thread_data["omp_max_active_levels"]
297*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
298*f98ee40fSTobias Hieta                curr_thread.get_current_task_handle(),
299*f98ee40fSTobias Hieta                self.icv_map["max-active-levels-var"][1],
300*f98ee40fSTobias Hieta                self.icv_map["max-active-levels-var"][0],
301*f98ee40fSTobias Hieta            )
302d2a6e165SVignesh Balasubramanian            if ompt_max_active_levels != icv_value:
303*f98ee40fSTobias Hieta                print(
304*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: omp_max_active_levels (%d) does not match OMPD max active levels (%d)!"
305*f98ee40fSTobias Hieta                    % (ompt_max_active_levels, icv_value)
306*f98ee40fSTobias Hieta                )
307d2a6e165SVignesh Balasubramanian
308d2a6e165SVignesh Balasubramanian                # compare omp_kind: TODO: Add the test for monotonic/nonmonotonic modifier
309*f98ee40fSTobias Hieta        if "omp_kind" in field_names and "run-sched-var" in self.icv_map:
310*f98ee40fSTobias Hieta            ompt_sched_kind = thread_data["omp_kind"]
311*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_string_from_scope(
312*f98ee40fSTobias Hieta                curr_thread.get_current_task_handle(),
313*f98ee40fSTobias Hieta                self.icv_map["run-sched-var"][1],
314*f98ee40fSTobias Hieta                self.icv_map["run-sched-var"][0],
315*f98ee40fSTobias Hieta            )
316*f98ee40fSTobias Hieta            ompd_sched_kind = icv_value.split(",")[0]
317d2a6e165SVignesh Balasubramanian            if self.sched_map.get(int(ompt_sched_kind)) != ompd_sched_kind:
318*f98ee40fSTobias Hieta                print(
319*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: omp_kind kind (%s) does not match OMPD schedule kind according to ICVs (%s)!"
320*f98ee40fSTobias Hieta                    % (self.sched_map.get(int(ompt_sched_kind)), ompd_sched_kind)
321*f98ee40fSTobias Hieta                )
322d2a6e165SVignesh Balasubramanian
323d2a6e165SVignesh Balasubramanian        # compare omp_modifier
324*f98ee40fSTobias Hieta        if "omp_modifier" in field_names and "run-sched-var" in self.icv_map:
325*f98ee40fSTobias Hieta            ompt_sched_mod = thread_data["omp_modifier"]
326*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_string_from_scope(
327*f98ee40fSTobias Hieta                curr_thread.get_current_task_handle(),
328*f98ee40fSTobias Hieta                self.icv_map["run-sched-var"][1],
329*f98ee40fSTobias Hieta                self.icv_map["run-sched-var"][0],
330*f98ee40fSTobias Hieta            )
331*f98ee40fSTobias Hieta            token = icv_value.split(",")[1]
332d2a6e165SVignesh Balasubramanian            if token is not None:
333d2a6e165SVignesh Balasubramanian                ompd_sched_mod = int(token)
334d2a6e165SVignesh Balasubramanian            else:
335d2a6e165SVignesh Balasubramanian                ompd_sched_mod = 0
336d2a6e165SVignesh Balasubramanian            if ompt_sched_mod != ompd_sched_mod:
337*f98ee40fSTobias Hieta                print(
338*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: omp_kind modifier does not match OMPD schedule modifier according to ICVs!"
339*f98ee40fSTobias Hieta                )
340d2a6e165SVignesh Balasubramanian
341d2a6e165SVignesh Balasubramanian        # compare omp_proc_bind
342*f98ee40fSTobias Hieta        if "omp_proc_bind" in field_names and "bind-var" in self.icv_map:
343*f98ee40fSTobias Hieta            ompt_proc_bind = thread_data["omp_proc_bind"]
344*f98ee40fSTobias Hieta            icv_value = ompdModule.call_ompd_get_icv_from_scope(
345*f98ee40fSTobias Hieta                curr_thread.get_current_task_handle(),
346*f98ee40fSTobias Hieta                self.icv_map["bind-var"][1],
347*f98ee40fSTobias Hieta                self.icv_map["bind-var"][0],
348*f98ee40fSTobias Hieta            )
349d2a6e165SVignesh Balasubramanian            if icv_value is None:
350*f98ee40fSTobias Hieta                icv_string = ompdModule.call_ompd_get_icv_string_from_scope(
351*f98ee40fSTobias Hieta                    curr_thread.get_current_task_handle(),
352*f98ee40fSTobias Hieta                    self.icv_map["bind-var"][1],
353*f98ee40fSTobias Hieta                    self.icv_map["bind-var"][0],
354*f98ee40fSTobias Hieta                )
355d2a6e165SVignesh Balasubramanian                if icv_string is None:
356*f98ee40fSTobias Hieta                    print(
357*f98ee40fSTobias Hieta                        "OMPT-OMPD mismatch: omp_proc_bind (%d) does not match OMPD proc bind according to ICVs (None Object)"
358*f98ee40fSTobias Hieta                        % (ompt_proc_bind)
359*f98ee40fSTobias Hieta                    )
360d2a6e165SVignesh Balasubramanian                else:
361*f98ee40fSTobias Hieta                    if ompt_proc_bind != int(icv_string.split(",")[0]):
362*f98ee40fSTobias Hieta                        print(
363*f98ee40fSTobias Hieta                            "OMPT-OMPD mismatch: omp_proc_bind (%d) does not match OMPD proc bind according to ICVs (%d)!"
364*f98ee40fSTobias Hieta                            % (ompt_proc_bind, int(icv_string.split(",")[0]))
365*f98ee40fSTobias Hieta                        )
366d2a6e165SVignesh Balasubramanian            else:
367d2a6e165SVignesh Balasubramanian                if ompt_proc_bind != icv_value:
368*f98ee40fSTobias Hieta                    print(
369*f98ee40fSTobias Hieta                        "OMPT-OMPD mismatch: omp_proc_bind (%d) does not match OMPD proc bind according to ICVs (%d)!"
370*f98ee40fSTobias Hieta                        % (ompt_proc_bind, icv_value)
371*f98ee40fSTobias Hieta                    )
372d2a6e165SVignesh Balasubramanian
373d2a6e165SVignesh Balasubramanian        # compare enter and exit frames
374*f98ee40fSTobias Hieta        if "ompt_frame_list" in field_names:
375*f98ee40fSTobias Hieta            ompt_task_frame_dict = thread_data["ompt_frame_list"].dereference()
376*f98ee40fSTobias Hieta            ompt_task_frames = (
377*f98ee40fSTobias Hieta                int(ompt_task_frame_dict["enter_frame"].cast(gdb.lookup_type("long"))),
378*f98ee40fSTobias Hieta                int(ompt_task_frame_dict["exit_frame"].cast(gdb.lookup_type("long"))),
379*f98ee40fSTobias Hieta            )
380d2a6e165SVignesh Balasubramanian            current_task = curr_thread.get_current_task()
381d2a6e165SVignesh Balasubramanian            ompd_task_frames = current_task.get_task_frame()
382d2a6e165SVignesh Balasubramanian            if ompt_task_frames != ompd_task_frames:
383*f98ee40fSTobias Hieta                print(
384*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: ompt_task_frames (%s) do not match OMPD task frames (%s)!"
385*f98ee40fSTobias Hieta                    % (ompt_task_frames, ompd_task_frames)
386*f98ee40fSTobias Hieta                )
387d2a6e165SVignesh Balasubramanian
388d2a6e165SVignesh Balasubramanian        # compare task data
389*f98ee40fSTobias Hieta        if "ompt_task_data" in field_names:
390*f98ee40fSTobias Hieta            ompt_task_data = thread_data["ompt_task_data"].dereference()["value"]
391d2a6e165SVignesh Balasubramanian            current_task_handle = curr_thread.get_current_task_handle()
392d2a6e165SVignesh Balasubramanian            ompd_value = ompdModule.call_ompd_get_tool_data(6, current_task_handle)[0]
393d2a6e165SVignesh Balasubramanian            if ompt_task_data != ompd_value:
394*f98ee40fSTobias Hieta                print(
395*f98ee40fSTobias Hieta                    "OMPT-OMPD mismatch: value of ompt_task_data (%d) does not match that of OMPD data union (%d)!"
396*f98ee40fSTobias Hieta                    % (ompt_task_data, ompd_value)
397*f98ee40fSTobias Hieta                )
398d2a6e165SVignesh Balasubramanian
399d2a6e165SVignesh Balasubramanian    def save_thread_object(self, thread_num, thread_id, addr_space):
400*f98ee40fSTobias Hieta        """Saves thread object for thread_num inside threads dictionary."""
401d2a6e165SVignesh Balasubramanian        thread_handle = ompdModule.get_thread_handle(thread_id, addr_space)
402d2a6e165SVignesh Balasubramanian        self.threads[int(thread_num)] = ompd_thread(thread_handle)
403d2a6e165SVignesh Balasubramanian
404d2a6e165SVignesh Balasubramanian    def get_thread(self, thread_num):
405*f98ee40fSTobias Hieta        """Get thread object from map."""
406d2a6e165SVignesh Balasubramanian        return self.threads[int(thread_num)]
407d2a6e165SVignesh Balasubramanian
408d2a6e165SVignesh Balasubramanian    def get_curr_thread(self):
409*f98ee40fSTobias Hieta        """Get current thread object from map or add new one to map, if missing."""
410d2a6e165SVignesh Balasubramanian        thread_num = int(gdb.selected_thread().num)
411d2a6e165SVignesh Balasubramanian        if thread_num not in self.threads:
412d2a6e165SVignesh Balasubramanian            self.add_thread()
413d2a6e165SVignesh Balasubramanian        return self.threads[thread_num]
414d2a6e165SVignesh Balasubramanian
415d2a6e165SVignesh Balasubramanian    def add_thread(self):
416*f98ee40fSTobias Hieta        """Add currently selected (*) thread to dictionary threads."""
417d2a6e165SVignesh Balasubramanian        inf_thread = gdb.selected_thread()
418d2a6e165SVignesh Balasubramanian        try:
419d2a6e165SVignesh Balasubramanian            self.save_thread_object(inf_thread.num, inf_thread.ptid[1], self.addr_space)
420d2a6e165SVignesh Balasubramanian        except:
421d2a6e165SVignesh Balasubramanian            traceback.print_exc()
422d2a6e165SVignesh Balasubramanian
423d2a6e165SVignesh Balasubramanian    def list_threads(self, verbose):
424d2a6e165SVignesh Balasubramanian        """Prints OpenMP threads only that are being tracking inside the "threads" dictionary.
425d2a6e165SVignesh Balasubramanian        See handle_stop_event and add_thread.
426d2a6e165SVignesh Balasubramanian        """
427d2a6e165SVignesh Balasubramanian        list_tids = []
428d2a6e165SVignesh Balasubramanian        curr_inferior = gdb.selected_inferior()
429d2a6e165SVignesh Balasubramanian
430d2a6e165SVignesh Balasubramanian        for inf_thread in curr_inferior.threads():
431d2a6e165SVignesh Balasubramanian            list_tids.append((inf_thread.num, inf_thread.ptid))
432d2a6e165SVignesh Balasubramanian        if verbose:
433d2a6e165SVignesh Balasubramanian            if self.states is None:
434d2a6e165SVignesh Balasubramanian                self.enumerate_states()
435d2a6e165SVignesh Balasubramanian            for (thread_num, thread_ptid) in sorted(list_tids):
436d2a6e165SVignesh Balasubramanian                if thread_num in self.threads:
437d2a6e165SVignesh Balasubramanian                    try:
438*f98ee40fSTobias Hieta                        print(
439*f98ee40fSTobias Hieta                            "Thread %i (%i) is an OpenMP thread; state: %s"
440*f98ee40fSTobias Hieta                            % (
441*f98ee40fSTobias Hieta                                thread_num,
442*f98ee40fSTobias Hieta                                thread_ptid[1],
443*f98ee40fSTobias Hieta                                self.states[self.threads[thread_num].get_state()[0]],
444*f98ee40fSTobias Hieta                            )
445*f98ee40fSTobias Hieta                        )
446d2a6e165SVignesh Balasubramanian                    except:
447d2a6e165SVignesh Balasubramanian                        traceback.print_exc()
448d2a6e165SVignesh Balasubramanian                else:
449*f98ee40fSTobias Hieta                    print(
450*f98ee40fSTobias Hieta                        "Thread %i (%i) is no OpenMP thread"
451*f98ee40fSTobias Hieta                        % (thread_num, thread_ptid[1])
452*f98ee40fSTobias Hieta                    )
453d2a6e165SVignesh Balasubramanian
454d2a6e165SVignesh Balasubramanian    def enumerate_states(self):
455d2a6e165SVignesh Balasubramanian        """Helper function for list_threads: initializes map of OMPD states for output of
456d2a6e165SVignesh Balasubramanian        'ompd threads'.
457d2a6e165SVignesh Balasubramanian        """
458d2a6e165SVignesh Balasubramanian        if self.states is None:
459d2a6e165SVignesh Balasubramanian            self.states = {}
460d2a6e165SVignesh Balasubramanian            current = int("0x102", 0)
461d2a6e165SVignesh Balasubramanian            count = 0
462d2a6e165SVignesh Balasubramanian            more = 1
463d2a6e165SVignesh Balasubramanian
464d2a6e165SVignesh Balasubramanian            while more > 0:
465d2a6e165SVignesh Balasubramanian                tup = ompdModule.call_ompd_enumerate_states(self.addr_space, current)
466d2a6e165SVignesh Balasubramanian                (next_state, next_state_name, more) = tup
467d2a6e165SVignesh Balasubramanian
468d2a6e165SVignesh Balasubramanian                self.states[next_state] = next_state_name
469d2a6e165SVignesh Balasubramanian                current = next_state
470