factor/library/compiler/generator.factor

94 lines
2.2 KiB
Factor
Raw Normal View History

! Copyright (C) 2004, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: assembler
DEFER: compile-call-label ( label -- )
DEFER: compile-jump-label ( label -- )
DEFER: compile-jump-t ( label -- )
DEFER: compile-jump-f ( label -- )
2004-12-02 22:44:36 -05:00
IN: compiler
2005-04-02 02:39:33 -05:00
USING: assembler errors inference kernel lists math namespaces
sequences strings vectors words ;
2004-12-25 02:55:03 -05:00
: generate-node ( [[ op params ]] -- )
#! Generate machine code for a node.
unswons dup "generator" word-prop [
2005-01-02 23:57:54 -05:00
call
] [
"No generator" throw
2005-01-02 23:57:54 -05:00
] ?ifte ;
2004-12-25 02:55:03 -05:00
: generate-code ( word linear -- length )
compiled-offset >r
compile-aligned
swap save-xt
[ generate-node ] each
compile-aligned
compiled-offset r> - ;
: generate-reloc ( -- length )
relocation-table get
2005-04-02 02:39:33 -05:00
dup [ compile-cell ] seq-each
length cell * ;
2004-12-25 02:55:03 -05:00
2004-12-25 15:52:08 -05:00
: (generate) ( word linear -- )
#! Compile a word definition from linear IR.
2004-12-25 02:55:03 -05:00
100 <vector> relocation-table set
begin-assembly swap >r >r
generate-code
generate-reloc
r> set-compiled-cell
r> set-compiled-cell ;
2004-12-04 23:45:41 -05:00
2004-12-25 15:52:08 -05:00
SYMBOL: previous-offset
: generate ( word linear -- )
#! If generation fails, reset compiled offset.
[
compiled-offset previous-offset set
(generate)
] [
[
previous-offset get set-compiled-offset
rethrow
] when*
] catch ;
#label [ save-xt ] "generator" set-word-prop
2004-12-31 02:17:45 -05:00
#end-dispatch [ drop ] "generator" set-word-prop
2005-01-17 15:33:12 -05:00
2004-12-31 02:17:45 -05:00
: type-tag ( type -- tag )
#! Given a type number, return the tag number.
dup 6 > [ drop 3 ] when ;
2005-03-15 22:23:52 -05:00
: compile-call ( word -- ) dup postpone-word compile-call-label ;
#call [
compile-call
] "generator" set-word-prop
#jump-label [
compile-jump-label
] "generator" set-word-prop
#jump-t-label [ compile-jump-t ] "generator" set-word-prop
#jump-t [ compile-jump-t ] "generator" set-word-prop
#jump-f-label [ compile-jump-f ] "generator" set-word-prop
#jump-f [ compile-jump-f ] "generator" set-word-prop
2005-03-19 21:23:21 -05:00
: compile-target ( word -- ) 0 compile-cell absolute ;
#target-label [
#! Jump table entries are absolute addresses.
compile-target
] "generator" set-word-prop
#target [
#! Jump table entries are absolute addresses.
dup postpone-word compile-target
] "generator" set-word-prop