1 USING: accessors arrays assocs bit-arrays classes.struct combinators
2 combinators.short-circuit compiler compiler.cfg.debugger
3 compiler.cfg.instructions compiler.cfg.linearization
4 compiler.cfg.stack-frame compiler.codegen.gc-maps compiler.units fry generic
5 grouping io io.encodings.binary io.streams.byte-array kernel math namespaces
6 random sequences sequences.generalizations
7 tools.image-analyzer.gc-info tools.image-analyzer.utils tools.test vm
9 IN: tools.image-analyzer.gc-info.tests
10 QUALIFIED: cpu.x86.features.private
11 QUALIFIED: crypto.aes.utils
13 QUALIFIED: gml.coremath
17 : normal? ( word -- ? )
18 { [ generic? ] [ primitive? ] [ inline? ] [ no-compile? ] } 1|| not ;
20 : word>gc-info ( word -- gc-info )
21 word>byte-array binary <byte-reader> <backwards-reader> [
22 gc-info read-struct-safe
25 : cfg>gc-maps ( cfg -- gc-maps )
26 cfg>insns [ gc-map-insn? ] filter [ gc-map>> ] map
27 [ gc-map-needed? ] filter ;
29 : tally-gc-maps ( gc-maps -- seq/f )
31 [ [ scrub-d>> length ] map supremum ]
32 [ [ scrub-r>> length ] map supremum ]
33 [ [ gc-root-offsets ] map largest-spill-slot ]
34 [ [ derived-root-offsets ] map [ keys ] map largest-spill-slot ]
36 } cleave 5 narray ] if-empty ;
38 ! Like word>gc-info but uses the compiler
39 : word>gc-info-expected ( word -- seq/f )
40 test-regs first dup stack-frame>> stack-frame
41 [ cfg>gc-maps tally-gc-maps ] with-variable ;
43 : same-gc-info? ( compiler-gc-info gc-info -- ? )
44 [ struct-slot-values = ]
45 [ [ not ] dip return-address-count>> 0 = and ] 2bi or ;
47 : base-pointer-groups-expected ( word -- seq )
48 test-regs first dup stack-frame>> stack-frame [
49 cfg>gc-maps [ derived-root-offsets { } like ] { } map-as
52 : base-pointer-groups-decoded ( word -- seq )
54 second second [ swap 2array ] map-index
55 [ nip -1 = ] assoc-reject
58 ! byte-array>bit-array
65 B{ 239 1 } byte-array>bit-array
68 { ?{ t t t t t t t t } } [ B{ 255 } byte-array>bit-array ] unit-test
72 \ effects:<effect> word>gc-maps empty?
76 \ + word>gc-maps empty?
80 \ word>gc-maps word>gc-maps
85 all-words [ normal? ] filter 50 sample
86 [ [ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info? ] reject
91 \ llvm.types:resolve-types
92 [ base-pointer-groups-expected ] [ base-pointer-groups-decoded ] bi =
97 \ llvm.types:resolve-types
98 [ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info?
102 \ opencl:cl-queue-kernel
103 [ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info?
107 \ crypto.aes.utils:bytes>words
108 [ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info?
112 \ cpu.x86.features.private:(sse-version)
113 [ word>gc-info-expected ] [ word>gc-info ] bi same-gc-info?
116 ! Ensure deterministic gc map generation.
117 : recompile-word>gc-info ( word -- gc-info )
118 [ 1array compile ] keep word>gc-info ;
120 : deterministic-gc-info? ( word -- ? )
122 _ recompile-word>gc-info struct-slot-values
123 dup last 0 = [ drop f ] when
124 ] replicate all-equal? ;
127 \ opencl:cl-queue-kernel deterministic-gc-info?
128 \ gml.coremath:gml-determinant deterministic-gc-info?