22from jitlog import constants as const
33from jitlog import merge_point
44from 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 )
99import base64
1010import sys
1111import re
1212
13- VERSIONS = {}
13+ PARSERS = {}
1414
1515def 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 )
3531def 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+ )
4443def 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 )
5357def 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 )
6064def 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 )
6771def 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 )
7478def 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+ )
8087def 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
92103TOKEN_REGEX = re .compile ("TargetToken\((\d+)\)" )
93104
94- @version (1 )
105+ @mark_parser (
106+ 1 ,
107+ (2 , "encodes guard failure arguments" ),
108+ )
95109def 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 )
110127def 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 )
117134def 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 )
124141def 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 )
137154def 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 )
144161def 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 )
154171def 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 )
160177def 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 )
191208def read_abort_trace (forest , trace , fileobj ):
192209 trace_id = forest .read_le_addr (fileobj )
193210 # TODO?
194211
195- @version (1 )
212+ @mark_parser (1 )
196213def read_source_code (forest , trace , fileobj ):
197214 filename = read_string (fileobj , True )
198215 count = read_le_u16 (fileobj )
0 commit comments