xref: /llvm-project/openmp/libompd/gdb-plugin/ompd/ompd_callbacks.py (revision cf00bb007428124a0d5af596300407ec11580fb2)
1d2a6e165SVignesh Balasubramanianimport gdb
2d2a6e165SVignesh Balasubramanianimport os
3d2a6e165SVignesh Balasubramanianimport re
4d2a6e165SVignesh Balasubramanianimport traceback
5d2a6e165SVignesh Balasubramanianimport sys
6d2a6e165SVignesh Balasubramanian
7d2a6e165SVignesh Balasubramanian""" This module evaluates function parameters of those OMPD callbacks that need GDB API calls.
8d2a6e165SVignesh Balasubramanian"""
9d2a6e165SVignesh Balasubramanian
10d2a6e165SVignesh Balasubramanian""" Have the debugger print a string.
11d2a6e165SVignesh Balasubramanian"""
12f98ee40fSTobias Hieta
13f98ee40fSTobias Hieta
14d2a6e165SVignesh Balasubramaniandef _print(*args):
15d2a6e165SVignesh Balasubramanian    # args is a tuple with just one string element
16d2a6e165SVignesh Balasubramanian    print_string = args[0]
17d2a6e165SVignesh Balasubramanian    gdb.execute('printf "%s\n"' % args[0])
18d2a6e165SVignesh Balasubramanian
19f98ee40fSTobias Hieta
20d2a6e165SVignesh Balasubramanian""" Look up the address of a global symbol in the target.
21d2a6e165SVignesh Balasubramanian"""
22f98ee40fSTobias Hieta
23f98ee40fSTobias Hieta
24d2a6e165SVignesh Balasubramaniandef _sym_addr(*args):
25d2a6e165SVignesh Balasubramanian    # args is a tuple consisting of thread_id and symbol_name
26d2a6e165SVignesh Balasubramanian    thread_id = args[0]
27d2a6e165SVignesh Balasubramanian    symbol_name = args[1]
28f98ee40fSTobias Hieta    if thread_id >= 0:
29f98ee40fSTobias Hieta        gdb.execute("thread %d\n" % thread_id, to_string=True)
30d2a6e165SVignesh Balasubramanian    return int(gdb.parse_and_eval("&" + symbol_name))
31d2a6e165SVignesh Balasubramanian
32f98ee40fSTobias Hieta
33d2a6e165SVignesh Balasubramanian""" Read string from the target and copy it into the provided buffer.
34d2a6e165SVignesh Balasubramanian"""
35f98ee40fSTobias Hieta
36f98ee40fSTobias Hieta
37d2a6e165SVignesh Balasubramaniandef _read_string(*args):
38d2a6e165SVignesh Balasubramanian    # args is a tuple with just the source address
39d2a6e165SVignesh Balasubramanian    addr = args[0]
40d2a6e165SVignesh Balasubramanian    try:
41f98ee40fSTobias Hieta        buf = gdb.parse_and_eval("(unsigned char*)%li" % addr).string()
42d2a6e165SVignesh Balasubramanian    except:
43d2a6e165SVignesh Balasubramanian        traceback.print_exc()
44d2a6e165SVignesh Balasubramanian    return buf
45d2a6e165SVignesh Balasubramanian
46f98ee40fSTobias Hieta
47d2a6e165SVignesh Balasubramanian""" Read memory from the target and copy it into the provided buffer.
48d2a6e165SVignesh Balasubramanian"""
49f98ee40fSTobias Hieta
50f98ee40fSTobias Hieta
51d2a6e165SVignesh Balasubramaniandef _read(*args):
52d2a6e165SVignesh Balasubramanian    # args is a tuple consisting of address and number of bytes to be read
53d2a6e165SVignesh Balasubramanian    addr = args[0]
54d2a6e165SVignesh Balasubramanian    nbytes = args[1]
55d2a6e165SVignesh Balasubramanian    # 	print("_read(%i,%i)"%(addr, nbytes))
56d2a6e165SVignesh Balasubramanian    ret_buf = bytearray()
57d2a6e165SVignesh Balasubramanian    # 	try:
58f98ee40fSTobias Hieta    buf = gdb.parse_and_eval("(unsigned char*)%li" % addr)
59d2a6e165SVignesh Balasubramanian    for i in range(nbytes):
60d2a6e165SVignesh Balasubramanian        ret_buf.append(int(buf[i]))
61d2a6e165SVignesh Balasubramanian    # 	except:
62d2a6e165SVignesh Balasubramanian    # 		traceback.print_exc()
63d2a6e165SVignesh Balasubramanian    return ret_buf
64d2a6e165SVignesh Balasubramanian
65d2a6e165SVignesh Balasubramanian
66d2a6e165SVignesh Balasubramanian""" Get thread-specific context.
67d2a6e165SVignesh BalasubramanianReturn -1 if no match is found.
68d2a6e165SVignesh Balasubramanian"""
69f98ee40fSTobias Hieta
70f98ee40fSTobias Hieta
71d2a6e165SVignesh Balasubramaniandef _thread_context(*args):
72d2a6e165SVignesh Balasubramanian    # args is a tuple consisting of thread_id and the thread kind
73d2a6e165SVignesh Balasubramanian    thread_id = args[1]
74d2a6e165SVignesh Balasubramanian    pthread = False
75d2a6e165SVignesh Balasubramanian    lwp = False
76d2a6e165SVignesh Balasubramanian    if args[0] == 0:
77d2a6e165SVignesh Balasubramanian        pthread = True
78d2a6e165SVignesh Balasubramanian    else:
79d2a6e165SVignesh Balasubramanian        lwp = True
80f98ee40fSTobias Hieta    info = gdb.execute("info threads", to_string=True).splitlines()
81d2a6e165SVignesh Balasubramanian
82d2a6e165SVignesh Balasubramanian    for line in info:
83d2a6e165SVignesh Balasubramanian        if pthread:
84f98ee40fSTobias Hieta            m = re.search(r"(0x[a-fA-F0-9]+)", line)
85d2a6e165SVignesh Balasubramanian        elif lwp:
86f98ee40fSTobias Hieta            m = re.search(r"\([^)]*?(\d+)[^)]*?\)", line)
87*cf00bb00SEisuke Kawashima        if m is None:
88d2a6e165SVignesh Balasubramanian            continue
89d2a6e165SVignesh Balasubramanian        pid = int(m.group(1), 0)
90d2a6e165SVignesh Balasubramanian        if pid == thread_id:
91d2a6e165SVignesh Balasubramanian            return int(line[2:6], 0)
92d2a6e165SVignesh Balasubramanian    return -1
93d2a6e165SVignesh Balasubramanian
94f98ee40fSTobias Hieta
95d2a6e165SVignesh Balasubramanian""" Test info threads / list threads / how to split output to get thread id
96d2a6e165SVignesh Balasubramanianand its size.
97d2a6e165SVignesh Balasubramanian"""
98f98ee40fSTobias Hieta
99f98ee40fSTobias Hieta
100d2a6e165SVignesh Balasubramaniandef _test_threads(*args):
101f98ee40fSTobias Hieta    info = gdb.execute("info threads", to_string=True).splitlines()
102d2a6e165SVignesh Balasubramanian    for line in info[1:]:
103d2a6e165SVignesh Balasubramanian        content = line.split()
104d2a6e165SVignesh Balasubramanian        thread_id = None
105d2a6e165SVignesh Balasubramanian        # fetch pointer to id
106f98ee40fSTobias Hieta        if content[0].startswith("*"):
107f98ee40fSTobias Hieta            thread_id = content[3]
108d2a6e165SVignesh Balasubramanian        else:
109f98ee40fSTobias Hieta            thread_id = content[2]
110d2a6e165SVignesh Balasubramanian        sizeof_tid = sys.getsizeof(thread_id)
111d2a6e165SVignesh Balasubramanian        print(sizeof_tid)
112d2a6e165SVignesh Balasubramanian    print(info)
113