Merge branch 'master' of factorcode.org:/git/factor

release
Joe Groff 2010-04-12 14:26:13 -07:00
commit 73d9c1c94d
23 changed files with 811 additions and 318 deletions

View File

@ -1,7 +1,7 @@
! Copyright (C) 2008, 2010 Slava Pestov. ! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: math kernel layouts system strings words quotations byte-arrays USING: math kernel layouts system strings words quotations byte-arrays
alien arrays literals sequences ; alien alien.syntax arrays literals sequences ;
IN: compiler.constants IN: compiler.constants
! These constants must match vm/memory.h ! These constants must match vm/memory.h
@ -40,32 +40,41 @@ CONSTANT: deck-bits 18
: segment-end-offset ( -- n ) 2 bootstrap-cells ; inline : segment-end-offset ( -- n ) 2 bootstrap-cells ; inline
! Relocation classes ! Relocation classes
CONSTANT: rc-absolute-cell 0 C-ENUM: f
CONSTANT: rc-absolute 1 rc-absolute-cell
CONSTANT: rc-relative 2 rc-absolute
CONSTANT: rc-absolute-ppc-2/2 3 rc-relative
CONSTANT: rc-absolute-ppc-2 4 rc-absolute-ppc-2/2
CONSTANT: rc-relative-ppc-2 5 rc-absolute-ppc-2
CONSTANT: rc-relative-ppc-3 6 rc-relative-ppc-2
CONSTANT: rc-relative-arm-3 7 rc-relative-ppc-3
CONSTANT: rc-indirect-arm 8 rc-relative-arm-3
CONSTANT: rc-indirect-arm-pc 9 rc-indirect-arm
CONSTANT: rc-absolute-2 10 rc-indirect-arm-pc
rc-absolute-2
rc-absolute-1 ;
! Relocation types ! Relocation types
CONSTANT: rt-dlsym 0 C-ENUM: f
CONSTANT: rt-entry-point 1 rt-dlsym
CONSTANT: rt-entry-point-pic 2 rt-entry-point
CONSTANT: rt-entry-point-pic-tail 3 rt-entry-point-pic
CONSTANT: rt-here 4 rt-entry-point-pic-tail
CONSTANT: rt-this 5 rt-here
CONSTANT: rt-literal 6 rt-this
CONSTANT: rt-untagged 7 rt-literal
CONSTANT: rt-megamorphic-cache-hits 8 rt-untagged
CONSTANT: rt-vm 9 rt-megamorphic-cache-hits
CONSTANT: rt-cards-offset 10 rt-vm
CONSTANT: rt-decks-offset 11 rt-cards-offset
CONSTANT: rt-exception-handler 12 rt-decks-offset
rt-exception-handler ;
: rc-absolute? ( n -- ? ) : rc-absolute? ( n -- ? )
${ rc-absolute-ppc-2/2 rc-absolute-cell rc-absolute } member? ; ${
rc-absolute-ppc-2/2
rc-absolute-cell
rc-absolute
rc-absolute-2
rc-absolute-1
} member? ;

View File

