forked from laanwj/decuda
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdecuda.py
executable file
·93 lines (83 loc) · 3.1 KB
/
decuda.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/python
#!/usr/bin/python
# sm1_1 (G80) disassembler (decuda)
# Wladimir J. van der Laan <laanwj@gmail.com>, 2007
from CubinFile import *
from sys import stdout, stderr
import sys, getopt
from version import VERSION
def usage():
stdout.write("Decuda .cubin disassembler version %s\n" % VERSION)
stderr.write("W.J. van der Laan <laanwj@gmail.com>, 2007\n")
stderr.write("\n")
stderr.write("Usage: decuda [OPTION]... [FILE]...\n")
stderr.write("\n")
stderr.write("-p, --plain Don't colorize output\n")
stderr.write("-A, --ansi Colorize output\n")
stderr.write("-o, --output-file <x> Write disassembled kernel to file\n")
stderr.write("-h, --help Show this help screen\n")
stderr.write("-k, --kernel-name <x> Disassembly kernel name <x> of the cubin file\n")
stderr.write("-n, --kernel-number <x> Disassemble kernel number <x> of the cubin file\n")
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "phAk:n:o:", ["help", "output=","ansi","plain","kernel-name=","kernel-number="])
except getopt.GetoptError:
# print help information and exit:
usage()
sys.exit(2)
formatter = Formatter()
kid = None
num = None
of = None
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-p", "--plain"):
formatter = Formatter()
if o in ("-A", "--ansi"):
formatter = AnsiFormatter()
if o in ("-k", "--kernel-name"):
kid = a
if o in ("-n", "--kernel-number"):
num = a
if o in ("-o", "--output-file"):
of = a
if len(args) != 1:
usage()
sys.exit(2)
cu = load(args[0])
if of != None:
# Write parsable disassembly to output file
of = open(of, "w")
formatter = FileOutFormatter()
for num,kernel in enumerate(cu.kernels):
formatter.kernel(of, num, kernel.name)
of.write(".entry "+kernel.name+"\n")
of.write("{\n")
of.write(".lmem %i\n" % kernel.lmem)
of.write(".smem %i\n" % kernel.smem)
of.write(".reg %i\n" % kernel.reg)
of.write(".bar %i\n" % kernel.bar)
kernel.disassemble(of, formatter)
of.write("}\n")
of.close()
elif kid != None or num != None:
# Find out which of the kernels in the cubin to disassemble
try:
if kid != None:
kernel = cu.kernels_byname[kid]
else:
kernel = cu.kernels[int(num)]
except (LookupError,ValueError):
stderr.write("The kernel you have specified does not exist in the cubin file\n")
sys.exit(2)
formatter.kernel(sys.stdout, num, kernel.name)
kernel.disassemble(sys.stdout, formatter)
else:
# Disassemble all
for num,kernel in enumerate(cu.kernels):
formatter.kernel(sys.stdout, num, kernel.name)
kernel.disassemble(sys.stdout, formatter)
if __name__ == "__main__":
main()