Showing
7 changed files
with
78 additions
and
14 deletions
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) | ... | ... |
-
Please register or login to post a comment