@ -286,25 +286,19 @@ CONSTANT: nv-reg 17
4 ds-reg 0 LWZ rc-absolute-ppc-2 rt-untagged jit-rel 4 ds-reg 0 LWZ rc-absolute-ppc-2 rt-untagged jit-rel
] pic-load jit-define ] pic-load jit-define
! Tag [ 4 4 tag-mask get ANDI ] pic-tag jit-define
: load-tag ( -- )
4 4 tag-mask get ANDI
4 4 tag-bits get SLWI ;
[ load-tag ] pic-tag jit-define
! Tuple
[ [
3 4 MR 3 4 MR
load-tag 4 4 tag-mask get ANDI
0 4 tuple type-number tag-fixnum CMPI 0 4 tuple type-number CMPI
[ BNE ] [ BNE ]
[ 4 3 tuple type-number neg 4 + LWZ ] [ 4 3 tuple-class-offset LWZ ]
jit-conditional* jit-conditional*
] pic-tuple jit-define ] pic-tuple jit-define
[ [
0 4 0 CMPI rc-absolute-ppc-2 rt-literal jit-rel 0 4 0 CMPI rc-absolute-ppc-2 rt-untagged jit-rel
] pic-check-tag jit-define ] pic-check-tag jit-define
[ [
@ -342,6 +336,14 @@ CONSTANT: nv-reg 17
! ! ! Megamorphic caches ! ! ! Megamorphic caches
[ [
! class = ...
3 4 MR
4 4 tag-mask get ANDI
4 4 tag-bits get SLWI
0 4 tuple type-number tag-fixnum CMPI
[ BNE ]
[ 4 3 tuple-class-offset LWZ ]
jit-conditional*
! cache = ... ! cache = ...
0 3 LOAD32 rc-absolute-ppc-2/2 rt-literal jit-rel 0 3 LOAD32 rc-absolute-ppc-2/2 rt-literal jit-rel
! key = hashcode(class) ! key = hashcode(class)

View File

@ -176,6 +176,10 @@ IN: bootstrap.x86
[ jit-jump-quot ] [ jit-jump-quot ]
\ lazy-jit-compile define-combinator-primitive \ lazy-jit-compile define-combinator-primitive
[
temp1 HEX: ffffffff CMP rc-absolute-cell rt-literal jit-rel
] pic-check-tuple jit-define
! Inline cache miss entry points ! Inline cache miss entry points
: jit-load-return-address ( -- ) : jit-load-return-address ( -- )
pic-tail-reg ESP stack-frame-size bootstrap-cell - [+] MOV ; pic-tail-reg ESP stack-frame-size bootstrap-cell - [+] MOV ;

View File

@ -160,6 +160,11 @@ IN: bootstrap.x86
[ jit-jump-quot ] [ jit-jump-quot ]
\ lazy-jit-compile define-combinator-primitive \ lazy-jit-compile define-combinator-primitive
[
temp2 HEX: ffffffff MOV rc-absolute-cell rt-literal jit-rel
temp1 temp2 CMP
] pic-check-tuple jit-define
! Inline cache miss entry points ! Inline cache miss entry points
: jit-load-return-address ( -- ) : jit-load-return-address ( -- )
RBX RSP stack-frame-size bootstrap-cell - [+] MOV ; RBX RSP stack-frame-size bootstrap-cell - [+] MOV ;

View File

@ -206,43 +206,37 @@ big-endian off
! Load a value from a stack position ! Load a value from a stack position
[ [
temp1 ds-reg HEX: ffffffff [+] MOV rc-absolute rt-untagged jit-rel temp1 ds-reg HEX: 7f [+] MOV rc-absolute-1 rt-untagged jit-rel
] pic-load jit-define ] pic-load jit-define
! Tag [ temp1 tag-mask get AND ] pic-tag jit-define
: load-tag ( -- )
temp1 tag-mask get AND
temp1 tag-bits get SHL ;
[ load-tag ] pic-tag jit-define
! The 'make' trick lets us compute the jump distance for the
! conditional branches there
! Tuple
[ [
temp0 temp1 MOV temp0 temp1 MOV
load-tag temp1 tag-mask get AND
temp1 tuple type-number tag-fixnum CMP temp1 tuple type-number CMP
[ JNE ] [ JNE ]
[ temp1 temp0 tuple type-number neg bootstrap-cell + [+] MOV ] [ temp1 temp0 tuple-class-offset [+] MOV ]
jit-conditional jit-conditional
] pic-tuple jit-define ] pic-tuple jit-define
[ [
temp1 HEX: ffffffff CMP rc-absolute rt-literal jit-rel temp1 HEX: 7f CMP rc-absolute-1 rt-untagged jit-rel
] pic-check-tag jit-define ] pic-check-tag jit-define
[
temp2 HEX: ffffffff MOV rc-absolute-cell rt-literal jit-rel
temp1 temp2 CMP
] pic-check-tuple jit-define
[ 0 JE rc-relative rt-entry-point jit-rel ] pic-hit jit-define [ 0 JE rc-relative rt-entry-point jit-rel ] pic-hit jit-define
! ! ! Megamorphic caches ! ! ! Megamorphic caches
[ [
! class = ...
temp0 temp1 MOV
temp1 tag-mask get AND
temp1 tag-bits get SHL
temp1 tuple type-number tag-fixnum CMP
[ JNE ]
[ temp1 temp0 tuple-class-offset [+] MOV ]
jit-conditional
! cache = ... ! cache = ...
temp0 0 MOV rc-absolute-cell rt-literal jit-rel temp0 0 MOV rc-absolute-cell rt-literal jit-rel
! key = hashcode(class) ! key = hashcode(class)
@ -256,7 +250,8 @@ big-endian off
temp0 temp2 ADD temp0 temp2 ADD
! if(get(cache) == class) ! if(get(cache) == class)
temp0 [] temp1 CMP temp0 [] temp1 CMP
bootstrap-cell 4 = 14 22 ? JNE ! Yuck! [ JNE ]
[
! megamorphic_cache_hits++ ! megamorphic_cache_hits++
temp1 0 MOV rc-absolute-cell rt-megamorphic-cache-hits jit-rel temp1 0 MOV rc-absolute-cell rt-megamorphic-cache-hits jit-rel
temp1 [] 1 ADD temp1 [] 1 ADD
@ -264,6 +259,7 @@ big-endian off
temp0 temp0 bootstrap-cell [+] MOV temp0 temp0 bootstrap-cell [+] MOV
temp0 word-entry-point-offset [+] JMP temp0 word-entry-point-offset [+] JMP
! fall-through on miss ! fall-through on miss
] jit-conditional
] mega-lookup jit-define ] mega-lookup jit-define
! ! ! Sub-primitives ! ! ! Sub-primitives

View File

@ -0,0 +1 @@
Erik Charlebois

View File

@ -0,0 +1,7 @@
! Copyright (C) 2010 Erik Charlebois.
! See http://factorcode.org/license.txt for BSD license.
USING: images.testing ;
IN: images.pbm.tests
"vocab:images/testing/pbm/test.binary.pbm" decode-test
"vocab:images/testing/pbm/test.ascii.pbm" decode-test

View File

@ -0,0 +1,86 @@
! Copyright (C) 2010 Erik Charlebois.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays ascii bit-arrays byte-arrays combinators
continuations grouping images images.loader io io.encodings.ascii
io.encodings.string kernel locals make math math.functions math.parser
sequences ;
IN: images.pbm
SINGLETON: pbm-image
"pbm" pbm-image register-image-class
<PRIVATE
: read-token ( -- token )
[
read1 dup blank?
[ t ]
[
dup CHAR: # =
[ "\n" read-until 2drop t ]
[ f ] if
] if
] [ drop ] while
" \n\r\t" read-until drop swap
prefix ascii decode ;
: read-number ( -- number )
read-token string>number ;
: read-ascii-bits ( -- )
read1 {
{ CHAR: 1 [ 0 , read-ascii-bits ] }
{ CHAR: 0 [ 255 , read-ascii-bits ] }
{ f [ ] }
[ drop read-ascii-bits ]
} case ;
:: read-binary-bits ( width height -- )
width 8 align 8 / height * read
width 8 align 8 / <groups> [| row |
width iota [| n |
n 8 / floor row nth
n 8 mod 7 swap - bit?
[ 0 ] [ 255 ] if ,
] each
] each ;
:: write-binary-bits ( bitmap width -- )
bitmap width <groups> [
width 8 align 255 pad-tail
8 <groups> [
[ 255 = [ f ] [ t ] if ] { } map-as
>bit-array reverse bit-array>integer
1array >byte-array write
] each
] each ;
:: read-pbm ( -- image )
read-token :> type
read-number :> width
read-number :> height
width height * :> npixels
width 8 mod :> leftover
type {
{ "P1" [ [ [ read-ascii-bits ] ignore-errors ] B{ } make ] }
{ "P4" [ [ width height read-binary-bits ] B{ } make ] }
} case :> data
image new
L >>component-order
{ width height } >>dim
f >>upside-down?
data >>bitmap
ubyte-components >>component-type ;
PRIVATE>
M: pbm-image stream>image
drop [ read-pbm ] with-input-stream ;
M: pbm-image image>stream
drop {
[ drop "P4\n" ascii encode write ]
[ dim>> first number>string " " append ascii encode write ]
[ dim>> second number>string "\n" append ascii encode write ]
[ [ bitmap>> ] [ dim>> first ] bi write-binary-bits ]
} cleave ;

View File

@ -0,0 +1 @@
Image loading for PBM image files.

Binary file not shown.

View File

@ -0,0 +1,369 @@
P1
# CREATOR: GIMP PNM Filter Version 1.1
160 160
1111111100000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000111111111111111100000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000011111111111111111000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000111111111111111111
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0111111111111111111000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000111111111111111110000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000001111111111111111100000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000011111111
1111111110000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000111111101111110000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000001011111001010000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000101000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000001111
1111111111111111111111010000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000011111111111111111111111111111111000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000001111111111111111111111111111111111100
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000111111111111111111
1111111111111111111000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0111111111111111111111111111111111111111000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000001111111111111111111111111111111111111110000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000011111111111111111111111111111
1111111111000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000001111111111
1111111111111111111111111111110000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000111111111111111111111111111111111111111100000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000011111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000111111111111111111111
1111111111111111111100000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000001
1111111111111111111111111111111111111111000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000111111111111000000000000000001111111111110000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001111111111110000000000000000011
1111111111000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000011111111111
1000000000000000001111111111110000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000001111111111110000000000000000011111111111100000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000011111111111100000000000000000111111111111
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000111111111111000000000
0000000011111111111100000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000001
1111111111100000000000000000111111111111000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000111111111111000000000000000001111111111110000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001111111111110000000000000000011
1111111111000000000000000000000000000000000000000000000000000000000000
0000000000011110100000000000000000000000000000000000000000011111111111
1000000000000000001111111111110000000000000000000000000000000000000000
0000000000000000000000000000111111111110000000000000000000000000000000
0000000001111111111110000000000000000011111111111100000000000000000000
0000000000000000000000000000000000000000000000111111111111110000000000
0000000000000000000000000000011111111111100000000000000000111111111111
0000000000000000000000000000000000000000000000000000000000000001111111
1111111111100000000000000000000000000000000000000111111111111000000000
0000000111111111111100000000000000000000000000000000000000000000000000
0000000000111111111111111111111100000000000000000000000000000000000001
1111111111100000000000000001111111111110000000000000000000000000000000
0000000000000000000000000000011111111111111111111111000000000000000000
0000000000000000001111111111111000000000000000011111111111100000000000
0000000000000000000000000000000000000000000000011111111111111111111111
1110000000000000000000000000000000000001111111111100000000000000000111
1111111110000000000000000000000000000000000000000000000000000000001111
1111111111111111111111100000000000000000000000000000000000111111111111
0000000000000000011111111111100000000000000000000000000000000000000000
0000000000000011111111111111111111111111111000000000000000000000000000
0000000011111111111100000000000000000111111111110000000000000000000000
0000000000000000000000000000000011111111111111111111111111111110000000
0000000000000000000000000000111111111111000000000000000011111111111100
0000000000000000000000000000000000000000000000000001111111111111111111
1111111111111000000000000000000000000000000000001111111111110000000000
0000001111111111110000000000000000000000000000000000000000000000000000
1111111111111111111111111111111110000000000000000000000000000000000011
1111111111000000000000000011111111111100000000000000000000000000000000
0000000000000000000111111111111111111111111111111111110000000000000000
0000000000000000001111111111110000000000000000111111111111000000000000
0000000000000000000000000000000000000001111111111111111111111011111111
1111000000000000000000000000000000000111111111111100000000000000001111
1111111100000000000000000000000000000000000000000000000000011111111111
1111110000001111111111110000000000000000000000000000000011111111111110
0000000000000000111111111111000000000000000000000000000000000000000000
0000000011111111111111111000000011111111111110000000000000000000000000
0000011111111111111000000000000000001111111111110000000000000000000000
0000000000000000000000000000111111111111111000000000011111111111000000
0000000000000000000000000111111111111110000000000000000011111111111100
0000000000000000000000000000000000000000000000001111111111111100000000
0001111111111110000000000000000000000000000011111111111111000000000000
0000001111111111110000000000000000000000000000000000000000000000000011
1111111111000000000000011111111111100000000000000000000000000011111111
1111111100000000000000000011111111111100000000000000000000000000000000
0000000000000000001111111111100000000000000111111111111000000000000000
0000000000001111111111111110000000000000000000111111111111000000000000
0000000000000000000000000000000000000111111111111000000000000001111111
1111100000000000000000000000000111111111111111000000000000000000001111
1111111100000000000000000000000000000000000000000000000001111111111110
0000000000000111111111111000000000000000000000000011111111111111110000
0000000000000000111111111111000000000000000000000000000000000000000000
0000000111111111111000000000000001111111111110000000000000000000000001
1111111111111110000000000000000000001111111111110000000000000000000000
0000000000000000000000000001111111111110000000000000011111111111110000
0000000000000000000111111111111111000000000000000000000011111111111100
0000000000000000000000000000000000000000000000011111111111100000000000
0000111111111111000000000000000000000111111111111111100000000000000000
0000001111111111110000000000000000000000000000000000000000000000000111
1111111110000000000000001111111111110000000000000000000011111111111111
1100000000000000000000000011111111111100000000000000000000000000000000
0000000000000000011111111111100000000000000011111111111110000000000000
0000011111111111111110000000000000000000000000111111111111000000000000
0000000000000000000000000000000000000111111111111000000000000000011111
1111111000000000000000000111111111111111100000000000000000000000001111
1111111100000000000000000000000000000000000000000000000001111111111110
0000000000000001111111111110000000000000000111111111111111100000000000
0000000000000000111111111110000000000000000000000000000000000000000000
0000000111111111111000000000000000011111111111100000000000000001111111
1111111110000000000000000000000000011111111111110000000000000000000000
0000000000000000000000000001111111111110000000000000000111111111111000
0000000000001111111111111111000000000000000000000000000111111111111000
0000000000000000000000000000000000000000000000011111111111100000000000
0000011111111111110000000000000111111111111111100000000000000000000000
0000011111111111100000000000000000000000000000000000000000000000000111
1111111110000000000000000011111111111100000000000011111111111111110000
0000000000000000000000000111111111111000000000000000000000000000000000
0000000000000000011111111111100000000000000000111111111111000000000001
1111111111111100000000000000000000000000000001111111111110000000000000
0000000000000000000000000000000000000111111111111000000000000000001111
1111111110000000001111111111111111000000000000000000000000000000011111
1111111000000000000000000000000000000000000000000000000001111111111110
0000000000000000011111111111100000000111111111111111100000000000000000
0000000000000001111111111110000000000000000000000000000000000000000000
0000000111111111111000000000000000000111111111111000000111111111111111
1100000000000000000000000000000000011111111111100000000000000000000000
0000000000000000000000000001111111111110000000000000000001111111111110
0000011111111111111110000000000000000000000000000000000111111111111000
0000000000000000000000000000000000000000000000011111111111100000000000
0000000111111111111000011111111111111111000000000000000000000000000000
0000011111111111100000000000000000000000000000000000000000000000000111
1111111110000000000000000000111111111111001111111111111111110000000000
0000000000000000000000000111111111111000000000000000000000000000000000
0000000000000000011111111111100000000000000000001111111111110111111111
1111111100000000000000000000000000000000000001111111111110000000000000
0000000000000000000000000000000000000111111111111000000000000000000011
1111111111111111111111111111000000000000000000000000000000000000011111
1111111000000000000000000000000000000000000000000000000001111111111110
0000000000000000001111111111111111111111111111000000000000000000000000
0000000000000001111111111110000000000000000000000000000000000000000000
0000000111111111111000000000000000000001111111111111111111111111100000
0000000000000000000000000000000000011111111111100000000000000000000000
0000000000000000000000000001111111111110000000000000000000011111111111
1111111111111100000000000000000000000000000000000000001111111111110000
0000000000000000000000000000000000000000000000011111111111100000000000
0000000001111111111111111111111110000000000000000000000000000000000000
0000111111111111000000000000000000000000000000000000000000000000000111
1111111110000000000000000000011111111111111111111111000000000000000000
0000000000000000000000001111111111110000000000000000000000000000000000
0000000000000000011111111111100000000000000000000111111111111111111111
0000000000000000000000000000000000000000000011111111111100000000000000
0000000000000000000000000000000000000111111111111000000000000000000001
1111111111111111111000000000000000000000000000000000000000000000111111
1111110000000000000000000000000000000000000000000000000001111111111110
0000000000000000000111111111111111111100000000000000000000000000000000
0000000000000011111111111100000000000000000000000000000000000000000000
0000000111111111111000000000000000000000111111111111111110000000000000
0000000000000000000000000000000000111111111111000000000000000000000000
0000000000000000000000000001111111111110000000000000000000001111111111
1111111000000000000000000000000000000000000000000000001111111111110000
0000000000000000000000000000000000000000000000011111111111100000000000
0000000000111111111111111000000000000000000000000000000000000000000000
0000111111111111000000000000000000000000000000000000000000000000000111
1111111110000000000000000000001111111111111000000000000000000000000000
0000000000000000000000001111111111110000000000000000000000000000000000
0000000000000000011111111111100000000000000000000001111111111110000000
0000000000000000000000000000000000000000000011111111111100000000000000
0000000000000000000000000000000000000111111111111000000000000000000000
0011111111110000000000000000000000000000000000000000000000000000111111
1111110000000000000000000000000000000000000000000000000001111111111110
0000000000000000000000011111110000001011111111111110100000000000000000
0000000000000011111111111100000000000000000000000000000000000000000000
0000000111111111111000000000000000000000000000101010111111111111111111
1111111111000000000000000000000000111111111111000000000000000000000000
0000000000000000000000000001111111111110000000000000000000000000001111
1111111111111111111111111111111100000000000000000000001111111111110000
0000000000000000000000000000000000000000000000011111111111100000000000
0000000101111111111111111111111111111111111111111111100000000000000000
0000111111111111000000000000000000000000000000000000000000000000000111
1111111110000000000000101111111111111111111111111111111111111111111111
1110000000000000000000001111111111110000000000000000000000000000000000
0000000000000000011111111111100000101111111111111111111111111111111111
1111111111111111111111110000000000000000000011111111111100000000000000
0000000000000000000000000000000000000111111111111000111111111111111111
1111111111111111111111111111111111111111111100000000000000000000111111
1111110000000000000000000000000000000000000000000000000001111111111110
0011111111111111111111111111111111111111111111111111111111111111000000
0000000000000011111111111100000000000000000000000000000000000000000000
0000000111111111111111111111111111111111111111111111111111111111111111
1111111111111100000000000000000000111111111111000000000000000000000000
0000000000000000000000000001111111111111111111111111111111111111111111
1111111111111111111111111111111110000000000000000000011111111111110000
0000000000000000000000000000000000000000000000011111111111111111111111
1111111111111111111111111111111111111111111111111111100000000000000000
0001111111111110000000000000000000000000000000000000000000000000000111
1111111111111111111111111111111111111111111111111111111111111111111111
1100000000000000000000011111111111100000000000000000000000000000000000
0000000000000000011111111111111111111111111111111111111111111111111111
1111111111111111111100000000000000000000000111111111111000000000000000
0000000000000000000000000000000000000111111111111111111111111111111111
1111111111111111111111111111111111111000000000000000000000000011111111
1111100000000000000000000000000000000000000000000000000001111111111111
1111111111111111111111111111111111111111111111111111110000000000000000
0000000000011111111111110000000000000000000000000000000000000000000000
0000000111111111111111111111111111110100000000111111111111111111111111
1100000000000000000000000000000111111111111100000000000000000000000000
0000000000000000000000000001111111111111111111111111010000000000011111
1111111111111111111000000000000000000000000000000111111111111111000000
0000000000000000000000000000000000000000000000111111111111111111111000
0000000000000111111111111111111111111000000000000000000000000000000001
1111111111111000000000000000000000000000000000000000000000000000001111
1111111111111110000000000000000111111111111111111111111000000000000000
0000000000000000011111111111111110000000000000000000000000000000000000
0000000000000000111111111111111100000000000000000111111111111111111111
1111000000000000000000000000000000011111111111111111000000000000000000
0000000000000000000000000000000000001111111111111110000000000000000011
1111111111111111111110000000000000000000000000000000001111111111111111
1000000000000000000000000000000000000000000000000000000001111111111110
0000000000000000001111111111111111111101000000000000000000000000000000
0001111111111111111110000000000000000000000000000000000000000000000000
0000000111111111110000000000000000000111111111111111111110000000000000
0000000000000000000001111111111111111111000000000000000000000000000000
0000000000000000000000000000111111111000000000000000000011111111111111
1111110000000000000000000000000000000000011111111111111111100000000000
0000000000000000000000000000000000000000000000000111111100000000000000
0000001111111111111111100000000000000000000000000000000000011111111111
1111111100000000000000000000000000000000000000000000000000000000000000
0010100000000000000000000011111111111111110000000000000000000000000000
0000000011111111111111111110000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000111111111111111000000000
0000000000000000000000000011111111111111111110000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000001111
1111111110000000000000000000000000000000000000111111111111111111100000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000111111111111000000000000000000000000000000000000011111
1111111111110000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000001111111111110000000000000000000000
0000000000000011111111111111111000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000011111111111100
0000000000000000000000000000000001111111111111111100000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000001111111111110000000000000000000000000000000000111111111111111111
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000001111111111100000000000000000000000000000000
1111111111111111110000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000011111111111100000000000
0000000000000000000111111111111111111000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000111
1111111110000000000000000000000000000111111111111111111100000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000011111111111110000000000000000000000000011111111111111
1111000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000011111111111100000000000000000000
0000111111111111111111110000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000111111111111
1000000000000000000000011111111111111111110000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000011111111111110000000000000000000011111111111111111111000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000011111111111110000000000000000000111111111
1111111111100000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000111111111111100000000
0000000001111111111111111111100000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
1111111111110000000000000000111111111111111111110000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000011111111111110000000000000011111111111111111110000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000011111111111100000000000001111
1111111111111110000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000111111111
1111000000000001111111111111111110000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000011111111111110000000000111111111111111111000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000011111111111110000000011111111111111111
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000111111111111110000
0011111111111111111100000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0001111111111111000011111111111111111100000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000001111111111111100111111111111111110000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000011111111111111111111111111
1111100000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000011111
1111111111111111111111110000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000001111111111111111111111111111100000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000001111111111111111111111111110000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000011111111111111
1111111111110000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
0000000111111111111111111111110000000000000000000000000000000000000000
0000000000000000000000000101000000101000000000000000000000000000000000
0000000000000000000000000000111111111111111111111000000000000000000000
0000000000000000000000000000000000000000000011111100111111000000000000
0000000000000000000000000000000000000000000000000111111111111111111110
0000000000000000000000000000000000000000000000000000000000000001111111
1111111110000000000000000000000000000000000000000000000000000000000000
1111111111111111100000000000000000000000000000000000000000000000000000
0000000000001111111111111111110000000000000000000000000000000000000000
0000000000000000000001111111111111111000000000000000000000000000000000
0000000000000000000000000000000011111111111111111100000000000000000000
0000000000000000000000000000000000000000011111111111111000000000000000
0000000000000000000000000000000000000000000000000001111111111111111111
1000000000000000000000000000000000000000000000000000000000000001111111
1111000000000000000000000000000000000000000000000000000000000000000000
0111111111111111111100000000000000000000000000000000000000000000000000
0000000000000001111101000000000000000000000000000000000000000000000000
0000000000000000000000111111111111111111000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000011111111

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +1,6 @@
! Copyright (C) 2010 Erik Charlebois. ! Copyright (C) 2010 Erik Charlebois.
! See http:// factorcode.org/license.txt for BSD license. ! See http:// factorcode.org/license.txt for BSD license.
USING: alien.c-types alien.syntax classes.struct kernel literals math unix.types ; USING: alien.c-types alien.syntax classes.struct kernel literals math ;
IN: macho IN: macho
TYPEDEF: int integer_t TYPEDEF: int integer_t
@ -21,26 +21,26 @@ CONSTANT: VM_PROT_WANTS_COPY HEX: 10
! loader.h ! loader.h
STRUCT: mach_header STRUCT: mach_header
{ magic uint32_t } { magic uint }
{ cputype cpu_type_t } { cputype cpu_type_t }
{ cpusubtype cpu_subtype_t } { cpusubtype cpu_subtype_t }
{ filetype uint32_t } { filetype uint }
{ ncmds uint32_t } { ncmds uint }
{ sizeofcmds uint32_t } { sizeofcmds uint }
{ flags uint32_t } ; { flags uint } ;
CONSTANT: MH_MAGIC HEX: feedface CONSTANT: MH_MAGIC HEX: feedface
CONSTANT: MH_CIGAM HEX: cefaedfe CONSTANT: MH_CIGAM HEX: cefaedfe
STRUCT: mach_header_64 STRUCT: mach_header_64
{ magic uint32_t } { magic uint }
{ cputype cpu_type_t } { cputype cpu_type_t }
{ cpusubtype cpu_subtype_t } { cpusubtype cpu_subtype_t }
{ filetype uint32_t } { filetype uint }
{ ncmds uint32_t } { ncmds uint }
{ sizeofcmds uint32_t } { sizeofcmds uint }
{ flags uint32_t } { flags uint }
{ reserved uint32_t } ; { reserved uint } ;
CONSTANT: MH_MAGIC_64 HEX: feedfacf CONSTANT: MH_MAGIC_64 HEX: feedfacf
CONSTANT: MH_CIGAM_64 HEX: cffaedfe CONSTANT: MH_CIGAM_64 HEX: cffaedfe
@ -82,8 +82,8 @@ CONSTANT: MH_NO_REEXPORTED_DYLIBS HEX: 100000
CONSTANT: MH_PIE HEX: 200000 CONSTANT: MH_PIE HEX: 200000
STRUCT: load_command STRUCT: load_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } ; { cmdsize uint } ;
CONSTANT: LC_REQ_DYLD HEX: 80000000 CONSTANT: LC_REQ_DYLD HEX: 80000000
@ -124,34 +124,34 @@ CONSTANT: LC_DYLD_INFO HEX: 22
CONSTANT: LC_DYLD_INFO_ONLY HEX: 80000022 CONSTANT: LC_DYLD_INFO_ONLY HEX: 80000022
UNION-STRUCT: lc_str UNION-STRUCT: lc_str
{ offset uint32_t } { offset uint }
{ ptr char* } ; { ptr char* } ;
STRUCT: segment_command STRUCT: segment_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ segname char[16] } { segname char[16] }
{ vmaddr uint32_t } { vmaddr uint }
{ vmsize uint32_t } { vmsize uint }
{ fileoff uint32_t } { fileoff uint }
{ filesize uint32_t } { filesize uint }
{ maxprot vm_prot_t } { maxprot vm_prot_t }
{ initprot vm_prot_t } { initprot vm_prot_t }
{ nsects uint32_t } { nsects uint }
{ flags uint32_t } ; { flags uint } ;
STRUCT: segment_command_64 STRUCT: segment_command_64
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ segname char[16] } { segname char[16] }
{ vmaddr uint64_t } { vmaddr ulonglong }
{ vmsize uint64_t } { vmsize ulonglong }
{ fileoff uint64_t } { fileoff ulonglong }
{ filesize uint64_t } { filesize ulonglong }
{ maxprot vm_prot_t } { maxprot vm_prot_t }
{ initprot vm_prot_t } { initprot vm_prot_t }
{ nsects uint32_t } { nsects uint }
{ flags uint32_t } ; { flags uint } ;
CONSTANT: SG_HIGHVM HEX: 1 CONSTANT: SG_HIGHVM HEX: 1
CONSTANT: SG_FVMLIB HEX: 2 CONSTANT: SG_FVMLIB HEX: 2
@ -161,29 +161,29 @@ CONSTANT: SG_PROTECTED_VERSION_1 HEX: 8
STRUCT: section STRUCT: section
{ sectname char[16] } { sectname char[16] }
{ segname char[16] } { segname char[16] }
{ addr uint32_t } { addr uint }
{ size uint32_t } { size uint }
{ offset uint32_t } { offset uint }
{ align uint32_t } { align uint }
{ reloff uint32_t } { reloff uint }
{ nreloc uint32_t } { nreloc uint }
{ flags uint32_t } { flags uint }
{ reserved1 uint32_t } { reserved1 uint }
{ reserved2 uint32_t } ; { reserved2 uint } ;
STRUCT: section_64 STRUCT: section_64
{ sectname char[16] } { sectname char[16] }
{ segname char[16] } { segname char[16] }
{ addr uint64_t } { addr ulonglong }
{ size uint64_t } { size ulonglong }
{ offset uint32_t } { offset uint }
{ align uint32_t } { align uint }
{ reloff uint32_t } { reloff uint }
{ nreloc uint32_t } { nreloc uint }
{ flags uint32_t } { flags uint }
{ reserved1 uint32_t } { reserved1 uint }
{ reserved2 uint32_t } { reserved2 uint }
{ reserved3 uint32_t } ; { reserved3 uint } ;
CONSTANT: SECTION_TYPE HEX: 000000ff CONSTANT: SECTION_TYPE HEX: 000000ff
CONSTANT: SECTION_ATTRIBUTES HEX: ffffff00 CONSTANT: SECTION_ATTRIBUTES HEX: ffffff00
@ -242,205 +242,205 @@ CONSTANT: SEG_IMPORT "__IMPORT"
STRUCT: fvmlib STRUCT: fvmlib
{ name lc_str } { name lc_str }
{ minor_version uint32_t } { minor_version uint }
{ header_addr uint32_t } ; { header_addr uint } ;
STRUCT: fvmlib_command STRUCT: fvmlib_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ fvmlib fvmlib } ; { fvmlib fvmlib } ;
STRUCT: dylib STRUCT: dylib
{ name lc_str } { name lc_str }
{ timestamp uint32_t } { timestamp uint }
{ current_version uint32_t } { current_version uint }
{ compatibility_version uint32_t } ; { compatibility_version uint } ;
STRUCT: dylib_command STRUCT: dylib_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ dylib dylib } ; { dylib dylib } ;
STRUCT: sub_framework_command STRUCT: sub_framework_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ umbrella lc_str } ; { umbrella lc_str } ;
STRUCT: sub_client_command STRUCT: sub_client_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ client lc_str } ; { client lc_str } ;
STRUCT: sub_umbrella_command STRUCT: sub_umbrella_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ sub_umbrella lc_str } ; { sub_umbrella lc_str } ;
STRUCT: sub_library_command STRUCT: sub_library_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ sub_library lc_str } ; { sub_library lc_str } ;
STRUCT: prebound_dylib_command STRUCT: prebound_dylib_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ name lc_str } { name lc_str }
{ nmodules uint32_t } { nmodules uint }
{ linked_modules lc_str } ; { linked_modules lc_str } ;
STRUCT: dylinker_command STRUCT: dylinker_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ name lc_str } ; { name lc_str } ;
STRUCT: thread_command STRUCT: thread_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } ; { cmdsize uint } ;
STRUCT: routines_command STRUCT: routines_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ init_address uint32_t } { init_address uint }
{ init_module uint32_t } { init_module uint }
{ reserved1 uint32_t } { reserved1 uint }
{ reserved2 uint32_t } { reserved2 uint }
{ reserved3 uint32_t } { reserved3 uint }
{ reserved4 uint32_t } { reserved4 uint }
{ reserved5 uint32_t } { reserved5 uint }
{ reserved6 uint32_t } ; { reserved6 uint } ;
STRUCT: routines_command_64 STRUCT: routines_command_64
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ init_address uint64_t } { init_address ulonglong }
{ init_module uint64_t } { init_module ulonglong }
{ reserved1 uint64_t } { reserved1 ulonglong }
{ reserved2 uint64_t } { reserved2 ulonglong }
{ reserved3 uint64_t } { reserved3 ulonglong }
{ reserved4 uint64_t } { reserved4 ulonglong }
{ reserved5 uint64_t } { reserved5 ulonglong }
{ reserved6 uint64_t } ; { reserved6 ulonglong } ;
STRUCT: symtab_command STRUCT: symtab_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ symoff uint32_t } { symoff uint }
{ nsyms uint32_t } { nsyms uint }
{ stroff uint32_t } { stroff uint }
{ strsize uint32_t } ; { strsize uint } ;
STRUCT: dysymtab_command STRUCT: dysymtab_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ ilocalsym uint32_t } { ilocalsym uint }
{ nlocalsym uint32_t } { nlocalsym uint }
{ iextdefsym uint32_t } { iextdefsym uint }
{ nextdefsym uint32_t } { nextdefsym uint }
{ iundefsym uint32_t } { iundefsym uint }
{ nundefsym uint32_t } { nundefsym uint }
{ tocoff uint32_t } { tocoff uint }
{ ntoc uint32_t } { ntoc uint }
{ modtaboff uint32_t } { modtaboff uint }
{ nmodtab uint32_t } { nmodtab uint }
{ extrefsymoff uint32_t } { extrefsymoff uint }
{ nextrefsyms uint32_t } { nextrefsyms uint }
{ indirectsymoff uint32_t } { indirectsymoff uint }
{ nindirectsyms uint32_t } { nindirectsyms uint }
{ extreloff uint32_t } { extreloff uint }
{ nextrel uint32_t } { nextrel uint }
{ locreloff uint32_t } { locreloff uint }
{ nlocrel uint32_t } ; { nlocrel uint } ;
CONSTANT: INDIRECT_SYMBOL_LOCAL HEX: 80000000 CONSTANT: INDIRECT_SYMBOL_LOCAL HEX: 80000000
CONSTANT: INDIRECT_SYMBOL_ABS HEX: 40000000 CONSTANT: INDIRECT_SYMBOL_ABS HEX: 40000000
STRUCT: dylib_table_of_contents STRUCT: dylib_table_of_contents
{ symbol_index uint32_t } { symbol_index uint }
{ module_index uint32_t } ; { module_index uint } ;
STRUCT: dylib_module STRUCT: dylib_module
{ module_name uint32_t } { module_name uint }
{ iextdefsym uint32_t } { iextdefsym uint }
{ nextdefsym uint32_t } { nextdefsym uint }
{ irefsym uint32_t } { irefsym uint }
{ nrefsym uint32_t } { nrefsym uint }
{ ilocalsym uint32_t } { ilocalsym uint }
{ nlocalsym uint32_t } { nlocalsym uint }
{ iextrel uint32_t } { iextrel uint }
{ nextrel uint32_t } { nextrel uint }
{ iinit_iterm uint32_t } { iinit_iterm uint }
{ ninit_nterm uint32_t } { ninit_nterm uint }
{ objc_module_info_addr uint32_t } { objc_module_info_addr uint }
{ objc_module_info_size uint32_t } ; { objc_module_info_size uint } ;
STRUCT: dylib_module_64 STRUCT: dylib_module_64
{ module_name uint32_t } { module_name uint }
{ iextdefsym uint32_t } { iextdefsym uint }
{ nextdefsym uint32_t } { nextdefsym uint }
{ irefsym uint32_t } { irefsym uint }
{ nrefsym uint32_t } { nrefsym uint }
{ ilocalsym uint32_t } { ilocalsym uint }
{ nlocalsym uint32_t } { nlocalsym uint }
{ iextrel uint32_t } { iextrel uint }
{ nextrel uint32_t } { nextrel uint }
{ iinit_iterm uint32_t } { iinit_iterm uint }
{ ninit_nterm uint32_t } { ninit_nterm uint }
{ objc_module_info_size uint32_t } { objc_module_info_size uint }
{ objc_module_info_addr uint64_t } ; { objc_module_info_addr ulonglong } ;
STRUCT: dylib_reference STRUCT: dylib_reference
{ isym_flags uint32_t } ; { isym_flags uint } ;
STRUCT: twolevel_hints_command STRUCT: twolevel_hints_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ offset uint32_t } { offset uint }
{ nhints uint32_t } ; { nhints uint } ;
STRUCT: twolevel_hint STRUCT: twolevel_hint
{ isub_image_itoc uint32_t } ; { isub_image_itoc uint } ;
STRUCT: prebind_cksum_command STRUCT: prebind_cksum_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ cksum uint32_t } ; { cksum uint } ;
STRUCT: uuid_command STRUCT: uuid_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ uuid uint8_t[16] } ; { uuid uchar[16] } ;
STRUCT: rpath_command STRUCT: rpath_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ path lc_str } ; { path lc_str } ;
STRUCT: linkedit_data_command STRUCT: linkedit_data_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ dataoff uint32_t } { dataoff uint }
{ datasize uint32_t } ; { datasize uint } ;
STRUCT: encryption_info_command STRUCT: encryption_info_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ cryptoff uint32_t } { cryptoff uint }
{ cryptsize uint32_t } { cryptsize uint }
{ cryptid uint32_t } ; { cryptid uint } ;
STRUCT: dyld_info_command STRUCT: dyld_info_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ rebase_off uint32_t } { rebase_off uint }
{ rebase_size uint32_t } { rebase_size uint }
{ bind_off uint32_t } { bind_off uint }
{ bind_size uint32_t } { bind_size uint }
{ weak_bind_off uint32_t } { weak_bind_off uint }
{ weak_bind_size uint32_t } { weak_bind_size uint }
{ lazy_bind_off uint32_t } { lazy_bind_off uint }
{ lazy_bind_size uint32_t } { lazy_bind_size uint }
{ export_off uint32_t } { export_off uint }
{ export_size uint32_t } ; { export_size uint } ;
CONSTANT: REBASE_TYPE_POINTER 1 CONSTANT: REBASE_TYPE_POINTER 1
CONSTANT: REBASE_TYPE_TEXT_ABSOLUTE32 2 CONSTANT: REBASE_TYPE_TEXT_ABSOLUTE32 2
@ -493,20 +493,20 @@ CONSTANT: EXPORT_SYMBOL_FLAGS_INDIRECT_DEFINITION HEX: 08
CONSTANT: EXPORT_SYMBOL_FLAGS_HAS_SPECIALIZATIONS HEX: 10 CONSTANT: EXPORT_SYMBOL_FLAGS_HAS_SPECIALIZATIONS HEX: 10
STRUCT: symseg_command STRUCT: symseg_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ offset uint32_t } { offset uint }
{ size uint32_t } ; { size uint } ;
STRUCT: ident_command STRUCT: ident_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } ; { cmdsize uint } ;
STRUCT: fvmfile_command STRUCT: fvmfile_command
{ cmd uint32_t } { cmd uint }
{ cmdsize uint32_t } { cmdsize uint }
{ name lc_str } { name lc_str }
{ header_addr uint32_t } ; { header_addr uint } ;
! machine.h ! machine.h
CONSTANT: CPU_STATE_MAX 4 CONSTANT: CPU_STATE_MAX 4
@ -670,30 +670,30 @@ CONSTANT: FAT_MAGIC HEX: cafebabe
CONSTANT: FAT_CIGAM HEX: bebafeca CONSTANT: FAT_CIGAM HEX: bebafeca
STRUCT: fat_header STRUCT: fat_header
{ magic uint32_t } { magic uint }
{ nfat_arch uint32_t } ; { nfat_arch uint } ;
STRUCT: fat_arch STRUCT: fat_arch
{ cputype cpu_type_t } { cputype cpu_type_t }
{ cpusubtype cpu_subtype_t } { cpusubtype cpu_subtype_t }
{ offset uint32_t } { offset uint }
{ size uint32_t } { size uint }
{ align uint32_t } ; { align uint } ;
! nlist.h ! nlist.h
STRUCT: nlist STRUCT: nlist
{ n_strx int32_t } { n_strx int }
{ n_type uint8_t } { n_type uchar }
{ n_sect uint8_t } { n_sect uchar }
{ n_desc int16_t } { n_desc short }
{ n_value uint32_t } ; { n_value uint } ;
STRUCT: nlist_64 STRUCT: nlist_64
{ n_strx uint32_t } { n_strx uint }
{ n_type uint8_t } { n_type uchar }
{ n_sect uint8_t } { n_sect uchar }
{ n_desc uint16_t } { n_desc ushort }
{ n_value uint64_t } ; { n_value ulonglong } ;
CONSTANT: N_STAB HEX: e0 CONSTANT: N_STAB HEX: e0
CONSTANT: N_PEXT HEX: 10 CONSTANT: N_PEXT HEX: 10
@ -750,24 +750,24 @@ CONSTANT: SYMDEF "__.SYMDEF"
CONSTANT: SYMDEF_SORTED "__.SYMDEF SORTED" CONSTANT: SYMDEF_SORTED "__.SYMDEF SORTED"
STRUCT: ranlib STRUCT: ranlib
{ ran_strx uint32_t } { ran_strx uint }
{ ran_off uint32_t } ; { ran_off uint } ;
! reloc.h ! reloc.h
STRUCT: relocation_info STRUCT: relocation_info
{ r_address int32_t } { r_address int }
{ r_symbolnum_pcrel_length_extern_type uint32_t } ; { r_symbolnum_pcrel_length_extern_type uint } ;
CONSTANT: R_ABS 0 CONSTANT: R_ABS 0
CONSTANT: R_SCATTERED HEX: 80000000 CONSTANT: R_SCATTERED HEX: 80000000
STRUCT: scattered_relocation_info_big_endian STRUCT: scattered_relocation_info_big_endian
{ r_scattered_pcrel_length_type_address uint32_t } { r_scattered_pcrel_length_type_address uint }
{ r_value int32_t } ; { r_value int } ;
STRUCT: scattered_relocation_info_little_endian STRUCT: scattered_relocation_info_little_endian
{ r_address_type_length_pcrel_scattered uint32_t } { r_address_type_length_pcrel_scattered uint }
{ r_value int32_t } ; { r_value int } ;
C-ENUM: reloc_type_generic C-ENUM: reloc_type_generic
GENERIC_RELOC_VANILLA GENERIC_RELOC_VANILLA

