xref: /llvm-project/openmp/libompd/gdb-plugin/ompd/ompd.py (revision 11a9ab125737e4b43a98073ccf238cef9c8501b9)
1d2a6e165SVignesh Balasubramanianimport ompdModule
2d2a6e165SVignesh Balasubramanianimport gdb
3d2a6e165SVignesh Balasubramanianimport re
4d2a6e165SVignesh Balasubramanianimport traceback
5d2a6e165SVignesh Balasubramanianfrom ompd_address_space import ompd_address_space
6d2a6e165SVignesh Balasubramanianfrom ompd_handles import ompd_thread, ompd_task, ompd_parallel
7d2a6e165SVignesh Balasubramanianfrom frame_filter import FrameFilter
8d2a6e165SVignesh Balasubramanianfrom enum import Enum
9d2a6e165SVignesh Balasubramanian
10d2a6e165SVignesh Balasubramanian
11d2a6e165SVignesh Balasubramanianaddr_space = None
12d2a6e165SVignesh Balasubramanianff = None
13d2a6e165SVignesh Balasubramanianicv_map = None
14f98ee40fSTobias Hietaompd_scope_map = {
15f98ee40fSTobias Hieta    1: "global",
16f98ee40fSTobias Hieta    2: "address_space",
17f98ee40fSTobias Hieta    3: "thread",
18f98ee40fSTobias Hieta    4: "parallel",
19f98ee40fSTobias Hieta    5: "implicit_task",
20f98ee40fSTobias Hieta    6: "task",
21f98ee40fSTobias Hieta}
22d2a6e165SVignesh Balasubramanianin_task_function = False
23d2a6e165SVignesh Balasubramanian
24f98ee40fSTobias Hieta
25d2a6e165SVignesh Balasubramanianclass ompd(gdb.Command):
26d2a6e165SVignesh Balasubramanian    def __init__(self):
27f98ee40fSTobias Hieta        super(ompd, self).__init__("ompd", gdb.COMMAND_STATUS, gdb.COMPLETE_NONE, True)
28f98ee40fSTobias Hieta
29d2a6e165SVignesh Balasubramanian
30d2a6e165SVignesh Balasubramanianclass ompd_init(gdb.Command):
31d2a6e165SVignesh Balasubramanian    """Find and initialize ompd library"""
32d2a6e165SVignesh Balasubramanian
33d2a6e165SVignesh Balasubramanian    # first parameter is command-line input, second parameter is gdb-specific data
34d2a6e165SVignesh Balasubramanian    def __init__(self):
35f98ee40fSTobias Hieta        self.__doc__ = "Find and initialize OMPD library\n usage: ompd init"
36f98ee40fSTobias Hieta        super(ompd_init, self).__init__("ompd init", gdb.COMMAND_DATA)
37d2a6e165SVignesh Balasubramanian
38d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
39d2a6e165SVignesh Balasubramanian        global addr_space
40d2a6e165SVignesh Balasubramanian        global ff
41d2a6e165SVignesh Balasubramanian        try:
42d2a6e165SVignesh Balasubramanian            try:
43d2a6e165SVignesh Balasubramanian                print(gdb.newest_frame())
44d2a6e165SVignesh Balasubramanian            except:
45d2a6e165SVignesh Balasubramanian                gdb.execute("start")
46d2a6e165SVignesh Balasubramanian            try:
47d2a6e165SVignesh Balasubramanian                lib_list = gdb.parse_and_eval("(char**)ompd_dll_locations")
48d2a6e165SVignesh Balasubramanian            except gdb.error:
49f98ee40fSTobias Hieta                raise ValueError(
50f98ee40fSTobias Hieta                    "No ompd_dll_locations symbol in execution, make sure to have an OMPD enabled OpenMP runtime"
51f98ee40fSTobias Hieta                )
52d2a6e165SVignesh Balasubramanian
53*11a9ab12SEisuke Kawashima            while not gdb.parse_and_eval("(char**)ompd_dll_locations"):
54d2a6e165SVignesh Balasubramanian                gdb.execute("tbreak ompd_dll_locations_valid")
55d2a6e165SVignesh Balasubramanian                gdb.execute("continue")
56d2a6e165SVignesh Balasubramanian
57d2a6e165SVignesh Balasubramanian            lib_list = gdb.parse_and_eval("(char**)ompd_dll_locations")
58d2a6e165SVignesh Balasubramanian
59d2a6e165SVignesh Balasubramanian            i = 0
60f98ee40fSTobias Hieta            while lib_list[i]:
61d2a6e165SVignesh Balasubramanian                ret = ompdModule.ompd_open(lib_list[i].string())
62d2a6e165SVignesh Balasubramanian                if ret == -1:
63d2a6e165SVignesh Balasubramanian                    raise ValueError("Handle of OMPD library is not a valid string!")
64d2a6e165SVignesh Balasubramanian                if ret == -2:
65d2a6e165SVignesh Balasubramanian                    print("ret == -2")
66d2a6e165SVignesh Balasubramanian                    pass  # It's ok to fail on dlopen
67d2a6e165SVignesh Balasubramanian                if ret == -3:
68d2a6e165SVignesh Balasubramanian                    print("ret == -3")
69d2a6e165SVignesh Balasubramanian                    pass  # It's ok to fail on dlsym
70d2a6e165SVignesh Balasubramanian                if ret < -10:
71d2a6e165SVignesh Balasubramanian                    raise ValueError("OMPD error code %i!" % (-10 - ret))
72d2a6e165SVignesh Balasubramanian
73d2a6e165SVignesh Balasubramanian                if ret > 0:
74d2a6e165SVignesh Balasubramanian                    print("Loaded OMPD lib successfully!")
75d2a6e165SVignesh Balasubramanian                    try:
76d2a6e165SVignesh Balasubramanian                        addr_space = ompd_address_space()
77d2a6e165SVignesh Balasubramanian                        ff = FrameFilter(addr_space)
78d2a6e165SVignesh Balasubramanian                    except:
79d2a6e165SVignesh Balasubramanian                        traceback.print_exc()
80d2a6e165SVignesh Balasubramanian                    return
81d2a6e165SVignesh Balasubramanian                i = i + 1
82d2a6e165SVignesh Balasubramanian
83d2a6e165SVignesh Balasubramanian            raise ValueError("OMPD library could not be loaded!")
84d2a6e165SVignesh Balasubramanian        except:
85d2a6e165SVignesh Balasubramanian            traceback.print_exc()
86d2a6e165SVignesh Balasubramanian
87f98ee40fSTobias Hieta
88d2a6e165SVignesh Balasubramanianclass ompd_threads(gdb.Command):
89d2a6e165SVignesh Balasubramanian    """Register thread ids of current context"""
90f98ee40fSTobias Hieta
91d2a6e165SVignesh Balasubramanian    def __init__(self):
92f98ee40fSTobias Hieta        self.__doc__ = (
93f98ee40fSTobias Hieta            "Provide information on threads of current context.\n usage: ompd threads"
94f98ee40fSTobias Hieta        )
95f98ee40fSTobias Hieta        super(ompd_threads, self).__init__("ompd threads", gdb.COMMAND_STATUS)
96d2a6e165SVignesh Balasubramanian
97d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
98d2a6e165SVignesh Balasubramanian        global addr_space
99d2a6e165SVignesh Balasubramanian        if init_error():
100d2a6e165SVignesh Balasubramanian            return
101d2a6e165SVignesh Balasubramanian        addr_space.list_threads(True)
102d2a6e165SVignesh Balasubramanian
103f98ee40fSTobias Hieta
104d2a6e165SVignesh Balasubramaniandef print_parallel_region(curr_parallel, team_size):
105d2a6e165SVignesh Balasubramanian    """Helper function for ompd_parallel_region. To print out the details of the parallel region."""
106d2a6e165SVignesh Balasubramanian    for omp_thr in range(team_size):
107d2a6e165SVignesh Balasubramanian        thread = curr_parallel.get_thread_in_parallel(omp_thr)
108d2a6e165SVignesh Balasubramanian        ompd_state = str(addr_space.states[thread.get_state()[0]])
109d2a6e165SVignesh Balasubramanian        ompd_wait_id = thread.get_state()[1]
110d2a6e165SVignesh Balasubramanian        task = curr_parallel.get_task_in_parallel(omp_thr)
111d2a6e165SVignesh Balasubramanian        task_func_addr = task.get_task_function()
112d2a6e165SVignesh Balasubramanian        # Get the function this addr belongs to
113d2a6e165SVignesh Balasubramanian        sal = gdb.find_pc_line(task_func_addr)
114d2a6e165SVignesh Balasubramanian        block = gdb.block_for_pc(task_func_addr)
115d2a6e165SVignesh Balasubramanian        while block and not block.function:
116d2a6e165SVignesh Balasubramanian            block = block.superblock
117d2a6e165SVignesh Balasubramanian        if omp_thr == 0:
118f98ee40fSTobias Hieta            print(
119f98ee40fSTobias Hieta                "%6d (master) %-37s %ld    0x%lx %-25s %-17s:%d"
120f98ee40fSTobias Hieta                % (
121f98ee40fSTobias Hieta                    omp_thr,
122f98ee40fSTobias Hieta                    ompd_state,
123f98ee40fSTobias Hieta                    ompd_wait_id,
124f98ee40fSTobias Hieta                    task_func_addr,
125f98ee40fSTobias Hieta                    block.function.print_name,
126f98ee40fSTobias Hieta                    sal.symtab.filename,
127f98ee40fSTobias Hieta                    sal.line,
128f98ee40fSTobias Hieta                )
129f98ee40fSTobias Hieta            )
130d2a6e165SVignesh Balasubramanian        else:
131f98ee40fSTobias Hieta            print(
132f98ee40fSTobias Hieta                "%6d          %-37s %ld    0x%lx %-25s %-17s:%d"
133f98ee40fSTobias Hieta                % (
134f98ee40fSTobias Hieta                    omp_thr,
135f98ee40fSTobias Hieta                    ompd_state,
136f98ee40fSTobias Hieta                    ompd_wait_id,
137f98ee40fSTobias Hieta                    task_func_addr,
138f98ee40fSTobias Hieta                    block.function.print_name,
139f98ee40fSTobias Hieta                    sal.symtab.filename,
140f98ee40fSTobias Hieta                    sal.line,
141f98ee40fSTobias Hieta                )
142f98ee40fSTobias Hieta            )
143f98ee40fSTobias Hieta
144d2a6e165SVignesh Balasubramanian
145d2a6e165SVignesh Balasubramanianclass ompd_parallel_region(gdb.Command):
146d2a6e165SVignesh Balasubramanian    """Parallel Region Details"""
147f98ee40fSTobias Hieta
148d2a6e165SVignesh Balasubramanian    def __init__(self):
149f98ee40fSTobias Hieta        self.__doc__ = "Display the details of the current and enclosing parallel regions.\n usage: ompd parallel"
150f98ee40fSTobias Hieta        super(ompd_parallel_region, self).__init__("ompd parallel", gdb.COMMAND_STATUS)
151d2a6e165SVignesh Balasubramanian
152d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
153d2a6e165SVignesh Balasubramanian        global addr_space
154d2a6e165SVignesh Balasubramanian        if init_error():
155d2a6e165SVignesh Balasubramanian            return
156d2a6e165SVignesh Balasubramanian        if addr_space.icv_map is None:
157d2a6e165SVignesh Balasubramanian            addr_space.get_icv_map()
158d2a6e165SVignesh Balasubramanian        if addr_space.states is None:
159d2a6e165SVignesh Balasubramanian            addr_space.enumerate_states()
160d2a6e165SVignesh Balasubramanian        curr_thread_handle = addr_space.get_curr_thread()
161d2a6e165SVignesh Balasubramanian        curr_parallel_handle = curr_thread_handle.get_current_parallel_handle()
162d2a6e165SVignesh Balasubramanian        curr_parallel = ompd_parallel(curr_parallel_handle)
163d2a6e165SVignesh Balasubramanian        while curr_parallel_handle is not None and curr_parallel is not None:
164f98ee40fSTobias Hieta            nest_level = ompdModule.call_ompd_get_icv_from_scope(
165f98ee40fSTobias Hieta                curr_parallel_handle,
166f98ee40fSTobias Hieta                addr_space.icv_map["levels-var"][1],
167f98ee40fSTobias Hieta                addr_space.icv_map["levels-var"][0],
168f98ee40fSTobias Hieta            )
169d2a6e165SVignesh Balasubramanian            if nest_level == 0:
170d2a6e165SVignesh Balasubramanian                break
171f98ee40fSTobias Hieta            team_size = ompdModule.call_ompd_get_icv_from_scope(
172f98ee40fSTobias Hieta                curr_parallel_handle,
173f98ee40fSTobias Hieta                addr_space.icv_map["team-size-var"][1],
174f98ee40fSTobias Hieta                addr_space.icv_map["team-size-var"][0],
175f98ee40fSTobias Hieta            )
176d2a6e165SVignesh Balasubramanian            print("")
177f98ee40fSTobias Hieta            print(
178f98ee40fSTobias Hieta                "Parallel Region: Nesting Level %d: Team Size: %d"
179f98ee40fSTobias Hieta                % (nest_level, team_size)
180f98ee40fSTobias Hieta            )
181d2a6e165SVignesh Balasubramanian            print("================================================")
182d2a6e165SVignesh Balasubramanian            print("")
183f98ee40fSTobias Hieta            print(
184f98ee40fSTobias Hieta                "OMP Thread Nbr  Thread State                     Wait Id  EntryAddr FuncName                 File:Line"
185f98ee40fSTobias Hieta            )
186f98ee40fSTobias Hieta            print(
187f98ee40fSTobias Hieta                "======================================================================================================"
188f98ee40fSTobias Hieta            )
189d2a6e165SVignesh Balasubramanian            print_parallel_region(curr_parallel, team_size)
190d2a6e165SVignesh Balasubramanian            enclosing_parallel = curr_parallel.get_enclosing_parallel()
191d2a6e165SVignesh Balasubramanian            enclosing_parallel_handle = curr_parallel.get_enclosing_parallel_handle()
192d2a6e165SVignesh Balasubramanian            curr_parallel = enclosing_parallel
193d2a6e165SVignesh Balasubramanian            curr_parallel_handle = enclosing_parallel_handle
194d2a6e165SVignesh Balasubramanian
195f98ee40fSTobias Hieta
196d2a6e165SVignesh Balasubramanianclass ompd_icvs(gdb.Command):
197d2a6e165SVignesh Balasubramanian    """ICVs"""
198f98ee40fSTobias Hieta
199d2a6e165SVignesh Balasubramanian    def __init__(self):
200f98ee40fSTobias Hieta        self.__doc__ = (
201f98ee40fSTobias Hieta            "Display the values of the Internal Control Variables.\n usage: ompd icvs"
202f98ee40fSTobias Hieta        )
203f98ee40fSTobias Hieta        super(ompd_icvs, self).__init__("ompd icvs", gdb.COMMAND_STATUS)
204d2a6e165SVignesh Balasubramanian
205d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
206d2a6e165SVignesh Balasubramanian        global addr_space
207d2a6e165SVignesh Balasubramanian        global ompd_scope_map
208d2a6e165SVignesh Balasubramanian        if init_error():
209d2a6e165SVignesh Balasubramanian            return
210d2a6e165SVignesh Balasubramanian        curr_thread_handle = addr_space.get_curr_thread()
211d2a6e165SVignesh Balasubramanian        if addr_space.icv_map is None:
212d2a6e165SVignesh Balasubramanian            addr_space.get_icv_map()
213d2a6e165SVignesh Balasubramanian        print("ICV Name                        Scope                     Value")
214d2a6e165SVignesh Balasubramanian        print("===============================================================")
215d2a6e165SVignesh Balasubramanian
216d2a6e165SVignesh Balasubramanian        try:
217d2a6e165SVignesh Balasubramanian            for icv_name in addr_space.icv_map:
218d2a6e165SVignesh Balasubramanian                scope = addr_space.icv_map[icv_name][1]
219d2a6e165SVignesh Balasubramanian                # {1:'global', 2:'address_space', 3:'thread', 4:'parallel', 5:'implicit_task', 6:'task'}
220d2a6e165SVignesh Balasubramanian                if scope == 2:
221d2a6e165SVignesh Balasubramanian                    handle = addr_space.addr_space
222d2a6e165SVignesh Balasubramanian                elif scope == 3:
223d2a6e165SVignesh Balasubramanian                    handle = curr_thread_handle.thread_handle
224d2a6e165SVignesh Balasubramanian                elif scope == 4:
225d2a6e165SVignesh Balasubramanian                    handle = curr_thread_handle.get_current_parallel_handle()
226d2a6e165SVignesh Balasubramanian                elif scope == 6:
227d2a6e165SVignesh Balasubramanian                    handle = curr_thread_handle.get_current_task_handle()
228d2a6e165SVignesh Balasubramanian                else:
229d2a6e165SVignesh Balasubramanian                    raise ValueError("Invalid scope")
230d2a6e165SVignesh Balasubramanian
231f98ee40fSTobias Hieta                if icv_name == "nthreads-var" or icv_name == "bind-var":
232d2a6e165SVignesh Balasubramanian                    icv_value = ompdModule.call_ompd_get_icv_from_scope(
233f98ee40fSTobias Hieta                        handle, scope, addr_space.icv_map[icv_name][0]
234f98ee40fSTobias Hieta                    )
235d2a6e165SVignesh Balasubramanian                    if icv_value is None:
236f98ee40fSTobias Hieta                        icv_string = ompdModule.call_ompd_get_icv_string_from_scope(
237f98ee40fSTobias Hieta                            handle, scope, addr_space.icv_map[icv_name][0]
238f98ee40fSTobias Hieta                        )
239f98ee40fSTobias Hieta                        print(
240f98ee40fSTobias Hieta                            "%-31s %-26s %s"
241f98ee40fSTobias Hieta                            % (icv_name, ompd_scope_map[scope], icv_string)
242f98ee40fSTobias Hieta                        )
243d2a6e165SVignesh Balasubramanian                    else:
244f98ee40fSTobias Hieta                        print(
245f98ee40fSTobias Hieta                            "%-31s %-26s %d"
246f98ee40fSTobias Hieta                            % (icv_name, ompd_scope_map[scope], icv_value)
247f98ee40fSTobias Hieta                        )
248d2a6e165SVignesh Balasubramanian
249f98ee40fSTobias Hieta                elif (
250f98ee40fSTobias Hieta                    icv_name == "affinity-format-var"
251f98ee40fSTobias Hieta                    or icv_name == "run-sched-var"
252f98ee40fSTobias Hieta                    or icv_name == "tool-libraries-var"
253f98ee40fSTobias Hieta                    or icv_name == "tool-verbose-init-var"
254f98ee40fSTobias Hieta                ):
255f98ee40fSTobias Hieta                    icv_string = ompdModule.call_ompd_get_icv_string_from_scope(
256f98ee40fSTobias Hieta                        handle, scope, addr_space.icv_map[icv_name][0]
257f98ee40fSTobias Hieta                    )
258f98ee40fSTobias Hieta                    print(
259f98ee40fSTobias Hieta                        "%-31s %-26s %s" % (icv_name, ompd_scope_map[scope], icv_string)
260f98ee40fSTobias Hieta                    )
261d2a6e165SVignesh Balasubramanian                else:
262f98ee40fSTobias Hieta                    icv_value = ompdModule.call_ompd_get_icv_from_scope(
263f98ee40fSTobias Hieta                        handle, scope, addr_space.icv_map[icv_name][0]
264f98ee40fSTobias Hieta                    )
265f98ee40fSTobias Hieta                    print(
266f98ee40fSTobias Hieta                        "%-31s %-26s %d" % (icv_name, ompd_scope_map[scope], icv_value)
267f98ee40fSTobias Hieta                    )
268d2a6e165SVignesh Balasubramanian        except:
269d2a6e165SVignesh Balasubramanian            traceback.print_exc()
270d2a6e165SVignesh Balasubramanian
271f98ee40fSTobias Hieta
272d2a6e165SVignesh Balasubramaniandef curr_thread():
273d2a6e165SVignesh Balasubramanian    """Helper function for ompd_step. Returns the thread object for the current thread number."""
274d2a6e165SVignesh Balasubramanian    global addr_space
275d2a6e165SVignesh Balasubramanian    if addr_space is not None:
276d2a6e165SVignesh Balasubramanian        return addr_space.threads[int(gdb.selected_thread().num)]
277d2a6e165SVignesh Balasubramanian    return None
278d2a6e165SVignesh Balasubramanian
279f98ee40fSTobias Hieta
280d2a6e165SVignesh Balasubramanianclass ompd_test(gdb.Command):
281d2a6e165SVignesh Balasubramanian    """Test area"""
282f98ee40fSTobias Hieta
283d2a6e165SVignesh Balasubramanian    def __init__(self):
284f98ee40fSTobias Hieta        self.__doc__ = "Test functionalities for correctness\n usage: ompd test"
285f98ee40fSTobias Hieta        super(ompd_test, self).__init__("ompd test", gdb.COMMAND_OBSCURE)
286d2a6e165SVignesh Balasubramanian
287d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
288d2a6e165SVignesh Balasubramanian        global addr_space
289d2a6e165SVignesh Balasubramanian        if init_error():
290d2a6e165SVignesh Balasubramanian            return
291d2a6e165SVignesh Balasubramanian        # get task function for current task of current thread
292d2a6e165SVignesh Balasubramanian        try:
293d2a6e165SVignesh Balasubramanian            current_thread = int(gdb.selected_thread().num)
294d2a6e165SVignesh Balasubramanian            current_thread_obj = addr_space.threads[current_thread]
295d2a6e165SVignesh Balasubramanian            task_function = current_thread_obj.get_current_task().get_task_function()
296d2a6e165SVignesh Balasubramanian            print("bt value:", int("0x0000000000400b6c", 0))
297d2a6e165SVignesh Balasubramanian            print("get_task_function value:", task_function)
298d2a6e165SVignesh Balasubramanian
299d2a6e165SVignesh Balasubramanian            # get task function of implicit task in current parallel region for current thread
300d2a6e165SVignesh Balasubramanian            current_parallel_obj = current_thread_obj.get_current_parallel()
301d2a6e165SVignesh Balasubramanian            task_in_parallel = current_parallel_obj.get_task_in_parallel(current_thread)
302d2a6e165SVignesh Balasubramanian            task_function_in_parallel = task_in_parallel.get_task_function()
303d2a6e165SVignesh Balasubramanian            print("task_function_in_parallel:", task_function_in_parallel)
304d2a6e165SVignesh Balasubramanian        except:
305f98ee40fSTobias Hieta            print("Task function value not found for this thread")
306f98ee40fSTobias Hieta
307d2a6e165SVignesh Balasubramanian
308d2a6e165SVignesh Balasubramanianclass ompdtestapi(gdb.Command):
309d2a6e165SVignesh Balasubramanian    """To test API's return code"""
310f98ee40fSTobias Hieta
311d2a6e165SVignesh Balasubramanian    def __init__(self):
312f98ee40fSTobias Hieta        self.__doc__ = "Test OMPD tool Interface APIs.\nUsage: ompdtestapi <api name>"
313f98ee40fSTobias Hieta        super(ompdtestapi, self).__init__("ompdtestapi", gdb.COMMAND_OBSCURE)
314d2a6e165SVignesh Balasubramanian
315d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
316d2a6e165SVignesh Balasubramanian        global addr_space
317d2a6e165SVignesh Balasubramanian        if init_error():
318f98ee40fSTobias Hieta            print("Error in Initialization.")
319d2a6e165SVignesh Balasubramanian            return
320d2a6e165SVignesh Balasubramanian        if not arg:
321d2a6e165SVignesh Balasubramanian            print("No API provided to test, eg: ompdtestapi ompd_initialize")
322d2a6e165SVignesh Balasubramanian
323d2a6e165SVignesh Balasubramanian        if arg == "ompd_get_thread_handle":
324d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
325d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
326d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_thread_handle(addr_handle, threadId)
327d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_curr_parallel_handle":
328d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
329d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
330d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
331d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_curr_parallel_handle(thread_handle)
332d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_thread_in_parallel":
333d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
334d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
335d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
336f98ee40fSTobias Hieta            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(
337f98ee40fSTobias Hieta                thread_handle
338f98ee40fSTobias Hieta            )
339d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_thread_in_parallel(parallel_handle)
340d2a6e165SVignesh Balasubramanian        elif arg == "ompd_thread_handle_compare":
341d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
342d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
343d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
344f98ee40fSTobias Hieta            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(
345f98ee40fSTobias Hieta                thread_handle
346f98ee40fSTobias Hieta            )
347f98ee40fSTobias Hieta            thread_handle1 = ompdModule.call_ompd_get_thread_in_parallel(
348f98ee40fSTobias Hieta                parallel_handle, 1
349f98ee40fSTobias Hieta            )
350f98ee40fSTobias Hieta            thread_handle2 = ompdModule.call_ompd_get_thread_in_parallel(
351f98ee40fSTobias Hieta                parallel_handle, 2
352f98ee40fSTobias Hieta            )
353d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_thread_handle_compare(thread_handle1, thread_handle1)
354d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_thread_handle_compare(thread_handle1, thread_handle2)
355d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_thread_id":
356d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
357d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
358d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
359d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_thread_id(thread_handle)
360d2a6e165SVignesh Balasubramanian        elif arg == "ompd_rel_thread_handle":
361d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
362d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
363d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
364d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_rel_thread_handle(thread_handle)
365d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_enclosing_parallel_handle":
366d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
367d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
368d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
369f98ee40fSTobias Hieta            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(
370f98ee40fSTobias Hieta                thread_handle
371f98ee40fSTobias Hieta            )
372d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_enclosing_parallel_handle(parallel_handle)
373d2a6e165SVignesh Balasubramanian        elif arg == "ompd_parallel_handle_compare":
374d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
375d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
376d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
377f98ee40fSTobias Hieta            parallel_handle1 = ompdModule.call_ompd_get_curr_parallel_handle(
378f98ee40fSTobias Hieta                thread_handle
379f98ee40fSTobias Hieta            )
380f98ee40fSTobias Hieta            parallel_handle2 = ompdModule.call_ompd_get_enclosing_parallel_handle(
381f98ee40fSTobias Hieta                parallel_handle1
382f98ee40fSTobias Hieta            )
383f98ee40fSTobias Hieta            ompdModule.test_ompd_parallel_handle_compare(
384f98ee40fSTobias Hieta                parallel_handle1, parallel_handle1
385f98ee40fSTobias Hieta            )
386f98ee40fSTobias Hieta            ompdModule.test_ompd_parallel_handle_compare(
387f98ee40fSTobias Hieta                parallel_handle1, parallel_handle2
388f98ee40fSTobias Hieta            )
389d2a6e165SVignesh Balasubramanian        elif arg == "ompd_rel_parallel_handle":
390d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
391d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
392d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
393f98ee40fSTobias Hieta            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(
394f98ee40fSTobias Hieta                thread_handle
395f98ee40fSTobias Hieta            )
396d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_rel_parallel_handle(parallel_handle)
397d2a6e165SVignesh Balasubramanian        elif arg == "ompd_initialize":
398d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_initialize()
399d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_api_version":
400d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_api_version()
401d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_version_string":
402d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_version_string()
403d2a6e165SVignesh Balasubramanian        elif arg == "ompd_finalize":
404d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_finalize()
405d2a6e165SVignesh Balasubramanian        elif arg == "ompd_process_initialize":
406d2a6e165SVignesh Balasubramanian            ompdModule.call_ompd_initialize()
407d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_process_initialize()
408d2a6e165SVignesh Balasubramanian        elif arg == "ompd_device_initialize":
409d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_device_initialize()
410d2a6e165SVignesh Balasubramanian        elif arg == "ompd_rel_address_space_handle":
411d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_rel_address_space_handle()
412d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_omp_version":
413d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
414d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_omp_version(addr_handle)
415d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_omp_version_string":
416d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
417d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_omp_version_string(addr_handle)
418d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_curr_task_handle":
419d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
420d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
421d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
422d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_curr_task_handle(thread_handle)
423d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_task_parallel_handle":
424d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
425d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
426d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
427d2a6e165SVignesh Balasubramanian            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)
428d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_task_parallel_handle(task_handle)
429d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_generating_task_handle":
430d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
431d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
432d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
433d2a6e165SVignesh Balasubramanian            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)
434d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_generating_task_handle(task_handle)
435d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_scheduling_task_handle":
436d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
437d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
438d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
439d2a6e165SVignesh Balasubramanian            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)
440d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_scheduling_task_handle(task_handle)
441d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_task_in_parallel":
442d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
443d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
444d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
445f98ee40fSTobias Hieta            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(
446f98ee40fSTobias Hieta                thread_handle
447f98ee40fSTobias Hieta            )
448d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_task_in_parallel(parallel_handle)
449d2a6e165SVignesh Balasubramanian        elif arg == "ompd_rel_task_handle":
450d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
451d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
452d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
453d2a6e165SVignesh Balasubramanian            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)
454d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_rel_task_handle(task_handle)
455d2a6e165SVignesh Balasubramanian        elif arg == "ompd_task_handle_compare":
456d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
457d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
458d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
459d2a6e165SVignesh Balasubramanian            task_handle1 = ompdModule.call_ompd_get_curr_task_handle(thread_handle)
460d2a6e165SVignesh Balasubramanian            task_handle2 = ompdModule.call_ompd_get_generating_task_handle(task_handle1)
461d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_task_handle_compare(task_handle1, task_handle2)
462d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_task_handle_compare(task_handle2, task_handle1)
463d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_task_function":
464d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
465d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
466d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
467d2a6e165SVignesh Balasubramanian            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)
468d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_task_function(task_handle)
469d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_task_frame":
470d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
471d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
472d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
473d2a6e165SVignesh Balasubramanian            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)
474d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_task_frame(task_handle)
475d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_state":
476d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
477d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
478d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
479d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_state(thread_handle)
480d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_display_control_vars":
481d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
482d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_display_control_vars(addr_handle)
483d2a6e165SVignesh Balasubramanian        elif arg == "ompd_rel_display_control_vars":
484d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_rel_display_control_vars()
485d2a6e165SVignesh Balasubramanian        elif arg == "ompd_enumerate_icvs":
486d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
487d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_enumerate_icvs(addr_handle)
488d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_icv_from_scope":
489d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
490d2a6e165SVignesh Balasubramanian            threadId = gdb.selected_thread().ptid[1]
491d2a6e165SVignesh Balasubramanian            thread_handle = ompdModule.get_thread_handle(threadId, addr_handle)
492f98ee40fSTobias Hieta            parallel_handle = ompdModule.call_ompd_get_curr_parallel_handle(
493f98ee40fSTobias Hieta                thread_handle
494f98ee40fSTobias Hieta            )
495d2a6e165SVignesh Balasubramanian            task_handle = ompdModule.call_ompd_get_curr_task_handle(thread_handle)
496d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_icv_from_scope_with_addr_handle(addr_handle)
497d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_icv_from_scope_with_thread_handle(thread_handle)
498f98ee40fSTobias Hieta            ompdModule.test_ompd_get_icv_from_scope_with_parallel_handle(
499f98ee40fSTobias Hieta                parallel_handle
500f98ee40fSTobias Hieta            )
501d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_icv_from_scope_with_task_handle(task_handle)
502d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_icv_string_from_scope":
503d2a6e165SVignesh Balasubramanian            addr_handle = addr_space.addr_space
504d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_icv_string_from_scope(addr_handle)
505d2a6e165SVignesh Balasubramanian        elif arg == "ompd_get_tool_data":
506d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_get_tool_data()
507d2a6e165SVignesh Balasubramanian        elif arg == "ompd_enumerate_states":
508d2a6e165SVignesh Balasubramanian            ompdModule.test_ompd_enumerate_states()
509d2a6e165SVignesh Balasubramanian        else:
510d2a6e165SVignesh Balasubramanian            print("Invalid API.")
511d2a6e165SVignesh Balasubramanian
512d2a6e165SVignesh Balasubramanian
513d2a6e165SVignesh Balasubramanianclass ompd_bt(gdb.Command):
514d2a6e165SVignesh Balasubramanian    """Turn filter for 'bt' on/off for output to only contain frames relevant to the application or all frames."""
515f98ee40fSTobias Hieta
516d2a6e165SVignesh Balasubramanian    def __init__(self):
517d2a6e165SVignesh Balasubramanian        self.__doc__ = 'Turn filter for "bt" output on or off. Specify "on continued" option to trace worker threads back to master threads.\n usage: ompd bt on|on continued|off'
518f98ee40fSTobias Hieta        super(ompd_bt, self).__init__("ompd bt", gdb.COMMAND_STACK)
519d2a6e165SVignesh Balasubramanian
520d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
521d2a6e165SVignesh Balasubramanian        global ff
522d2a6e165SVignesh Balasubramanian        global addr_space
523d2a6e165SVignesh Balasubramanian        global icv_map
524d2a6e165SVignesh Balasubramanian        global ompd_scope_map
525d2a6e165SVignesh Balasubramanian        if init_error():
526d2a6e165SVignesh Balasubramanian            return
527d2a6e165SVignesh Balasubramanian        if icv_map is None:
528d2a6e165SVignesh Balasubramanian            icv_map = {}
529d2a6e165SVignesh Balasubramanian            current = 0
530d2a6e165SVignesh Balasubramanian            more = 1
531d2a6e165SVignesh Balasubramanian            while more > 0:
532f98ee40fSTobias Hieta                tup = ompdModule.call_ompd_enumerate_icvs(
533f98ee40fSTobias Hieta                    addr_space.addr_space, current
534f98ee40fSTobias Hieta                )
535d2a6e165SVignesh Balasubramanian                (current, next_icv, next_scope, more) = tup
536d2a6e165SVignesh Balasubramanian                icv_map[next_icv] = (current, next_scope, ompd_scope_map[next_scope])
537d2a6e165SVignesh Balasubramanian            print('Initialized ICV map successfully for filtering "bt".')
538d2a6e165SVignesh Balasubramanian
539d2a6e165SVignesh Balasubramanian        arg_list = gdb.string_to_argv(arg)
540d2a6e165SVignesh Balasubramanian        if len(arg_list) == 0:
541f98ee40fSTobias Hieta            print(
542f98ee40fSTobias Hieta                'When calling "ompd bt", you must either specify "on", "on continued" or "off". Check "help ompd".'
543f98ee40fSTobias Hieta            )
544f98ee40fSTobias Hieta        elif len(arg_list) == 1 and arg_list[0] == "on":
545d2a6e165SVignesh Balasubramanian            addr_space.list_threads(False)
546d2a6e165SVignesh Balasubramanian            ff.set_switch(True)
547d2a6e165SVignesh Balasubramanian            ff.set_switch_continue(False)
548f98ee40fSTobias Hieta        elif arg_list[0] == "on" and arg_list[1] == "continued":
549d2a6e165SVignesh Balasubramanian            ff.set_switch(True)
550d2a6e165SVignesh Balasubramanian            ff.set_switch_continue(True)
551f98ee40fSTobias Hieta        elif len(arg_list) == 1 and arg_list[0] == "off":
552d2a6e165SVignesh Balasubramanian            ff.set_switch(False)
553d2a6e165SVignesh Balasubramanian            ff.set_switch_continue(False)
554d2a6e165SVignesh Balasubramanian        else:
555f98ee40fSTobias Hieta            print(
556f98ee40fSTobias Hieta                'When calling "ompd bt", you must either specify "on", "on continued" or "off". Check "help ompd".'
557f98ee40fSTobias Hieta            )
558f98ee40fSTobias Hieta
559d2a6e165SVignesh Balasubramanian
560d2a6e165SVignesh Balasubramanian# TODO: remove
561d2a6e165SVignesh Balasubramanianclass ompd_taskframes(gdb.Command):
562d2a6e165SVignesh Balasubramanian    """Prints task handles for relevant task frames. Meant for debugging."""
563f98ee40fSTobias Hieta
564d2a6e165SVignesh Balasubramanian    def __init__(self):
565f98ee40fSTobias Hieta        self.__doc__ = "Prints list of tasks.\nUsage: ompd taskframes"
566f98ee40fSTobias Hieta        super(ompd_taskframes, self).__init__("ompd taskframes", gdb.COMMAND_STACK)
567d2a6e165SVignesh Balasubramanian
568d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
569d2a6e165SVignesh Balasubramanian        global addr_space
570d2a6e165SVignesh Balasubramanian        if init_error():
571d2a6e165SVignesh Balasubramanian            return
572d2a6e165SVignesh Balasubramanian        frame = gdb.newest_frame()
573f98ee40fSTobias Hieta        while frame:
574f98ee40fSTobias Hieta            print(frame.read_register("sp"))
575d2a6e165SVignesh Balasubramanian            frame = frame.older()
576d2a6e165SVignesh Balasubramanian        curr_task_handle = None
577f98ee40fSTobias Hieta        if addr_space.threads and addr_space.threads.get(gdb.selected_thread().num):
578d2a6e165SVignesh Balasubramanian            curr_thread_handle = curr_thread().thread_handle
579f98ee40fSTobias Hieta            curr_task_handle = ompdModule.call_ompd_get_curr_task_handle(
580f98ee40fSTobias Hieta                curr_thread_handle
581f98ee40fSTobias Hieta            )
582f98ee40fSTobias Hieta        if not curr_task_handle:
583d2a6e165SVignesh Balasubramanian            return None
584d2a6e165SVignesh Balasubramanian        prev_frames = None
585d2a6e165SVignesh Balasubramanian        try:
586f98ee40fSTobias Hieta            while 1:
587f98ee40fSTobias Hieta                frames_with_flags = ompdModule.call_ompd_get_task_frame(
588f98ee40fSTobias Hieta                    curr_task_handle
589f98ee40fSTobias Hieta                )
590d2a6e165SVignesh Balasubramanian                frames = (frames_with_flags[0], frames_with_flags[3])
591f98ee40fSTobias Hieta                if prev_frames == frames:
592d2a6e165SVignesh Balasubramanian                    break
593f98ee40fSTobias Hieta                if not isinstance(frames, tuple):
594d2a6e165SVignesh Balasubramanian                    break
595d2a6e165SVignesh Balasubramanian                (ompd_enter_frame, ompd_exit_frame) = frames
596d2a6e165SVignesh Balasubramanian                print(hex(ompd_enter_frame), hex(ompd_exit_frame))
597f98ee40fSTobias Hieta                curr_task_handle = ompdModule.call_ompd_get_scheduling_task_handle(
598f98ee40fSTobias Hieta                    curr_task_handle
599f98ee40fSTobias Hieta                )
600d2a6e165SVignesh Balasubramanian                prev_frames = frames
601f98ee40fSTobias Hieta                if not curr_task_handle:
602d2a6e165SVignesh Balasubramanian                    break
603d2a6e165SVignesh Balasubramanian        except:
604d2a6e165SVignesh Balasubramanian            traceback.print_exc()
605d2a6e165SVignesh Balasubramanian
606f98ee40fSTobias Hieta
607d2a6e165SVignesh Balasubramaniandef print_and_exec(string):
608d2a6e165SVignesh Balasubramanian    """Helper function for ompd_step. Executes the given command in GDB and prints it."""
609d2a6e165SVignesh Balasubramanian    print(string)
610d2a6e165SVignesh Balasubramanian    gdb.execute(string)
611d2a6e165SVignesh Balasubramanian
612f98ee40fSTobias Hieta
613d2a6e165SVignesh Balasubramanianclass TempFrameFunctionBp(gdb.Breakpoint):
614d2a6e165SVignesh Balasubramanian    """Helper class for ompd_step. Defines stop function for breakpoint on frame function."""
615f98ee40fSTobias Hieta
616d2a6e165SVignesh Balasubramanian    def stop(self):
617d2a6e165SVignesh Balasubramanian        global in_task_function
618d2a6e165SVignesh Balasubramanian        in_task_function = True
619d2a6e165SVignesh Balasubramanian        self.enabled = False
620d2a6e165SVignesh Balasubramanian
621f98ee40fSTobias Hieta
622d2a6e165SVignesh Balasubramanianclass ompd_step(gdb.Command):
623d2a6e165SVignesh Balasubramanian    """Executes 'step' and skips frames irrelevant to the application / the ones without debug information."""
624f98ee40fSTobias Hieta
625d2a6e165SVignesh Balasubramanian    def __init__(self):
626d2a6e165SVignesh Balasubramanian        self.__doc__ = 'Executes "step" and skips runtime frames as much as possible.'
627f98ee40fSTobias Hieta        super(ompd_step, self).__init__("ompd step", gdb.COMMAND_STACK)
628d2a6e165SVignesh Balasubramanian
629d2a6e165SVignesh Balasubramanian    class TaskBeginBp(gdb.Breakpoint):
630d2a6e165SVignesh Balasubramanian        """Helper class. Defines stop function for breakpoint ompd_bp_task_begin."""
631f98ee40fSTobias Hieta
632d2a6e165SVignesh Balasubramanian        def stop(self):
633d2a6e165SVignesh Balasubramanian            try:
634d2a6e165SVignesh Balasubramanian                code_line = curr_thread().get_current_task().get_task_function()
635f98ee40fSTobias Hieta                frame_fct_bp = TempFrameFunctionBp(
636f98ee40fSTobias Hieta                    ("*%i" % code_line), temporary=True, internal=True
637f98ee40fSTobias Hieta                )
638d2a6e165SVignesh Balasubramanian                frame_fct_bp.thread = self.thread
639d2a6e165SVignesh Balasubramanian                return False
640d2a6e165SVignesh Balasubramanian            except:
641d2a6e165SVignesh Balasubramanian                return False
642d2a6e165SVignesh Balasubramanian
643d2a6e165SVignesh Balasubramanian    def invoke(self, arg, from_tty):
644d2a6e165SVignesh Balasubramanian        global in_task_function
645d2a6e165SVignesh Balasubramanian        if init_error():
646d2a6e165SVignesh Balasubramanian            return
647f98ee40fSTobias Hieta        tbp = self.TaskBeginBp("ompd_bp_task_begin", temporary=True, internal=True)
648d2a6e165SVignesh Balasubramanian        tbp.thread = int(gdb.selected_thread().num)
649f98ee40fSTobias Hieta        print_and_exec("step")
650d2a6e165SVignesh Balasubramanian        while gdb.selected_frame().find_sal().symtab is None:
651d2a6e165SVignesh Balasubramanian            if not in_task_function:
652f98ee40fSTobias Hieta                print_and_exec("finish")
653d2a6e165SVignesh Balasubramanian            else:
654f98ee40fSTobias Hieta                print_and_exec("si")
655f98ee40fSTobias Hieta
656d2a6e165SVignesh Balasubramanian
657d2a6e165SVignesh Balasubramaniandef init_error():
658d2a6e165SVignesh Balasubramanian    global addr_space
659d2a6e165SVignesh Balasubramanian    if (gdb.selected_thread() is None) or (addr_space is None) or (not addr_space):
660d2a6e165SVignesh Balasubramanian        print("Run 'ompd init' before running any of the ompd commands")
661d2a6e165SVignesh Balasubramanian        return True
662d2a6e165SVignesh Balasubramanian    return False
663d2a6e165SVignesh Balasubramanian
664f98ee40fSTobias Hieta
665d2a6e165SVignesh Balasubramaniandef main():
666d2a6e165SVignesh Balasubramanian    ompd()
667d2a6e165SVignesh Balasubramanian    ompd_init()
668d2a6e165SVignesh Balasubramanian    ompd_threads()
669d2a6e165SVignesh Balasubramanian    ompd_icvs()
670d2a6e165SVignesh Balasubramanian    ompd_parallel_region()
671d2a6e165SVignesh Balasubramanian    ompd_test()
672d2a6e165SVignesh Balasubramanian    ompdtestapi()
673d2a6e165SVignesh Balasubramanian    ompd_taskframes()
674d2a6e165SVignesh Balasubramanian    ompd_bt()
675d2a6e165SVignesh Balasubramanian    ompd_step()
676d2a6e165SVignesh Balasubramanian
677f98ee40fSTobias Hieta
678d2a6e165SVignesh Balasubramanianif __name__ == "__main__":
679d2a6e165SVignesh Balasubramanian    try:
680d2a6e165SVignesh Balasubramanian        main()
681d2a6e165SVignesh Balasubramanian    except:
682d2a6e165SVignesh Balasubramanian        traceback.print_exc()
683d2a6e165SVignesh Balasubramanian
684d2a6e165SVignesh Balasubramanian# NOTE: test code using:
685d2a6e165SVignesh Balasubramanian# OMP_NUM_THREADS=... gdb a.out -x ../../projects/gdb_plugin/gdb-ompd/__init__.py
686d2a6e165SVignesh Balasubramanian# ompd init
687d2a6e165SVignesh Balasubramanian# ompd threads
688