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