View File

@ -148,8 +148,8 @@ void quotation_jit::emit_mega_cache_lookup(cell methods_, fixnum index, cell cac
data_root<array> methods(methods_,parent); data_root<array> methods(methods_,parent);
data_root<array> cache(cache_,parent); data_root<array> cache(cache_,parent);
/* Generate machine code to determine the object's class. */ /* Load the object from the datastack. */
emit_class_lookup(index,PIC_TUPLE); emit_with_literal(parent->special_objects[PIC_LOAD],tag_fixnum(-index * sizeof(cell)));
/* Do a cache lookup. */ /* Do a cache lookup. */
emit_with_literal(parent->special_objects[MEGA_LOOKUP],cache.value()); emit_with_literal(parent->special_objects[MEGA_LOOKUP],cache.value());

View File

@ -89,7 +89,8 @@ void inline_cache_jit::compile_inline_cache(fixnum index,
parent->update_pic_count(inline_cache_type); parent->update_pic_count(inline_cache_type);
/* Generate machine code to determine the object's class. */ /* Generate machine code to determine the object's class. */
emit_class_lookup(index,inline_cache_type); emit_with_literal(parent->special_objects[PIC_LOAD],tag_fixnum(-index * sizeof(cell)));
emit(parent->special_objects[inline_cache_type]);
/* Generate machine code to check, in turn, if the class is one of the cached entries. */ /* Generate machine code to check, in turn, if the class is one of the cached entries. */
cell i; cell i;

View File

@ -49,6 +49,8 @@ fixnum instruction_operand::load_value(cell relative_to)
return load_value_masked(rel_indirect_arm_mask,20,0) + relative_to + sizeof(cell); return load_value_masked(rel_indirect_arm_mask,20,0) + relative_to + sizeof(cell);
case RC_ABSOLUTE_2: case RC_ABSOLUTE_2:
return *(u16 *)(pointer - sizeof(u16)); return *(u16 *)(pointer - sizeof(u16));
case RC_ABSOLUTE_1:
return *(u8 *)(pointer - sizeof(u8));
default: default:
critical_error("Bad rel class",rel.rel_class()); critical_error("Bad rel class",rel.rel_class());
return 0; return 0;
@ -124,6 +126,9 @@ void instruction_operand::store_value(fixnum absolute_value)
case RC_ABSOLUTE_2: case RC_ABSOLUTE_2:
*(u16 *)(pointer - sizeof(u16)) = (u16)absolute_value; *(u16 *)(pointer - sizeof(u16)) = (u16)absolute_value;
break; break;
case RC_ABSOLUTE_1:
*(u8 *)(pointer - sizeof(u8)) = (u8)absolute_value;
break;
default: default:
critical_error("Bad rel class",rel.rel_class()); critical_error("Bad rel class",rel.rel_class());
break; break;

View File

@ -33,11 +33,11 @@ enum relocation_type {
}; };
enum relocation_class { enum relocation_class {
/* absolute address in a 64-bit location */ /* absolute address in a pointer-width location */
RC_ABSOLUTE_CELL, RC_ABSOLUTE_CELL,
/* absolute address in a 32-bit location */ /* absolute address in a 4 byte location */
RC_ABSOLUTE, RC_ABSOLUTE,
/* relative address in a 32-bit location */ /* relative address in a 4 byte location */
RC_RELATIVE, RC_RELATIVE,
/* absolute address in a PowerPC LIS/ORI sequence */ /* absolute address in a PowerPC LIS/ORI sequence */
RC_ABSOLUTE_PPC_2_2, RC_ABSOLUTE_PPC_2_2,
@ -53,8 +53,10 @@ enum relocation_class {
RC_INDIRECT_ARM, RC_INDIRECT_ARM,
/* pointer to address in an ARM LDR/STR instruction offset by 8 bytes */ /* pointer to address in an ARM LDR/STR instruction offset by 8 bytes */
RC_INDIRECT_ARM_PC, RC_INDIRECT_ARM_PC,
/* absolute address in a 16-bit location */ /* absolute address in a 2 byte location */
RC_ABSOLUTE_2 RC_ABSOLUTE_2,
/* absolute address in a 1 byte location */
RC_ABSOLUTE_1,
}; };
static const cell rel_absolute_ppc_2_mask = 0xffff; static const cell rel_absolute_ppc_2_mask = 0xffff;

View File

@ -103,12 +103,6 @@ bool jit::emit_subprimitive(cell word_, bool tail_call_p, bool stack_frame_p)
return false; return false;
} }
void jit::emit_class_lookup(fixnum index, cell type)
{
emit_with_literal(parent->special_objects[PIC_LOAD],tag_fixnum(-index * sizeof(cell)));
emit(parent->special_objects[type]);
}
/* Facility to convert compiled code offsets to quotation offsets. /* Facility to convert compiled code offsets to quotation offsets.
Call jit_compute_offset() with the compiled code offset, then emit Call jit_compute_offset() with the compiled code offset, then emit
code, and at the end jit->position is the quotation position. */ code, and at the end jit->position is the quotation position. */

