Skip to content

Commit f6b38d2

Browse files
committed
Merge branch 'ppc-fix'
2 parents 35c80b7 + 4a9d676 commit f6b38d2

11 files changed

Lines changed: 138 additions & 64 deletions

File tree

jitlog/__main__.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import tempfile
44
import argparse
55
from jitlog.upload import upload as jitlog_upload
6-
from vmprofservice import get_url
6+
from vmshare import get_url
77
from jitlog.parser import parse_jitlog
88

99
try:
@@ -27,6 +27,14 @@ def build_argparser():
2727
help='program arguments'
2828
)
2929

30+
parser.add_argument('--query', '-q', dest='query',
31+
help='Select traces and pretty print them. ' \
32+
'Example: -i <file> -q "\'my_func\' in name" ' \
33+
'The query API can be found on https://vmprof.readthedocs.org'
34+
)
35+
parser.add_argument('--input', '-i', dest='input',
36+
help='Specify the file to read from. Use with in combination with --query'
37+
)
3038
parser.add_argument(
3139
'--web-auth',
3240
help='Authtoken for your acount on the server, works only when --web is used'
@@ -63,6 +71,14 @@ def main():
6371
args = parser.parse_args(sys.argv[1:])
6472
web = args.web
6573

74+
if args.input:
75+
assert args.query is not None, "Using -i requires you to specify -q"
76+
forest = parse_jitlog(args.input)
77+
q = query.new_unsafe_query(args.query)
78+
objs = q(forest)
79+
pretty_printer.write(sys.stdout, objs)
80+
sys.exit(0)
81+
6682
if args.upload:
6783
# parse_jitlog will append source code to the binary
6884
forest = parse_jitlog(args.program)

jitlog/marks.py

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,32 @@
22
from jitlog import constants as const
33
from jitlog import merge_point
44
from jitlog.objects import FlatOp, MergePoint
5-
from vmprof.binary import (read_word, read_string,
5+
from vmshare.binary import (read_word, read_string,
66
read_le_u16, read_le_u64,
77
read_le_s64, read_bytes, read_byte,
88
read_char)
99
import base64
1010
import sys
1111
import re
1212

13-
VERSIONS = {}
13+
PARSERS = {}
1414

1515
def get_reader(version, mark):
16-
return VERSIONS[version][mark]
16+
return PARSERS[mark]
1717

18-
def version(*versions):
18+
def mark_parser(*versions):
1919
def func(parser):
20-
for ver in versions:
21-
if ver not in VERSIONS:
22-
VERSIONS[ver] = {}
23-
parsers = VERSIONS[ver]
24-
#
25-
name = parser.__name__
26-
assert name.startswith("read_")
27-
name = "MARK_" + name[5:].upper()
28-
mark = getattr(const, name, -1)
29-
assert mark not in parsers, "%s for version %d has already been defined" % (parser.__name__, ver)
30-
parsers[mark] = parser
20+
# the versions are irrelevant for now
21+
name = parser.__name__
22+
assert name.startswith("read_")
23+
name = "MARK_" + name[5:].upper()
24+
mark = getattr(const, name, -1)
25+
assert mark not in PARSERS, "%s has already been defined" % (parser.__name__)
26+
PARSERS[mark] = parser
3127
return parser
3228
return func
3329

34-
@version(1)
30+
@mark_parser(1)
3531
def read_resop_meta(forest, trace, fileobj):
3632
assert len(forest.resops) == 0
3733
count = read_le_u16(fileobj)
@@ -40,87 +36,108 @@ def read_resop_meta(forest, trace, fileobj):
4036
opname = read_string(fileobj, True)
4137
forest.resops[opnum] = opname
4238

43-
@version(1)
39+
@mark_parser(
40+
1,
41+
(2, "encode jitdriver name after trace_nmr")
42+
)
4443
def read_start_trace(forest, trace, fileobj):
4544
trace_id = forest.read_le_addr(fileobj)
4645
trace_type = read_string(fileobj, True)
4746
trace_nmr = forest.read_le_addr(fileobj)
47+
# version 2 adds the jitdriver name
48+
if forest.version >= 2:
49+
jitdriver_name = read_string(fileobj, True)
50+
else:
51+
jitdriver_name = None
4852
#
4953
assert trace_id not in forest.traces
50-
forest.add_trace(trace_type, trace_id, trace_nmr)
54+
forest.add_trace(trace_type, trace_id, trace_nmr, jitdriver_name)
5155

52-
@version(1)
56+
@mark_parser(1)
5357
def read_trace(forest, trace, fileobj):
5458
assert trace is not None
5559
trace_id = forest.read_le_addr(fileobj)
5660
assert trace_id == trace.unique_id
5761
trace.start_mark(const.MARK_TRACE)
5862

59-
@version(1)
63+
@mark_parser(1)
6064
def read_trace_opt(forest, trace, fileobj):
6165
assert trace is not None
6266
trace_id = forest.read_le_addr(fileobj)
6367
assert trace_id == trace.unique_id
6468
trace.start_mark(const.MARK_TRACE_OPT)
6569

66-
@version(1)
70+
@mark_parser(1)
6771
def read_trace_asm(forest, trace, fileobj):
6872
assert trace is not None
6973
trace_id = forest.read_le_addr(fileobj)
7074
assert trace_id == trace.unique_id
7175
trace.start_mark(const.MARK_TRACE_ASM)
7276

73-
@version(1)
77+
@mark_parser(1)
7478
def read_input_args(forest, trace, fileobj):
7579
assert trace is not None
7680
argnames = read_string(fileobj, True).split(',')
7781
trace.set_inputargs(argnames)
7882

79-
@version(1)
83+
@mark_parser(
84+
1,
85+
(2, "encodes guard failure arguments"),
86+
)
8087
def read_resop(forest, trace, fileobj):
8188
assert trace is not None
8289
opnum = read_le_u16(fileobj)
8390
args = read_string(fileobj, True).split(',')
91+
failargs = None
92+
if 2 <= forest.version:
93+
failargs = read_string(fileobj, True).split(',')
8494
result = args[0]
8595
args = args[1:]
8696
assert opnum in forest.resops, "opnum is not known: " + str(opnum) + \
8797
" at binary pos " + str(hex(fileobj.tell()))
8898
opname = forest.resops[opnum]
89-
op = FlatOp(opnum, opname, args, result, None, -1)
99+
100+
op = FlatOp(opnum, opname, args, result, None, -1, failargs=failargs)
90101
trace.add_instr(op)
91102

92103
TOKEN_REGEX = re.compile("TargetToken\((\d+)\)")
93104

94-
@version(1)
105+
@mark_parser(
106+
1,
107+
(2, "encodes guard failure arguments"),
108+
)
95109
def read_resop_descr(forest, trace, fileobj):
96110
assert trace is not None
97111
opnum = read_le_u16(fileobj)
98112
args = read_string(fileobj, True).split(',')
99113
descr_number = forest.read_le_addr(fileobj)
114+
failargs = None
115+
if 2 <= forest.version:
116+
failargs = read_string(fileobj, True).split(',')
100117
descr = args[-1]
101118
result = args[0]
102119
args = args[1:-1]
103120
assert opnum in forest.resops, "opnum is not known: " + str(opnum) + \
104121
" at binary pos " + str(hex(fileobj.tell()))
105122
opname = forest.resops[opnum]
106-
op = FlatOp(opnum, opname, args, result, descr, descr_number)
123+
op = FlatOp(opnum, opname, args, result, descr, descr_number, failargs=failargs)
107124
trace.add_instr(op)
108125

109-
@version(1)
126+
@mark_parser(1)
110127
def read_asm_addr(forest, trace, fileobj):
111128
assert trace is not None
112129
addr1 = forest.read_le_addr(fileobj)
113130
addr2 = forest.read_le_addr(fileobj)
114131
trace.set_addr_bounds(addr1, addr2)
115132

116-
@version(1)
133+
@mark_parser(1)
117134
def read_asm(forest, trace, fileobj):
118135
assert trace is not None
119136
rel_pos = read_le_u16(fileobj)
120137
dump = read_bytes(fileobj)
121138
trace.set_core_dump_to_last_op(rel_pos, dump)
122139

123-
@version(1)
140+
@mark_parser(1)
124141
def read_init_merge_point(forest, trace, fileobj):
125142
count = read_le_u16(fileobj)
126143
types = []
@@ -133,14 +150,14 @@ def read_init_merge_point(forest, trace, fileobj):
133150
assert stage is not None
134151
stage.merge_point_types = types
135152

136-
@version(1)
153+
@mark_parser(1)
137154
def read_common_prefix(forest, trace, fileobj):
138155
index = ord(fileobj.read(1))
139156
prefix = read_string(fileobj, True)
140157
stage = trace.get_last_stage()
141158
stage.merge_point_types[index].set_prefix(prefix)
142159

143-
@version(1)
160+
@mark_parser(1)
144161
def read_merge_point(forest, trace, fileobj):
145162
assert trace is not None
146163
stage = trace.get_last_stage()
@@ -150,13 +167,13 @@ def read_merge_point(forest, trace, fileobj):
150167
for decoder in stage.merge_point_types }
151168
trace.add_instr(MergePoint(values))
152169

153-
@version(1)
170+
@mark_parser(1)
154171
def read_stitch_bridge(forest, trace, fileobj):
155172
descr_number = forest.read_le_addr(fileobj)
156173
addr_tgt = forest.read_le_addr(fileobj)
157174
forest.stitch_bridge(descr_number, addr_tgt)
158175

159-
@version(1)
176+
@mark_parser(1)
160177
def read_jitlog_counter(forest, trace, fileobj):
161178
addr = forest.read_le_addr(fileobj)
162179
type = read_char(fileobj)
@@ -187,12 +204,12 @@ def read_jitlog_counter(forest, trace, fileobj):
187204
" but was not recorded in the log\n" % (addr, type, count))
188205
return False
189206

190-
@version(1)
207+
@mark_parser(1)
191208
def read_abort_trace(forest, trace, fileobj):
192209
trace_id = forest.read_le_addr(fileobj)
193210
# TODO?
194211

195-
@version(1)
212+
@mark_parser(1)
196213
def read_source_code(forest, trace, fileobj):
197214
filename = read_string(fileobj, True)
198215
count = read_le_u16(fileobj)

jitlog/merge_point.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from jitlog import constants as const
2-
from vmprof.binary import read_string, read_le_u64
2+
from vmshare.binary import read_string, read_le_u64
33

44
class MergePointDecoder(object):
55
def __init__(self, sem_type):
@@ -28,7 +28,6 @@ def decode(self, fileobj):
2828

2929
def get_decoder(sem_type, gen_type, version):
3030
assert 0 <= sem_type <= const.MP_OPCODE[0]
31-
assert version == 1
3231
if gen_type == "s":
3332
return StrMergePointDecoder(sem_type)
3433
else:

0 commit comments

Comments
 (0)