aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/cover/cover.go
blob: 13bba2347767ab83f3c81d0ceba821a707f59bc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Copyright 2015 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

// Package cover provides types for working with coverage information (arrays of covered PCs).
package cover

type Cover map[uint64]struct{}

func FromRaw(raw []uint64) Cover {
	var c Cover
	c.Merge(raw)
	return c
}

func (cov *Cover) Merge(raw []uint64) {
	c := *cov
	if c == nil {
		c = make(Cover)
		*cov = c
	}
	for _, pc := range raw {
		c[pc] = struct{}{}
	}
}

// Merge merges raw into coverage and returns newly added PCs. Overwrites/mutates raw.
func (cov *Cover) MergeDiff(raw []uint64) []uint64 {
	c := *cov
	if c == nil {
		c = make(Cover)
		*cov = c
	}
	n := 0
	for _, pc := range raw {
		if _, ok := c[pc]; ok {
			continue
		}
		c[pc] = struct{}{}
		raw[n] = pc
		n++
	}
	return raw[:n]
}

func (cov *Cover) Serialize() []uint64 {
	res := make([]uint64, 0, len(*cov))
	for pc := range *cov {
		res = append(res, pc)
	}
	return res
}