View File

@ -47,8 +47,6 @@ struct jit {
bool emit_subprimitive(cell word_, bool tail_call_p, bool stack_frame_p); bool emit_subprimitive(cell word_, bool tail_call_p, bool stack_frame_p);
void emit_class_lookup(fixnum index, cell type);
fixnum get_position() fixnum get_position()
{ {
if(computing_offset_p) if(computing_offset_p)

View File

@ -38,8 +38,7 @@ const char *default_image_path()
u64 nano_count() u64 nano_count()
{ {
struct timespec t; struct timespec t;
int ret; int ret = clock_gettime(CLOCK_MONOTONIC,&t);
ret = clock_gettime(CLOCK_MONOTONIC,&t);
if(ret != 0) if(ret != 0)
fatal_error("clock_gettime failed", 0); fatal_error("clock_gettime failed", 0);
return (u64)t.tv_sec * 1000000000 + t.tv_nsec; return (u64)t.tv_sec * 1000000000 + t.tv_nsec;

View File

@ -87,12 +87,19 @@ Protocol *objc_getProtocol(char *name)
u64 nano_count() u64 nano_count()
{ {
u64 t = mach_absolute_time(); u64 time = mach_absolute_time();
static u64 scaling_factor = 0;
if(!scaling_factor)
{
mach_timebase_info_data_t info; mach_timebase_info_data_t info;
kern_return_t ret = mach_timebase_info(&info); kern_return_t ret = mach_timebase_info(&info);
if(ret != 0) if(ret != 0)
fatal_error("mach_timebase_info failed",ret); fatal_error("mach_timebase_info failed",ret);
return t * (info.numer/info.denom); scaling_factor = info.numer/info.denom;
}
return time * scaling_factor;
} }
} }

View File

@ -18,17 +18,24 @@ u64 system_micros()
u64 nano_count() u64 nano_count()
{ {
LARGE_INTEGER count; static double scale_factor;
LARGE_INTEGER frequency;
static u32 hi = 0; static u32 hi = 0;
static u32 lo = 0; static u32 lo = 0;
BOOL ret;
ret = QueryPerformanceCounter(&count); LARGE_INTEGER count;
BOOL ret = QueryPerformanceCounter(&count);
if(ret == 0) if(ret == 0)
fatal_error("QueryPerformanceCounter", 0); fatal_error("QueryPerformanceCounter", 0);
ret = QueryPerformanceFrequency(&frequency);
if(scale_factor == 0.0)
{
LARGE_INTEGER frequency;
BOOL ret = QueryPerformanceFrequency(&frequency);
if(ret == 0) if(ret == 0)
fatal_error("QueryPerformanceFrequency", 0); fatal_error("QueryPerformanceFrequency", 0);
scale_factor = (1000000000.0 / frequency.QuadPart);
}
#ifdef FACTOR_64 #ifdef FACTOR_64
hi = count.HighPart; hi = count.HighPart;
@ -40,7 +47,7 @@ u64 nano_count()
#endif #endif
lo = count.LowPart; lo = count.LowPart;
return (u64)((((u64)hi << 32) | (u64)lo)*(1000000000.0/frequency.QuadPart)); return (u64)((((u64)hi << 32) | (u64)lo) * scale_factor);
} }
void sleep_nanos(u64 nsec) void sleep_nanos(u64 nsec)