tools.image-analyzer.gc-info: ported the docs so now tools.gc-decode is
not needed anymoredb4
parent
f2a85d1b13
commit
cd8fd7b2a0
|
@ -1,128 +0,0 @@
|
||||||
USING: accessors arrays assocs bit-arrays classes.struct combinators
|
|
||||||
combinators.short-circuit compiler compiler.cfg.debugger
|
|
||||||
compiler.cfg.instructions compiler.cfg.stack-frame compiler.cfg.utilities
|
|
||||||
compiler.codegen.gc-maps compiler.units fry generic grouping kernel math
|
|
||||||
namespaces random sequences sequences.generalizations slots.syntax
|
|
||||||
tools.gc-decode tools.test vm vocabs words compiler.cfg.linearization ;
|
|
||||||
QUALIFIED: cpu.x86.features.private
|
|
||||||
QUALIFIED: crypto.aes.utils
|
|
||||||
QUALIFIED: effects
|
|
||||||
QUALIFIED: llvm.types
|
|
||||||
QUALIFIED: opencl
|
|
||||||
IN: tools.gc-decode.tests
|
|
||||||
|
|
||||||
! byte-array>bit-array
|
|
||||||
{
|
|
||||||
?{
|
|
||||||
t t t t f t t t
|
|
||||||
t f f f f f f f
|
|
||||||
}
|
|
||||||
} [
|
|
||||||
B{ 239 1 } byte-array>bit-array
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
{ ?{ t t t t t t t t } } [ B{ 255 } byte-array>bit-array ] unit-test
|
|
||||||
|
|
||||||
! scrub-bits
|
|
||||||
{
|
|
||||||
{ }
|
|
||||||
} [
|
|
||||||
\ decode-gc-maps word>gc-info scrub-bits
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
! decode-gc-maps
|
|
||||||
{ f } [
|
|
||||||
\ effects:<effect> decode-gc-maps empty?
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
{ f } [
|
|
||||||
\ + decode-gc-maps empty?
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
! read-gc-maps
|
|
||||||
{ { } } [
|
|
||||||
\ decode-gc-maps decode-gc-maps
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
: cfg>gc-maps ( cfg -- gc-maps )
|
|
||||||
cfg>insns [ gc-map-insn? ] filter [ gc-map>> ] map
|
|
||||||
[ gc-map-needed? ] filter ;
|
|
||||||
|
|
||||||
: tally-gc-maps ( gc-maps -- seq/f )
|
|
||||||
[ f ] [ {
|
|
||||||
[ [ scrub-d>> length ] map supremum ]
|
|
||||||
[ [ scrub-r>> length ] map supremum ]
|
|
||||||
[ [ gc-root-offsets ] map largest-spill-slot ]
|
|
||||||
[ [ derived-root-offsets ] map [ keys ] map largest-spill-slot ]
|
|
||||||
[ length ]
|
|
||||||
} cleave 5 narray ] if-empty ;
|
|
||||||
|
|
||||||
! Like word>gc-info but uses the compiler
|
|
||||||
: word>gc-info-expected ( word -- seq/f )
|
|
||||||
test-regs first dup stack-frame>> stack-frame
|
|
||||||
[ cfg>gc-maps tally-gc-maps ] with-variable ;
|
|
||||||
|
|
||||||
: same-gc-info? ( compiler-gc-info gc-info -- ? )
|
|
||||||
[ struct-slot-values = ]
|
|
||||||
[ [ not ] dip return-address-count>> 0 = and ] 2bi or ;
|
|
||||||
|
|
||||||
! Do it also for a bunch of random words
|
|
||||||
: normal? ( word -- ? )
|
|
||||||
{ [ generic? ] [ primitive? ] [ inline? ] [ no-compile? ] } 1|| not ;
|
|
||||||
|
|
||||||
{ { } } [
|
|
||||||
all-words [ normal? ] filter 50 sample
|
|
||||||
[ [ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info? ] reject
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
: base-pointer-groups-expected ( word -- seq )
|
|
||||||
test-regs first dup stack-frame>> stack-frame [
|
|
||||||
cfg>gc-maps [ derived-root-offsets { } like ] { } map-as
|
|
||||||
] with-variable ;
|
|
||||||
|
|
||||||
: base-pointer-groups-decoded ( word -- seq )
|
|
||||||
word>gc-info base-pointer-groups [
|
|
||||||
[ swap 2array ] map-index [ nip -1 = ] assoc-reject
|
|
||||||
] map ;
|
|
||||||
|
|
||||||
! base-pointer-groups
|
|
||||||
{ t } [
|
|
||||||
\ llvm.types:resolve-types
|
|
||||||
[ base-pointer-groups-expected ] [ base-pointer-groups-decoded ] bi =
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
! Tough words #1227
|
|
||||||
{ t } [
|
|
||||||
\ llvm.types:resolve-types
|
|
||||||
[ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info?
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
{ t } [
|
|
||||||
\ opencl:cl-queue-kernel
|
|
||||||
[ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info?
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
{ t } [
|
|
||||||
\ crypto.aes.utils:bytes>words
|
|
||||||
[ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info?
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
{ t } [
|
|
||||||
\ cpu.x86.features.private:(sse-version)
|
|
||||||
[ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info?
|
|
||||||
] unit-test
|
|
||||||
|
|
||||||
! Ensure deterministic gc map generation.
|
|
||||||
: recompile-word>gc-info ( word -- gc-info )
|
|
||||||
[ 1array compile ] keep word>gc-info ;
|
|
||||||
|
|
||||||
: deterministic-gc-info? ( word -- ? )
|
|
||||||
20 swap '[
|
|
||||||
_ recompile-word>gc-info struct-slot-values
|
|
||||||
dup last 0 = [ drop f ] when
|
|
||||||
] replicate all-equal? ;
|
|
||||||
|
|
||||||
|
|
||||||
{ t } [
|
|
||||||
\ opencl:cl-queue-kernel deterministic-gc-info?
|
|
||||||
] unit-test
|
|
|
@ -1,59 +0,0 @@
|
||||||
USING: accessors alien alien.c-types alien.data arrays assocs bit-arrays
|
|
||||||
bit-arrays.private classes.struct fry grouping kernel math math.statistics
|
|
||||||
sequences sequences.repeating splitting vm words ;
|
|
||||||
IN: tools.gc-decode
|
|
||||||
|
|
||||||
! Utils
|
|
||||||
: byte-array>bit-array ( byte-array -- bit-array )
|
|
||||||
[ integer>bit-array 8 f pad-tail ] { } map-as concat ;
|
|
||||||
|
|
||||||
: (cut-points) ( counts times -- seq )
|
|
||||||
<repeats> cum-sum but-last ;
|
|
||||||
|
|
||||||
: reshape-sequence ( seq counts times -- seqs )
|
|
||||||
[ (cut-points) split-indices ] keep <groups> flip ;
|
|
||||||
|
|
||||||
: end-address>direct-array ( obj count type -- seq )
|
|
||||||
[ heap-size * [ >c-ptr alien-address ] dip - <alien> ] 2keep
|
|
||||||
c-direct-array-constructor execute( alien len -- seq ) ;
|
|
||||||
|
|
||||||
: bit-counts ( gc-info -- counts )
|
|
||||||
struct-slot-values 3 head ;
|
|
||||||
|
|
||||||
: total-bitmap-bits ( gc-info -- n )
|
|
||||||
[ bit-counts sum ] [ return-address-count>> ] bi * ;
|
|
||||||
|
|
||||||
: return-addresses ( gc-info -- seq )
|
|
||||||
dup return-address-count>> uint end-address>direct-array ;
|
|
||||||
|
|
||||||
: base-pointers ( gc-info -- seq )
|
|
||||||
[ return-addresses ]
|
|
||||||
[ return-address-count>> ]
|
|
||||||
[ derived-root-count>> ] tri *
|
|
||||||
int end-address>direct-array ;
|
|
||||||
|
|
||||||
: base-pointer-groups ( gc-info -- seqs )
|
|
||||||
dup base-pointers
|
|
||||||
[ return-address-count>> { } <array> ]
|
|
||||||
[ swap derived-root-count>> <groups> [ >array ] map ] if-empty ;
|
|
||||||
|
|
||||||
: scrub-bytes ( gc-info -- seq )
|
|
||||||
[ base-pointers ] [ total-bitmap-bits bits>bytes ] bi
|
|
||||||
uchar end-address>direct-array ;
|
|
||||||
|
|
||||||
: scrub-bits ( gc-info -- seq )
|
|
||||||
[ scrub-bytes byte-array>bit-array ] keep total-bitmap-bits head ;
|
|
||||||
|
|
||||||
: scrub-bit-groups ( gc-info -- scrub-groups )
|
|
||||||
[ scrub-bits ] [ bit-counts ] [ return-address-count>> ] tri
|
|
||||||
[ 2drop { } ] [ reshape-sequence ] if-zero ;
|
|
||||||
|
|
||||||
: read-gc-maps ( gc-info -- assoc )
|
|
||||||
[ return-addresses ] [ scrub-bit-groups ] [ base-pointer-groups ] tri
|
|
||||||
zip zip ;
|
|
||||||
|
|
||||||
: word>gc-info ( word -- gc-info )
|
|
||||||
word-code nip gc-info struct-size - <alien> gc-info memory>struct ;
|
|
||||||
|
|
||||||
: decode-gc-maps ( word -- assoc )
|
|
||||||
word>gc-info read-gc-maps ;
|
|
|
@ -1,15 +1,11 @@
|
||||||
USING: assocs help.markup help.syntax vm words ;
|
USING: assocs help.markup help.syntax vm words ;
|
||||||
IN: tools.gc-decode
|
IN: tools.image-analyzer.gc-info
|
||||||
|
|
||||||
ARTICLE: "tools.gc-decode" "GC maps decoder"
|
ARTICLE: "tools.image-analyzer.gc-info" "GC maps decoder"
|
||||||
"A vocab that disassembles words gc maps. It's useful to have when debugging garbage collection issues." ;
|
"A vocab that disassembles words gc maps. It's useful to have when debugging garbage collection issues." ;
|
||||||
|
|
||||||
HELP: word>gc-info
|
HELP: word>gc-maps
|
||||||
{ $values { "word" word } { "gc-info" gc-info } }
|
{ $values { "word" word } { "gc-maps" assoc } }
|
||||||
{ $description "Gets the gc-info struct for a word." } ;
|
|
||||||
|
|
||||||
HELP: decode-gc-maps
|
|
||||||
{ $values { "word" word } { "assoc" assoc } }
|
|
||||||
{ $description "Main word of the vocab. Decodes the gc maps for a word into an assoc with the following format:"
|
{ $description "Main word of the vocab. Decodes the gc maps for a word into an assoc with the following format:"
|
||||||
{ $list
|
{ $list
|
||||||
"Each key is the return addess of a gc callsite (delta relative to the start of the code block)."
|
"Each key is the return addess of a gc callsite (delta relative to the start of the code block)."
|
||||||
|
@ -25,9 +21,9 @@ HELP: decode-gc-maps
|
||||||
{ $examples
|
{ $examples
|
||||||
{ $unchecked-example
|
{ $unchecked-example
|
||||||
"USING: effects prettyprint ;"
|
"USING: effects prettyprint ;"
|
||||||
"\\ <effect> decode-gc-maps ."
|
"\\ <effect> word>gc-maps ."
|
||||||
"{ { 151 { { ?{ } ?{ t t t } ?{ } ?{ } ?{ f t t t t } } { } } } }"
|
"{ { 153 { { ?{ t } ?{ t t t } ?{ f t t t t } } { } } } }"
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
ABOUT: "tools.gc-decode"
|
ABOUT: "tools.image-analyzer.gc-info"
|
Loading…
Reference in New Issue