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  }