Franck Pommereau

added source filename:lineno in output

1 - * cparse.py: add lineno to nodes 1 +General:
2 - * cttc.py & cx86.py: output lineno as comments 2 +
3 * make a cleaner parser 3 * make a cleaner parser
4 - * use preprocessor 4 +
5 +TTC:
5 * make stdlib 6 * make stdlib
6 * load extern symbols from stdlib (declared in .h) 7 * load extern symbols from stdlib (declared in .h)
8 +
9 +x86:
......
...@@ -20,9 +20,16 @@ class Node: ...@@ -20,9 +20,16 @@ class Node:
20 self.colno = colno 20 self.colno = colno
21 self.filename = filename 21 self.filename = filename
22 22
23 - def loc (self) : 23 + def loc (self, col=False) :
24 - return "%s:%s:%s" % (self.filename, self.lineno, self.colno) 24 + if col :
25 - 25 + return "%s:%s:%s" % (self.filename, self.lineno, self.colno)
26 + else :
27 + return "%s:%s" % (self.filename, self.lineno)
28 + def getpos (self) :
29 + return {"lineno" : self.lineno,
30 + "colno" : self.colno,
31 + "filename" : self.filename}
32 +
26 def is_null(self): 33 def is_null(self):
27 """Returns whether the node represents a null node.""" 34 """Returns whether the node represents a null node."""
28 35
......
...@@ -250,11 +250,11 @@ def t_WHITESPACE(t): ...@@ -250,11 +250,11 @@ def t_WHITESPACE(t):
250 250
251 def t_NEWLINE(t): 251 def t_NEWLINE(t):
252 r'\n+' 252 r'\n+'
253 - t.lineno += len(t.value) 253 + t.lexer.lineno += len(t.value)
254 254
255 def t_COMMENT(t): 255 def t_COMMENT(t):
256 r'/\*[\w\W]*?\*/' 256 r'/\*[\w\W]*?\*/'
257 - t.lineno += t.value.count('\n') 257 + t.lexer.lineno += t.value.count('\n')
258 pass 258 pass
259 259
260 # --------------------------------------------------------------- 260 # ---------------------------------------------------------------
......
This diff is collapsed. Click to expand it.
...@@ -142,6 +142,11 @@ class CodeGenVisitor (Visitor) : ...@@ -142,6 +142,11 @@ class CodeGenVisitor (Visitor) :
142 def c(self, str, indent_amt=2): 142 def c(self, str, indent_amt=2):
143 self.curr_str.write("\n # %s\n\n" % str) 143 self.curr_str.write("\n # %s\n\n" % str)
144 144
145 + def _loc(self, node, comment="") :
146 + if node.lineno != self._last_lineno or comment :
147 + self._last_lineno = node.lineno
148 + self.curr_str.write("# %s %s\n" % (node.loc(), comment))
149 +
145 def vNodeList(self, node): 150 def vNodeList(self, node):
146 self._visitList(node.nodes) 151 self._visitList(node.nodes)
147 152
...@@ -158,6 +163,7 @@ class CodeGenVisitor (Visitor) : ...@@ -158,6 +163,7 @@ class CodeGenVisitor (Visitor) :
158 163
159 def vStatementList(self, node): 164 def vStatementList(self, node):
160 for n in node.nodes: 165 for n in node.nodes:
166 + self._loc(n)
161 self._accept_and_empty_stack(n) 167 self._accept_and_empty_stack(n)
162 168
163 def _generate_global_variable_definitions(self, node): 169 def _generate_global_variable_definitions(self, node):
...@@ -169,6 +175,7 @@ class CodeGenVisitor (Visitor) : ...@@ -169,6 +175,7 @@ class CodeGenVisitor (Visitor) :
169 return globals_str 175 return globals_str
170 176
171 def vTranslationUnit(self, node): 177 def vTranslationUnit(self, node):
178 + self._last_lineno = None
172 self.curr_str = io.StringIO() 179 self.curr_str = io.StringIO()
173 self.globals_str = self._generate_global_variable_definitions(node) 180 self.globals_str = self._generate_global_variable_definitions(node)
174 self._visitList(node.nodes) 181 self._visitList(node.nodes)
...@@ -239,6 +246,7 @@ class CodeGenVisitor (Visitor) : ...@@ -239,6 +246,7 @@ class CodeGenVisitor (Visitor) :
239 stack_frame_size = self._calc_function_var_addrs(node.symtab, 0) 246 stack_frame_size = self._calc_function_var_addrs(node.symtab, 0)
240 line = self._fill_line("BEGIN FUNCTION: %s()" % node.name) 247 line = self._fill_line("BEGIN FUNCTION: %s()" % node.name)
241 self.c("%s\n #\n # Function type: %s" % (line, node.type.get_string()), 0) 248 self.c("%s\n #\n # Function type: %s" % (line, node.type.get_string()), 0)
249 + self._loc(node, "(enter function)")
242 self.o("%s:" % node.compile_loc) 250 self.o("%s:" % node.compile_loc)
243 self.o(" push BP", "Save old frame pointer") 251 self.o(" push BP", "Save old frame pointer")
244 self.o(" mov SP BP", "Set new frame pointer") 252 self.o(" mov SP BP", "Set new frame pointer")
...@@ -255,6 +263,7 @@ class CodeGenVisitor (Visitor) : ...@@ -255,6 +263,7 @@ class CodeGenVisitor (Visitor) :
255 self.o(" sub R9 SP SP", "... shift SP") 263 self.o(" sub R9 SP SP", "... shift SP")
256 self.stack.save_callee_saves() 264 self.stack.save_callee_saves()
257 self.curr_str.write(function_str.getvalue()) 265 self.curr_str.write(function_str.getvalue())
266 + self._loc(node, "(exit function)")
258 self.o("%s:" % self.curr_func_end_label) 267 self.o("%s:" % self.curr_func_end_label)
259 self.stack.load_callee_saves() 268 self.stack.load_callee_saves()
260 self.o(" mov BP SP", "Deallocate local+temp vars") 269 self.o(" mov BP SP", "Deallocate local+temp vars")
...@@ -264,9 +273,11 @@ class CodeGenVisitor (Visitor) : ...@@ -264,9 +273,11 @@ class CodeGenVisitor (Visitor) :
264 self.c(line, 0) 273 self.c(line, 0)
265 274
266 def vCompoundStatement(self, node): 275 def vCompoundStatement(self, node):
276 + self._loc(node)
267 node.statement_list.accept(self) 277 node.statement_list.accept(self)
268 278
269 def vIfStatement(self, node): 279 def vIfStatement(self, node):
280 + self._loc(node)
270 done_label = self.new_label() + "_done" 281 done_label = self.new_label() + "_done"
271 if not node.else_stmt.is_null(): 282 if not node.else_stmt.is_null():
272 else_label = self.new_label() + "_else" 283 else_label = self.new_label() + "_else"
...@@ -300,6 +311,7 @@ class CodeGenVisitor (Visitor) : ...@@ -300,6 +311,7 @@ class CodeGenVisitor (Visitor) :
300 self.continue_labels.pop() 311 self.continue_labels.pop()
301 312
302 def vWhileLoop(self, node): 313 def vWhileLoop(self, node):
314 + self._loc(node)
303 test_label = self.new_label() + "_test" 315 test_label = self.new_label() + "_test"
304 done_label = self.new_label() + "_done" 316 done_label = self.new_label() + "_done"
305 self._push_loop_labels(break_label=done_label, 317 self._push_loop_labels(break_label=done_label,
...@@ -319,6 +331,7 @@ class CodeGenVisitor (Visitor) : ...@@ -319,6 +331,7 @@ class CodeGenVisitor (Visitor) :
319 self._pop_loop_labels() 331 self._pop_loop_labels()
320 332
321 def vForLoop(self, node): 333 def vForLoop(self, node):
334 + self._loc(node)
322 test_label = self.new_label() + "_test" 335 test_label = self.new_label() + "_test"
323 done_label = self.new_label() + "_done" 336 done_label = self.new_label() + "_done"
324 self._push_loop_labels(break_label=done_label, 337 self._push_loop_labels(break_label=done_label,
...@@ -340,10 +353,12 @@ class CodeGenVisitor (Visitor) : ...@@ -340,10 +353,12 @@ class CodeGenVisitor (Visitor) :
340 self._pop_loop_labels() 353 self._pop_loop_labels()
341 354
342 def vBreakStatement(self, node): 355 def vBreakStatement(self, node):
356 + self._loc(node)
343 self.o(" set R9 @%s" % self.break_labels[-1], "Loop: break statement") 357 self.o(" set R9 @%s" % self.break_labels[-1], "Loop: break statement")
344 self.o(" jmp R9", "... jump to loop exit") 358 self.o(" jmp R9", "... jump to loop exit")
345 359
346 def vContinueStatement(self, node): 360 def vContinueStatement(self, node):
361 + self._loc(node)
347 self.o(" set R9 @%s" % self.continue_labels[-1], "Loop: continue statement") 362 self.o(" set R9 @%s" % self.continue_labels[-1], "Loop: continue statement")
348 self.o(" jmp R9", "... jump to loop start") 363 self.o(" jmp R9", "... jump to loop start")
349 364
...@@ -359,6 +374,7 @@ class CodeGenVisitor (Visitor) : ...@@ -359,6 +374,7 @@ class CodeGenVisitor (Visitor) :
359 return label_str 374 return label_str
360 375
361 def vStringLiteral(self, node): 376 def vStringLiteral(self, node):
377 + self._loc(node)
362 label_str = self._get_new_str_literal_label(node.get_str()) 378 label_str = self._get_new_str_literal_label(node.get_str())
363 COMMENT_CHARS = 7 379 COMMENT_CHARS = 7
364 comment_label = node.get_sanitized_str() 380 comment_label = node.get_sanitized_str()
...@@ -368,10 +384,12 @@ class CodeGenVisitor (Visitor) : ...@@ -368,10 +384,12 @@ class CodeGenVisitor (Visitor) :
368 "Get addr of string literal '%s'" % comment_label) 384 "Get addr of string literal '%s'" % comment_label)
369 385
370 def vConst(self, node): 386 def vConst(self, node):
387 + self._loc(node)
371 self.o(" set %s %X" % (self.stack.push(), node.value), 388 self.o(" set %s %X" % (self.stack.push(), node.value),
372 "Load numeric constant %d" % node.value) 389 "Load numeric constant %d" % node.value)
373 390
374 def vId(self, node): 391 def vId(self, node):
392 + self._loc(node)
375 if node.output_addr: 393 if node.output_addr:
376 if isinstance(node.symbol.compile_loc, int) : 394 if isinstance(node.symbol.compile_loc, int) :
377 self.o(" set R9 %X" % node.symbol.compile_loc, 395 self.o(" set R9 %X" % node.symbol.compile_loc,
...@@ -392,6 +410,7 @@ class CodeGenVisitor (Visitor) : ...@@ -392,6 +410,7 @@ class CodeGenVisitor (Visitor) :
392 self.o(" ld %s %s" % (reg, reg), "Get value of %s" % node.symbol.name) 410 self.o(" ld %s %s" % (reg, reg), "Get value of %s" % node.symbol.name)
393 411
394 def vArrayExpression(self, node): 412 def vArrayExpression(self, node):
413 + self._loc(node)
395 node.expr.accept(self) 414 node.expr.accept(self)
396 node.index.accept(self) 415 node.index.accept(self)
397 reg_index = self.stack.pop() 416 reg_index = self.stack.pop()
...@@ -404,6 +423,7 @@ class CodeGenVisitor (Visitor) : ...@@ -404,6 +423,7 @@ class CodeGenVisitor (Visitor) :
404 self.o(" ld %s %s" % (reg_to, reg_to), "Load array value") 423 self.o(" ld %s %s" % (reg_to, reg_to), "Load array value")
405 424
406 def vFunctionExpression(self, node): 425 def vFunctionExpression(self, node):
426 + self._loc(node)
407 if self.test and node.function.symbol.name == "TTCTEST" : 427 if self.test and node.function.symbol.name == "TTCTEST" :
408 call = node.arglist.nodes[0].get_str() 428 call = node.arglist.nodes[0].get_str()
409 expect = self.test[call] 429 expect = self.test[call]
...@@ -433,6 +453,7 @@ class CodeGenVisitor (Visitor) : ...@@ -433,6 +453,7 @@ class CodeGenVisitor (Visitor) :
433 self.c("FUNCTION CALL to %s() - end" % node.function.symbol.name) 453 self.c("FUNCTION CALL to %s() - end" % node.function.symbol.name)
434 454
435 def vReturnStatement(self, node): 455 def vReturnStatement(self, node):
456 + self._loc(node)
436 return_reg = self._accept_and_pop(node.expr) 457 return_reg = self._accept_and_pop(node.expr)
437 self.o(" mov %s R0" % return_reg, "Set return value") 458 self.o(" mov %s R0" % return_reg, "Set return value")
438 self.o(" set R9 @%s" % self.curr_func_end_label, 459 self.o(" set R9 @%s" % self.curr_func_end_label,
...@@ -526,6 +547,7 @@ class CodeGenVisitor (Visitor) : ...@@ -526,6 +547,7 @@ class CodeGenVisitor (Visitor) :
526 raise Exception("unsupported comparison %r" % node.op) 547 raise Exception("unsupported comparison %r" % node.op)
527 548
528 def vBinop(self, node): 549 def vBinop(self, node):
550 + self._loc(node)
529 if node.op in cparse.Binop.ASSIGN_OPS: 551 if node.op in cparse.Binop.ASSIGN_OPS:
530 self._binop_assign(node) 552 self._binop_assign(node)
531 elif node.op in ['+','-','*']: 553 elif node.op in ['+','-','*']:
...@@ -534,11 +556,13 @@ class CodeGenVisitor (Visitor) : ...@@ -534,11 +556,13 @@ class CodeGenVisitor (Visitor) :
534 self._binop_compare(node) 556 self._binop_compare(node)
535 557
536 def vNegative(self, node): 558 def vNegative(self, node):
559 + self._loc(node)
537 node.expr.accept(self) 560 node.expr.accept(self)
538 reg = self.stack.peek() 561 reg = self.stack.peek()
539 self.o(" neg %s %s" % (reg, reg), "Perform unary negation") 562 self.o(" neg %s %s" % (reg, reg), "Perform unary negation")
540 563
541 def vPointer(self, node): 564 def vPointer(self, node):
565 + self._loc(node)
542 node.expr.accept(self) 566 node.expr.accept(self)
543 if node.output_addr: 567 if node.output_addr:
544 self.o("", "(Getting pointer target addr via '*')") 568 self.o("", "(Getting pointer target addr via '*')")
...@@ -549,6 +573,7 @@ class CodeGenVisitor (Visitor) : ...@@ -549,6 +573,7 @@ class CodeGenVisitor (Visitor) :
549 self.stack.done() 573 self.stack.done()
550 574
551 def vAddrOf(self, node): 575 def vAddrOf(self, node):
576 + self._loc(node)
552 node.expr.accept(self) 577 node.expr.accept(self)
553 self.o("", "(Address-of operator '&' used here)") 578 self.o("", "(Address-of operator '&' used here)")
554 579
...@@ -558,6 +583,6 @@ def compile (path) : ...@@ -558,6 +583,6 @@ def compile (path) :
558 583
559 def cpp (args, path) : 584 def cpp (args, path) :
560 if args.test : 585 if args.test :
561 - return ["cpp", "-P", "-D", "TTC", path] 586 + return ["cpp", "-D", "TTC", path]
562 else : 587 else :
563 - return ["cpp", "-P", path] 588 + return ["cpp", path]
......
...@@ -478,7 +478,13 @@ class CodeGenVisitor(Visitor): ...@@ -478,7 +478,13 @@ class CodeGenVisitor(Visitor):
478 478
479 self.o("\n%s# %s\n" % (indent, str)) 479 self.o("\n%s# %s\n" % (indent, str))
480 480
481 + def _loc(self, node, comment="") :
482 + if node.lineno != self._last_lineno or comment :
483 + self._last_lineno = node.lineno
484 + self.curr_str.write("# %s %s\n" % (node.loc(), comment))
485 +
481 def vNodeList(self, node): 486 def vNodeList(self, node):
487 + self._loc(node)
482 self._visitList(node.nodes) 488 self._visitList(node.nodes)
483 489
484 def _empty_stack(self, node): 490 def _empty_stack(self, node):
...@@ -506,6 +512,7 @@ class CodeGenVisitor(Visitor): ...@@ -506,6 +512,7 @@ class CodeGenVisitor(Visitor):
506 512
507 def vStatementList(self, node): 513 def vStatementList(self, node):
508 for n in node.nodes: 514 for n in node.nodes:
515 + self._loc(n)
509 self._accept_and_empty_stack(n) 516 self._accept_and_empty_stack(n)
510 517
511 def _generate_global_variable_definitions(self, node): 518 def _generate_global_variable_definitions(self, node):
...@@ -524,6 +531,7 @@ class CodeGenVisitor(Visitor): ...@@ -524,6 +531,7 @@ class CodeGenVisitor(Visitor):
524 def vTranslationUnit(self, node): 531 def vTranslationUnit(self, node):
525 """Outputs the entire assembly source file.""" 532 """Outputs the entire assembly source file."""
526 533
534 + self._last_lineno = None
527 self.curr_str = io.StringIO() 535 self.curr_str = io.StringIO()
528 536
529 self.globals_str = self._generate_global_variable_definitions(node) 537 self.globals_str = self._generate_global_variable_definitions(node)
...@@ -665,6 +673,7 @@ class CodeGenVisitor(Visitor): ...@@ -665,6 +673,7 @@ class CodeGenVisitor(Visitor):
665 "# Function type: %s" % 673 "# Function type: %s" %
666 (line, node.type.get_string()), 0) 674 (line, node.type.get_string()), 0)
667 675
676 + self._loc(node, "(enter function)")
668 if not node.static: 677 if not node.static:
669 self.o(" .global %s" % node.compile_loc) 678 self.o(" .global %s" % node.compile_loc)
670 self.o("%s:" % node.compile_loc) 679 self.o("%s:" % node.compile_loc)
...@@ -700,6 +709,7 @@ class CodeGenVisitor(Visitor): ...@@ -700,6 +709,7 @@ class CodeGenVisitor(Visitor):
700 # Add the previously-generated assembly code for the function. 709 # Add the previously-generated assembly code for the function.
701 self.curr_str.write(function_str.getvalue()) 710 self.curr_str.write(function_str.getvalue())
702 711
712 + self._loc(node, "(exit function)")
703 self.o("%s:" % self.curr_func_end_label) 713 self.o("%s:" % self.curr_func_end_label)
704 714
705 # Restore any callee-save registers that may have been used. 715 # Restore any callee-save registers that may have been used.
...@@ -712,9 +722,11 @@ class CodeGenVisitor(Visitor): ...@@ -712,9 +722,11 @@ class CodeGenVisitor(Visitor):
712 self.c(line, 0) 722 self.c(line, 0)
713 723
714 def vCompoundStatement(self, node): 724 def vCompoundStatement(self, node):
725 + self._loc(node)
715 node.statement_list.accept(self) 726 node.statement_list.accept(self)
716 727
717 def vIfStatement(self, node): 728 def vIfStatement(self, node):
729 + self._loc(node)
718 done_label = self.new_label() + "_done" 730 done_label = self.new_label() + "_done"
719 if not node.else_stmt.is_null(): 731 if not node.else_stmt.is_null():
720 else_label = self.new_label() + "_else" 732 else_label = self.new_label() + "_else"
...@@ -757,6 +769,7 @@ class CodeGenVisitor(Visitor): ...@@ -757,6 +769,7 @@ class CodeGenVisitor(Visitor):
757 self.continue_labels.pop() 769 self.continue_labels.pop()
758 770
759 def vWhileLoop(self, node): 771 def vWhileLoop(self, node):
772 + self._loc(node)
760 test_label = self.new_label() + "_test" 773 test_label = self.new_label() + "_test"
761 done_label = self.new_label() + "_done" 774 done_label = self.new_label() + "_done"
762 775
...@@ -782,6 +795,7 @@ class CodeGenVisitor(Visitor): ...@@ -782,6 +795,7 @@ class CodeGenVisitor(Visitor):
782 self._pop_loop_labels() 795 self._pop_loop_labels()
783 796
784 def vForLoop(self, node): 797 def vForLoop(self, node):
798 + self._loc(node)
785 test_label = self.new_label() + "_test" 799 test_label = self.new_label() + "_test"
786 done_label = self.new_label() + "_done" 800 done_label = self.new_label() + "_done"
787 801
...@@ -810,10 +824,12 @@ class CodeGenVisitor(Visitor): ...@@ -810,10 +824,12 @@ class CodeGenVisitor(Visitor):
810 self._pop_loop_labels() 824 self._pop_loop_labels()
811 825
812 def vBreakStatement(self, node): 826 def vBreakStatement(self, node):
827 + self._loc(node)
813 self.o(" jmp %s" % self.break_labels[-1], 828 self.o(" jmp %s" % self.break_labels[-1],
814 "Loop: break statement") 829 "Loop: break statement")
815 830
816 def vContinueStatement(self, node): 831 def vContinueStatement(self, node):
832 + self._loc(node)
817 self.o(" jmp %s" % self.continue_labels[-1], 833 self.o(" jmp %s" % self.continue_labels[-1],
818 "Loop: continue statement") 834 "Loop: continue statement")
819 835
...@@ -833,6 +849,7 @@ class CodeGenVisitor(Visitor): ...@@ -833,6 +849,7 @@ class CodeGenVisitor(Visitor):
833 return label_str 849 return label_str
834 850
835 def vStringLiteral(self, node): 851 def vStringLiteral(self, node):
852 + self._loc(node)
836 label_str = self._get_new_str_literal_label(node.get_str()) 853 label_str = self._get_new_str_literal_label(node.get_str())
837 854
838 # Make a little preview of the literal in the annotated 855 # Make a little preview of the literal in the annotated
...@@ -847,11 +864,13 @@ class CodeGenVisitor(Visitor): ...@@ -847,11 +864,13 @@ class CodeGenVisitor(Visitor):
847 "Get addr of string literal '%s'" % comment_label) 864 "Get addr of string literal '%s'" % comment_label)
848 865
849 def vConst(self, node): 866 def vConst(self, node):
867 + self._loc(node)
850 self.o(" movl $%d, %s" % (node.value, 868 self.o(" movl $%d, %s" % (node.value,
851 self.stack.push(node.type)), 869 self.stack.push(node.type)),
852 "Load numeric constant %d" % node.value) 870 "Load numeric constant %d" % node.value)
853 871
854 def vId(self, node): 872 def vId(self, node):
873 + self._loc(node)
855 # If we're only supposed to push our address on the stack, not 874 # If we're only supposed to push our address on the stack, not
856 # our actual value, then do that and exit. 875 # our actual value, then do that and exit.
857 if node.output_addr: 876 if node.output_addr:
...@@ -869,6 +888,7 @@ class CodeGenVisitor(Visitor): ...@@ -869,6 +888,7 @@ class CodeGenVisitor(Visitor):
869 "Get value of %s" % node.symbol.name) 888 "Get value of %s" % node.symbol.name)
870 889
871 def vArrayExpression(self, node): 890 def vArrayExpression(self, node):
891 + self._loc(node)
872 node.expr.accept(self) 892 node.expr.accept(self)
873 node.index.accept(self) 893 node.index.accept(self)
874 reg_index = self.stack.pop(node.index.type) 894 reg_index = self.stack.pop(node.index.type)
...@@ -891,6 +911,7 @@ class CodeGenVisitor(Visitor): ...@@ -891,6 +911,7 @@ class CodeGenVisitor(Visitor):
891 911
892 def vFunctionExpression(self, node): 912 def vFunctionExpression(self, node):
893 """Generates assembly for calling a function.""" 913 """Generates assembly for calling a function."""
914 + self._loc(node)
894 915
895 self.c("FUNCTION CALL to %s() - begin" % 916 self.c("FUNCTION CALL to %s() - begin" %
896 node.function.symbol.name) 917 node.function.symbol.name)
...@@ -936,6 +957,7 @@ class CodeGenVisitor(Visitor): ...@@ -936,6 +957,7 @@ class CodeGenVisitor(Visitor):
936 node.function.symbol.name) 957 node.function.symbol.name)
937 958
938 def vReturnStatement(self, node): 959 def vReturnStatement(self, node):
960 + self._loc(node)
939 return_reg = self._accept_and_pop(node.expr) 961 return_reg = self._accept_and_pop(node.expr)
940 self.o(" movl %s, %%eax" % return_reg, "Set return value") 962 self.o(" movl %s, %%eax" % return_reg, "Set return value")
941 self.o(" jmp %s" % self.curr_func_end_label, "Exit function") 963 self.o(" jmp %s" % self.curr_func_end_label, "Exit function")
...@@ -1051,6 +1073,7 @@ class CodeGenVisitor(Visitor): ...@@ -1051,6 +1073,7 @@ class CodeGenVisitor(Visitor):
1051 "Zero-extend the boolean result") 1073 "Zero-extend the boolean result")
1052 1074
1053 def vBinop(self, node): 1075 def vBinop(self, node):
1076 + self._loc(node)
1054 if node.op in cparse.Binop.ASSIGN_OPS: 1077 if node.op in cparse.Binop.ASSIGN_OPS:
1055 self._binop_assign(node) 1078 self._binop_assign(node)
1056 elif node.op in ['+','-','*']: 1079 elif node.op in ['+','-','*']:
...@@ -1059,11 +1082,13 @@ class CodeGenVisitor(Visitor): ...@@ -1059,11 +1082,13 @@ class CodeGenVisitor(Visitor):
1059 self._binop_compare(node) 1082 self._binop_compare(node)
1060 1083
1061 def vNegative(self, node): 1084 def vNegative(self, node):
1085 + self._loc(node)
1062 node.expr.accept(self) 1086 node.expr.accept(self)
1063 self.o(" negl %s" % self.stack.peek(), 1087 self.o(" negl %s" % self.stack.peek(),
1064 "Perform unary negation") 1088 "Perform unary negation")
1065 1089
1066 def vPointer(self, node): 1090 def vPointer(self, node):
1091 + self._loc(node)
1067 node.expr.accept(self) 1092 node.expr.accept(self)
1068 if node.output_addr: 1093 if node.output_addr:
1069 self.o("", "(Getting pointer target addr via '*')") 1094 self.o("", "(Getting pointer target addr via '*')")
...@@ -1080,6 +1105,7 @@ class CodeGenVisitor(Visitor): ...@@ -1080,6 +1105,7 @@ class CodeGenVisitor(Visitor):
1080 self.stack.done() 1105 self.stack.done()
1081 1106
1082 def vAddrOf(self, node): 1107 def vAddrOf(self, node):
1108 + self._loc(node)
1083 node.expr.accept(self) 1109 node.expr.accept(self)
1084 self.stack.force_type_change(node.type) 1110 self.stack.force_type_change(node.type)
1085 self.o("", "(Address-of operator '&' used here)") 1111 self.o("", "(Address-of operator '&' used here)")
...@@ -1094,6 +1120,6 @@ def compile (path) : ...@@ -1094,6 +1120,6 @@ def compile (path) :
1094 1120
1095 def cpp (args, path) : 1121 def cpp (args, path) :
1096 if args.test : 1122 if args.test :
1097 - return ["cpp", "-P", "-D", "CC", path] 1123 + return ["cpp", "-D", "CC", path]
1098 else : 1124 else :
1099 - return ["cpp", "-P", path] 1125 + return ["cpp", path]
......
...@@ -27,6 +27,7 @@ class Compiler (object) : ...@@ -27,6 +27,7 @@ class Compiler (object) :
27 self.total_warnings = 0 27 self.total_warnings = 0
28 def _parse (self) : 28 def _parse (self) :
29 "Parses the source code." 29 "Parses the source code."
30 + cparse.inputfile = self.path
30 self.ast = yacc.parse(self.code) 31 self.ast = yacc.parse(self.code)
31 def _compile_phase (self, visitor) : 32 def _compile_phase (self, visitor) :
32 "Applies a visitor to the abstract syntax tree." 33 "Applies a visitor to the abstract syntax tree."
...@@ -109,8 +110,10 @@ def main (args=None) : ...@@ -109,8 +110,10 @@ def main (args=None) :
109 print("Preprocessing %r" % src) 110 print("Preprocessing %r" % src)
110 cpp = ARCH[args.arch].cpp(args, src) 111 cpp = ARCH[args.arch].cpp(args, src)
111 print("..$ %s" % " ".join(cpp)) 112 print("..$ %s" % " ".join(cpp))
112 - code = subprocess.check_output(cpp).decode() 113 + code = "\n".join(l.rstrip()
113 - print("Compiling preprocessed %r (line numbers may have changed)" % src) 114 + for l in subprocess.check_output(cpp).decode().splitlines()
115 + if not l.startswith("#"))
116 + print("Compiling preprocessed %r" % src)
114 else : 117 else :
115 code = "\n".join(l.rstrip() for l in open(src).readlines()) 118 code = "\n".join(l.rstrip() for l in open(src).readlines())
116 print("Compiling %r" % src) 119 print("Compiling %r" % src)
......