github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/pkg/cover/cover.go (about) 1 // Copyright 2015 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 // Package cover provides types for working with coverage information (arrays of covered PCs). 5 package cover 6 7 type Cover map[uint64]struct{} 8 9 func FromRaw(raw []uint64) Cover { 10 var c Cover 11 c.Merge(raw) 12 return c 13 } 14 15 func (cov *Cover) Merge(raw []uint64) { 16 c := *cov 17 if c == nil { 18 c = make(Cover) 19 *cov = c 20 } 21 for _, pc := range raw { 22 c[pc] = struct{}{} 23 } 24 } 25 26 // Merge merges raw into coverage and returns newly added PCs. Overwrites/mutates raw. 27 func (cov *Cover) MergeDiff(raw []uint64) []uint64 { 28 c := *cov 29 if c == nil { 30 c = make(Cover) 31 *cov = c 32 } 33 n := 0 34 for _, pc := range raw { 35 if _, ok := c[pc]; ok { 36 continue 37 } 38 c[pc] = struct{}{} 39 raw[n] = pc 40 n++ 41 } 42 return raw[:n] 43 } 44 45 func (cov *Cover) Serialize() []uint64 { 46 res := make([]uint64, 0, len(*cov)) 47 for pc := range *cov { 48 res = append(res, pc) 49 } 50 return res 51 }