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