Mercurial > repos > tabletprog
comparison modules/il.tp @ 363:d949fe826e04
Unify il and backend labels
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 25 Apr 2015 20:56:02 -0700 |
parents | 06dceff348ea |
children |
comparison
equal
deleted
inserted
replaced
362:7101ad443081 | 363:d949fe826e04 |
---|---|
563 } | 563 } |
564 | 564 |
565 label <- { | 565 label <- { |
566 _labelNum <- _curLabel | 566 _labelNum <- _curLabel |
567 _curLabel <- _curLabel + 1 | 567 _curLabel <- _curLabel + 1 |
568 _offset <- option none | |
569 _forwardRefs <- #[] | |
568 #{ | 570 #{ |
569 opcode <- { _label } | 571 opcode <- { _label } |
570 numops <- { 0 } | 572 numops <- { 0 } |
571 name <- { _names get: opcode } | 573 name <- { _names get: opcode } |
572 string <- { name . " " . _labelNum } | 574 string <- { name . " " . _labelNum } |
575 length <- { 0 } | |
573 reference <- { | 576 reference <- { |
574 #{ | 577 #{ |
575 isInteger? <- { false } | 578 isInteger? <- { false } |
576 register? <- { false } | 579 register? <- { false } |
577 argument? <- { false } | 580 argument? <- { false } |
583 recordUsage:at:withSize <- :tracker :address :size { | 586 recordUsage:at:withSize <- :tracker :address :size { |
584 } | 587 } |
585 assign:withSource <- :assignments :regSrc { | 588 assign:withSource <- :assignments :regSrc { |
586 self | 589 self |
587 } | 590 } |
591 withOffset:else <- :fun :elsefun { | |
592 _offset value: :off { | |
593 fun: off | |
594 } none: { | |
595 _forwardRefs append: fun | |
596 elsefun: | |
597 } | |
598 } | |
588 } | 599 } |
589 } | 600 } |
590 recordUsage:at <- :tracker :address { | 601 recordUsage:at <- :tracker :address { |
591 | 602 |
592 } | 603 } |
593 assignRegs:at:withSource:andUsage <- :assignments :at :regSrc :usage { | 604 assignRegs:at:withSource:andUsage <- :assignments :at :regSrc :usage { |
594 self | 605 self |
606 } | |
607 flattenTo:at <- :dest :idx { | |
608 if: (_offset none?) { | |
609 _offset <- option value: idx | |
610 foreach: _forwardRefs :_ fun { | |
611 fun: idx | |
612 } | |
613 _forwardRefs <- #[] | |
614 } | |
615 idx | |
595 } | 616 } |
596 } | 617 } |
597 } | 618 } |
598 data <- :_bytes { | 619 data <- :_bytes { |
599 #{ | 620 #{ |
793 toBackend <- :program :backend { | 814 toBackend <- :program :backend { |
794 prepped <- program map: :fun { | 815 prepped <- program map: :fun { |
795 backend adjustIL: fun | 816 backend adjustIL: fun |
796 } | 817 } |
797 labels <- prepped map: :_ { | 818 labels <- prepped map: :_ { |
798 backend label | 819 il label |
799 } | 820 } |
821 labelRefs <- labels map: :label { label reference } | |
800 outprog <- #[] | 822 outprog <- #[] |
801 //translate main first so it's at the start of the output | 823 //translate main first so it's at the start of the output |
802 prepped ifget: "main" :instarr { | 824 prepped ifget: "main" :instarr { |
803 outprog append: (labels get: "main" else: { false }) | 825 outprog append: (labels get: "main" else: { false }) |
804 foreach: instarr :_ inst { | 826 foreach: instarr :_ inst { |
805 print: "Translating: " . inst . "\n" | 827 print: "Translating: " . inst . "\n" |
806 backend convertIL: inst to: outprog withLabels: labels | 828 backend convertIL: inst to: outprog withLabels: labelRefs |
807 } | 829 } |
808 } else: {} | 830 } else: {} |
809 | 831 |
810 foreach: prepped :name instarr { | 832 foreach: prepped :name instarr { |
811 outprog append: (labels get: name else: { false }) | 833 outprog append: (labels get: name else: { false }) |
812 foreach: instarr :_ inst { | 834 foreach: instarr :_ inst { |
813 print: "Translating: " . inst . "\n" | 835 print: "Translating: " . inst . "\n" |
814 backend convertIL: inst to: outprog withLabels: labels | 836 backend convertIL: inst to: outprog withLabels: labelRefs |
815 } | 837 } |
816 } | 838 } |
817 outprog | 839 outprog |
818 } | 840 } |
819 | 841 |