@@ -218,11 +218,10 @@ def super_macro_analysis(
218
218
lowest = current = highest = 0
219
219
for instr in components :
220
220
if instr .cache_effects :
221
- print (
221
+ a . error (
222
222
f"Super-instruction { self .name !r} has cache effects in { instr .name !r} " ,
223
- file = sys . stderr ,
223
+ instr ,
224
224
)
225
- a .errors += 1
226
225
current -= len (instr .input_effects )
227
226
lowest = min (lowest , current )
228
227
current += len (instr .output_effects )
@@ -239,7 +238,18 @@ class Analyzer:
239
238
240
239
filename : str
241
240
src : str
242
- errors : int = 0 # TODO: add a method to print an error message
241
+ errors : int = 0
242
+
243
+ def error (self , msg : str , node : parser .Node ) -> None :
244
+ lineno = 0
245
+ if context := node .context :
246
+ # Use line number of first non-comment in the node
247
+ for token in context .owner .tokens [context .begin : context .end ]:
248
+ lineno = token .line
249
+ if token .kind != "COMMENT" :
250
+ break
251
+ print (f"{ self .filename } :{ lineno } : { msg } " , file = sys .stderr )
252
+ self .errors += 1
243
253
244
254
def __init__ (self , filename : str ):
245
255
"""Read the input file."""
@@ -303,11 +313,10 @@ def find_predictions(self) -> None:
303
313
if target_instr := self .instrs .get (target ):
304
314
target_instr .predicted = True
305
315
else :
306
- print (
316
+ self . error (
307
317
f"Unknown instruction { target !r} predicted in { instr .name !r} " ,
308
- file = sys . stderr ,
318
+ instr , # TODO: Use better location
309
319
)
310
- self .errors += 1
311
320
312
321
def map_families (self ) -> None :
313
322
"""Make instruction names back to their family, if they have one."""
@@ -316,11 +325,10 @@ def map_families(self) -> None:
316
325
if member_instr := self .instrs .get (member ):
317
326
member_instr .family = family
318
327
else :
319
- print (
328
+ self . error (
320
329
f"Unknown instruction { member !r} referenced in family { family .name !r} " ,
321
- file = sys . stderr ,
330
+ family ,
322
331
)
323
- self .errors += 1
324
332
325
333
def check_families (self ) -> None :
326
334
"""Check each family:
@@ -331,13 +339,11 @@ def check_families(self) -> None:
331
339
"""
332
340
for family in self .families .values ():
333
341
if len (family .members ) < 2 :
334
- print (f"Family { family .name !r} has insufficient members" )
335
- self .errors += 1
342
+ self .error (f"Family { family .name !r} has insufficient members" , family )
336
343
members = [member for member in family .members if member in self .instrs ]
337
344
if members != family .members :
338
345
unknown = set (family .members ) - set (members )
339
- print (f"Family { family .name !r} has unknown members: { unknown } " )
340
- self .errors += 1
346
+ self .error (f"Family { family .name !r} has unknown members: { unknown } " , family )
341
347
if len (members ) < 2 :
342
348
continue
343
349
head = self .instrs [members [0 ]]
@@ -350,18 +356,13 @@ def check_families(self) -> None:
350
356
i = len (instr .input_effects )
351
357
o = len (instr .output_effects )
352
358
if (c , i , o ) != (cache , input , output ):
353
- self .errors += 1
354
- print (
359
+ self .error (
355
360
f"Family { family .name !r} has inconsistent "
356
- f"(cache, inputs, outputs) effects:" ,
357
- file = sys .stderr ,
358
- )
359
- print (
361
+ f"(cache, inputs, outputs) effects:\n "
360
362
f" { family .members [0 ]} = { (cache , input , output )} ; "
361
363
f"{ member } = { (c , i , o )} " ,
362
- file = sys . stderr ,
364
+ family ,
363
365
)
364
- self .errors += 1
365
366
366
367
def analyze_supers (self ) -> None :
367
368
"""Analyze each super instruction."""
0 commit comments