Redo compiler.codegen.fixup and get %dispatch to work
parent
64114947d2
commit
096803e58f
|
@ -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
|
|
@ -26,14 +26,6 @@ SYMBOL: registers
|
||||||
: ?register ( obj -- operand )
|
: ?register ( obj -- operand )
|
||||||
dup vreg? [ register ] when ;
|
dup vreg? [ register ] when ;
|
||||||
|
|
||||||
: generate-insns ( insns -- code )
|
|
||||||
[
|
|
||||||
[
|
|
||||||
dup regs>> registers set
|
|
||||||
generate-insn
|
|
||||||
] each
|
|
||||||
] { } make fixup ;
|
|
||||||
|
|
||||||
TUPLE: asm label code calls ;
|
TUPLE: asm label code calls ;
|
||||||
|
|
||||||
SYMBOL: calls
|
SYMBOL: calls
|
||||||
|
@ -51,17 +43,22 @@ SYMBOL: labels
|
||||||
|
|
||||||
: init-generator ( word -- )
|
: init-generator ( word -- )
|
||||||
H{ } clone labels set
|
H{ } clone labels set
|
||||||
V{ } clone literal-table set
|
|
||||||
V{ } clone calls set
|
V{ } clone calls set
|
||||||
compiling-word set
|
compiling-word set
|
||||||
compiled-stack-traces? [ compiling-word get add-literal ] when ;
|
compiled-stack-traces? [ compiling-word get add-literal ] when ;
|
||||||
|
|
||||||
|
: generate-insns ( asm -- code )
|
||||||
|
[
|
||||||
|
[ word>> init-generator ]
|
||||||
|
[
|
||||||
|
instructions>>
|
||||||
|
[ [ regs>> registers set ] [ generate-insn ] bi ] each
|
||||||
|
] bi
|
||||||
|
] with-fixup ;
|
||||||
|
|
||||||
: generate ( mr -- asm )
|
: generate ( mr -- asm )
|
||||||
[
|
[
|
||||||
[ label>> ]
|
[ label>> ] [ generate-insns ] bi calls get
|
||||||
[ word>> init-generator ]
|
|
||||||
[ instructions>> generate-insns ] tri
|
|
||||||
calls get
|
|
||||||
asm boa
|
asm boa
|
||||||
] with-scope ;
|
] with-scope ;
|
||||||
|
|
||||||
|
@ -487,7 +484,7 @@ M: _epilogue generate-insn
|
||||||
stack-frame>> total-size>> %epilogue ;
|
stack-frame>> total-size>> %epilogue ;
|
||||||
|
|
||||||
M: _label generate-insn
|
M: _label generate-insn
|
||||||
id>> lookup-label , ;
|
id>> lookup-label resolve-label ;
|
||||||
|
|
||||||
M: _branch generate-insn
|
M: _branch generate-insn
|
||||||
label>> lookup-label %jump-label ;
|
label>> lookup-label %jump-label ;
|
||||||
|
|
|
@ -4,24 +4,38 @@ USING: arrays byte-arrays byte-vectors generic assocs hashtables
|
||||||
io.binary kernel kernel.private math namespaces make sequences
|
io.binary kernel kernel.private math namespaces make sequences
|
||||||
words quotations strings alien.accessors alien.strings layouts
|
words quotations strings alien.accessors alien.strings layouts
|
||||||
system combinators math.bitwise math.order
|
system combinators math.bitwise math.order
|
||||||
accessors growable cpu.architecture compiler.constants ;
|
accessors growable compiler.constants ;
|
||||||
IN: compiler.codegen.fixup
|
IN: compiler.codegen.fixup
|
||||||
|
|
||||||
GENERIC: fixup* ( obj -- )
|
! Literal table
|
||||||
|
SYMBOL: literal-table
|
||||||
|
|
||||||
|
: add-literal ( obj -- ) literal-table get push ;
|
||||||
|
|
||||||
|
! Labels
|
||||||
|
SYMBOL: label-table
|
||||||
|
|
||||||
|
TUPLE: label offset ;
|
||||||
|
|
||||||
|
: <label> ( -- label ) label new ;
|
||||||
|
: define-label ( name -- ) <label> swap set ;
|
||||||
|
|
||||||
: compiled-offset ( -- n ) building get length ;
|
: compiled-offset ( -- n ) building get length ;
|
||||||
|
|
||||||
SYMBOL: relocation-table
|
: resolve-label ( label/name -- )
|
||||||
SYMBOL: label-table
|
dup label? [ get ] unless
|
||||||
|
compiled-offset >>offset drop ;
|
||||||
M: label fixup* compiled-offset >>offset drop ;
|
|
||||||
|
|
||||||
: offset-for-class ( class -- n )
|
: offset-for-class ( class -- n )
|
||||||
rc-absolute-cell = cell 4 ? compiled-offset swap - ;
|
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 -- ) \ label-fixup boa , ;
|
: label-fixup ( label class -- )
|
||||||
|
dup offset-for-class \ label-fixup boa label-table get push ;
|
||||||
|
|
||||||
|
! Relocation table
|
||||||
|
SYMBOL: relocation-table
|
||||||
|
|
||||||
: push-4 ( value vector -- )
|
: push-4 ( value vector -- )
|
||||||
[ length ] [ B{ 0 0 0 0 } swap push-all ] [ underlying>> ] tri
|
[ length ] [ B{ 0 0 0 0 } swap push-all ] [ underlying>> ] tri
|
||||||
|
@ -30,25 +44,8 @@ TUPLE: label-fixup { label label } { class integer } ;
|
||||||
: add-relocation-entry ( type class offset -- )
|
: add-relocation-entry ( type class offset -- )
|
||||||
{ 0 24 28 } bitfield relocation-table get push-4 ;
|
{ 0 24 28 } bitfield relocation-table get push-4 ;
|
||||||
|
|
||||||
M: label-fixup fixup*
|
: rel-fixup ( class type -- )
|
||||||
[ class>> dup offset-for-class ] [ label>> ] bi
|
swap dup offset-for-class add-relocation-entry ;
|
||||||
[ drop [ rt-here ] 2dip add-relocation-entry ]
|
|
||||||
[ 3array label-table get push ]
|
|
||||||
3bi ;
|
|
||||||
|
|
||||||
TUPLE: rel-fixup { class integer } { type integer } ;
|
|
||||||
|
|
||||||
: 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 ;
|
|
||||||
|
|
||||||
: add-dlsym-literals ( symbol dll -- )
|
: add-dlsym-literals ( symbol dll -- )
|
||||||
[ string>symbol add-literal ] [ add-literal ] bi* ;
|
[ string>symbol add-literal ] [ add-literal ] bi* ;
|
||||||
|
@ -77,22 +74,34 @@ SYMBOL: literal-table
|
||||||
: rel-here ( offset class -- )
|
: rel-here ( offset class -- )
|
||||||
[ add-literal ] dip rt-here rel-fixup ;
|
[ add-literal ] dip rt-here rel-fixup ;
|
||||||
|
|
||||||
|
! And the rest
|
||||||
|
: resolve-offset ( label-fixup -- offset )
|
||||||
|
label>> offset>> [ "Unresolved label" throw ] unless* ;
|
||||||
|
|
||||||
|
: 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 ( -- )
|
: init-fixup ( -- )
|
||||||
BV{ } clone relocation-table set
|
V{ } clone literal-table set
|
||||||
V{ } clone label-table set ;
|
V{ } clone label-table set
|
||||||
|
BV{ } clone relocation-table set ;
|
||||||
|
|
||||||
: resolve-labels ( labels -- labels' )
|
: with-fixup ( quot -- code )
|
||||||
[
|
|
||||||
first3 offset>>
|
|
||||||
[ "Unresolved label" throw ] unless*
|
|
||||||
3array
|
|
||||||
] map concat ;
|
|
||||||
|
|
||||||
: fixup ( fixup-directives -- code )
|
|
||||||
[
|
[
|
||||||
init-fixup
|
init-fixup
|
||||||
[ fixup* ] each
|
call
|
||||||
|
label-table [ resolve-labels ] change
|
||||||
literal-table get >array
|
literal-table get >array
|
||||||
relocation-table get >byte-array
|
relocation-table get >byte-array
|
||||||
label-table get resolve-labels
|
label-table get
|
||||||
] B{ } make 4array ;
|
] B{ } make 4array ; inline
|
||||||
|
|
|
@ -5,13 +5,6 @@ memory namespaces make sequences layouts system hashtables
|
||||||
classes alien byte-arrays combinators words sets fry ;
|
classes alien byte-arrays combinators words sets fry ;
|
||||||
IN: cpu.architecture
|
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
|
! Register classes
|
||||||
SINGLETON: int-regs
|
SINGLETON: int-regs
|
||||||
SINGLETON: single-float-regs
|
SINGLETON: single-float-regs
|
||||||
|
@ -52,7 +45,7 @@ HOOK: %jump-label cpu ( label -- )
|
||||||
HOOK: %return cpu ( -- )
|
HOOK: %return cpu ( -- )
|
||||||
|
|
||||||
HOOK: %dispatch cpu ( src temp -- )
|
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 cpu ( dst obj slot tag temp -- )
|
||||||
HOOK: %slot-imm cpu ( dst obj slot tag -- )
|
HOOK: %slot-imm cpu ( dst obj slot tag -- )
|
||||||
|
|
|
@ -74,7 +74,7 @@ M: x86 %jump-label ( label -- ) 0 JMP rc-relative label-fixup ;
|
||||||
M: x86 %return ( -- ) 0 RET ;
|
M: x86 %return ( -- ) 0 RET ;
|
||||||
|
|
||||||
: code-alignment ( align -- n )
|
: code-alignment ( align -- n )
|
||||||
[ building get [ integer? ] count dup ] dip align swap - ;
|
[ building get length dup ] dip align swap - ;
|
||||||
|
|
||||||
: align-code ( n -- )
|
: align-code ( n -- )
|
||||||
0 <repetition> % ;
|
0 <repetition> % ;
|
||||||
|
|
|
@ -159,7 +159,10 @@ cell compute_relocation(relocation_entry rel, cell index, code_block *compiled)
|
||||||
case RT_XT_PIC_TAIL:
|
case RT_XT_PIC_TAIL:
|
||||||
return (cell)word_xt_pic_tail(untag<word>(ARG));
|
return (cell)word_xt_pic_tail(untag<word>(ARG));
|
||||||
case RT_HERE:
|
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:
|
case RT_THIS:
|
||||||
return (cell)(compiled + 1);
|
return (cell)(compiled + 1);
|
||||||
case RT_STACK_CHAIN:
|
case RT_STACK_CHAIN:
|
||||||
|
|
Loading…
Reference in New Issue