]> gitweb.factorcode.org Git - factor.git/commitdiff
Redo compiler.codegen.fixup and get %dispatch to work
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 1 Jun 2009 07:32:36 +0000 (02:32 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 1 Jun 2009 07:32:36 +0000 (02:32 -0500)
basis/compiler/codegen/codegen-tests.factor [new file with mode: 0644]
basis/compiler/codegen/codegen.factor
basis/compiler/codegen/fixup/fixup.factor
basis/cpu/architecture/architecture.factor
basis/cpu/x86/x86.factor
vm/code_block.cpp

diff --git a/basis/compiler/codegen/codegen-tests.factor b/basis/compiler/codegen/codegen-tests.factor
new file mode 100644 (file)
index 0000000..9c3817b
--- /dev/null
@@ -0,0 +1,14 @@
+IN: compiler.codegen.tests
+USING: compiler.codegen.fixup tools.test cpu.architecture math kernel make
+compiler.constants ;
+
+[ ] [ [ ] with-fixup drop ] unit-test
+[ ] [ [ \ + %call ] with-fixup drop ] unit-test
+
+[ ] [ [ <label> dup define-label dup resolve-label %jump-label ] with-fixup drop ] unit-test
+[ ] [ [ <label> dup define-label dup resolve-label B{ 0 0 0 0 } % rc-absolute-cell label-fixup ] with-fixup drop ] unit-test
+
+! Error checking
+[ [ <label> dup define-label %jump-label ] with-fixup ] must-fail
+[ [ <label> dup define-label B{ 0 0 0 0 } % rc-relative label-fixup ] with-fixup ] must-fail
+[ [ <label> dup define-label B{ 0 0 0 0 } % rc-absolute-cell label-fixup ] with-fixup ] must-fail
index 223fc8edff95bb97a9c7e4b4153ade2c31568899..3962902c6257134f15b8705650fb83270cfe1226 100755 (executable)
@@ -26,14 +26,6 @@ SYMBOL: registers
 : ?register ( obj -- operand )
     dup vreg? [ register ] when ;
 
-: generate-insns ( insns -- code )
-    [
-        [
-            dup regs>> registers set
-            generate-insn
-        ] each
-    ] { } make fixup ;
-
 TUPLE: asm label code calls ;
 
 SYMBOL: calls
@@ -51,17 +43,22 @@ SYMBOL: labels
 
 : init-generator ( word -- )
     H{ } clone labels set
-    V{ } clone literal-table set
     V{ } clone calls set
     compiling-word set
     compiled-stack-traces? [ compiling-word get add-literal ] when ;
 
-: generate ( mr -- asm )
+: generate-insns ( asm -- code )
     [
-        [ label>> ]
         [ word>> init-generator ]
-        [ instructions>> generate-insns ] tri
-        calls get
+        [
+            instructions>>
+            [ [ regs>> registers set ] [ generate-insn ] bi ] each
+        ] bi
+    ] with-fixup ;
+
+: generate ( mr -- asm )
+    [
+        [ label>> ] [ generate-insns ] bi calls get
         asm boa
     ] with-scope ;
 
@@ -487,7 +484,7 @@ M: _epilogue generate-insn
     stack-frame>> total-size>> %epilogue ;
 
 M: _label generate-insn
-    id>> lookup-label , ;
+    id>> lookup-label resolve-label ;
 
 M: _branch generate-insn
     label>> lookup-label %jump-label ;
index bd1364dde1b0e572679b4219b121a8be7809fcd3..55205087880303338ea233444c9c19fc6e1c3949 100755 (executable)
@@ -4,51 +4,48 @@ USING: arrays byte-arrays byte-vectors generic assocs hashtables
 io.binary kernel kernel.private math namespaces make sequences
 words quotations strings alien.accessors alien.strings layouts
 system combinators math.bitwise math.order
-accessors growable cpu.architecture compiler.constants ;
+accessors growable compiler.constants ;
 IN: compiler.codegen.fixup
 
-GENERIC: fixup* ( obj -- )
+! Literal table
+SYMBOL: literal-table
 
-: compiled-offset ( -- n ) building get length ;
+: add-literal ( obj -- ) literal-table get push ;
 
-SYMBOL: relocation-table
+! Labels
 SYMBOL: label-table
 
-M: label fixup* compiled-offset >>offset drop ;
+TUPLE: label offset ;
+
+: <label> ( -- label ) label new ;
+: define-label ( name -- ) <label> swap set ;
+
+: compiled-offset ( -- n ) building get length ;
+
+: resolve-label ( label/name -- )
+    dup label? [ get ] unless
+    compiled-offset >>offset drop ;
 
 : offset-for-class ( class -- n )
     rc-absolute-cell = cell 4 ? compiled-offset swap - ;
 
-TUPLE: label-fixup { label label } { class integer } ;
+TUPLE: label-fixup { label label } { class integer } { offset integer } ;
+
+: label-fixup ( label class -- )
+    dup offset-for-class \ label-fixup boa label-table get push ;
 
-: label-fixup ( label class -- ) \ label-fixup boa , ;
+! Relocation table
+SYMBOL: relocation-table
 
 : push-4 ( value vector -- )
     [ length ] [ B{ 0 0 0 0 } swap push-all ] [ underlying>> ] tri
     swap set-alien-unsigned-4 ;
 
 : add-relocation-entry ( type class offset -- )
-      { 0 24 28 } bitfield relocation-table get push-4 ;
-
-M: label-fixup fixup*
-    [ class>> dup offset-for-class ] [ label>> ] bi
-    [ drop [ rt-here ] 2dip add-relocation-entry ]
-    [ 3array label-table get push ]
-    3bi ;
-
-TUPLE: rel-fixup { class integer } { type integer } ;
+    { 0 24 28 } bitfield relocation-table get push-4 ;
 
-: rel-fixup ( class type -- ) \ rel-fixup boa , ;
-
-M: rel-fixup fixup*
-    [ type>> ] [ class>> dup offset-for-class ] bi
-    add-relocation-entry ;
-
-M: integer fixup* , ;
-
-SYMBOL: literal-table
-
-: add-literal ( obj -- ) literal-table get push ;
+: rel-fixup ( class type -- )
+    swap dup offset-for-class add-relocation-entry ;
 
 : add-dlsym-literals ( symbol dll -- )
     [ string>symbol add-literal ] [ add-literal ] bi* ;
@@ -77,22 +74,34 @@ SYMBOL: literal-table
 : rel-here ( offset class -- )
     [ add-literal ] dip rt-here rel-fixup ;
 
-: init-fixup ( -- )
-    BV{ } clone relocation-table set
-    V{ } clone label-table set ;
+! And the rest
+: resolve-offset ( label-fixup -- offset )
+    label>> offset>> [ "Unresolved label" throw ] unless* ;
 
-: resolve-labels ( labels -- labels' )
-    [
-        first3 offset>>
-        [ "Unresolved label" throw ] unless*
-        3array
-    ] map concat ;
+: resolve-absolute-label ( label-fixup -- )
+    dup resolve-offset neg add-literal
+    [ rt-here ] dip [ class>> ] [ offset>> ] bi add-relocation-entry ;
+
+: resolve-relative-label ( label-fixup -- )
+    [ class>> ] [ offset>> ] [ resolve-offset ] tri 3array ;
+
+: resolve-labels ( label-fixups -- labels' )
+    [ class>> rc-absolute? ] partition
+    [ [ resolve-absolute-label ] each ]
+    [ [ resolve-relative-label ] map concat ]
+    bi* ;
+
+: init-fixup ( -- )
+    V{ } clone literal-table set
+    V{ } clone label-table set
+    BV{ } clone relocation-table set ;
 
-: fixup ( fixup-directives -- code )
+: with-fixup ( quot -- code )
     [
         init-fixup
-        [ fixup* ] each
+        call
+        label-table [ resolve-labels ] change
         literal-table get >array
         relocation-table get >byte-array
-        label-table get resolve-labels
-    ] B{ } make 4array ;
+        label-table get
+    ] B{ } make 4array ; inline
index e0e4343a60849c1fbbcb9f919030b228ff598547..f7f91524c38374bc6ca71d243d8f413b0a681445 100644 (file)
@@ -5,13 +5,6 @@ memory namespaces make sequences layouts system hashtables
 classes alien byte-arrays combinators words sets fry ;
 IN: cpu.architecture
 
-! Labels
-TUPLE: label offset ;
-
-: <label> ( -- label ) label new ;
-: define-label ( name -- ) <label> swap set ;
-: resolve-label ( label/name -- ) dup label? [ get ] unless , ;
-
 ! Register classes
 SINGLETON: int-regs
 SINGLETON: single-float-regs
@@ -52,7 +45,7 @@ HOOK: %jump-label cpu ( label -- )
 HOOK: %return cpu ( -- )
 
 HOOK: %dispatch cpu ( src temp -- )
-HOOK: %dispatch-label cpu ( src temp -- )
+HOOK: %dispatch-label cpu ( label -- )
 
 HOOK: %slot cpu ( dst obj slot tag temp -- )
 HOOK: %slot-imm cpu ( dst obj slot tag -- )
index 24832ac22719a274f698219ea463bf861ab1485b..1a2c2e3ee19e962cb217a51f6a1cdce4211f1332 100644 (file)
@@ -74,7 +74,7 @@ M: x86 %jump-label ( label -- ) 0 JMP rc-relative label-fixup ;
 M: x86 %return ( -- ) 0 RET ;
 
 : code-alignment ( align -- n )
-    [ building get [ integer? ] count dup ] dip align swap - ;
+    [ building get length dup ] dip align swap - ;
 
 : align-code ( n -- )
     0 <repetition> % ;
index 050e154c285f1dd71679df6867dd75d758950fcc..aaf8e25866e28628d2f74064f5c6df160c213e0f 100755 (executable)
@@ -159,7 +159,10 @@ cell compute_relocation(relocation_entry rel, cell index, code_block *compiled)
        case RT_XT_PIC_TAIL:
                return (cell)word_xt_pic_tail(untag<word>(ARG));
        case RT_HERE:
-               return offset + untag_fixnum(ARG);
+       {
+               fixnum arg = untag_fixnum(ARG);
+               return (arg >= 0 ? offset + arg : (cell)(compiled +1) - arg);
+       }
        case RT_THIS:
                return (cell)(compiled + 1);
        case RT_STACK_CHAIN: