// Copyright 2022 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package runtime import ( "internal/coverage/rtcov" "unsafe" ) // covMeta is the top-level container for bits of state related to // code coverage meta-data in the runtime. var covMeta struct { // metaList contains the list of currently registered meta-data // blobs for the running program. metaList []rtcov.CovMetaBlob // pkgMap records mappings from hard-coded package IDs to // slots in the covMetaList above. pkgMap map[int]int // Set to true if we discover a package mapping glitch. hardCodedListNeedsUpdating bool } // addCovMeta is invoked during package "init" functions by the // compiler when compiling for coverage instrumentation; here 'p' is a // meta-data blob of length 'dlen' for the package in question, 'hash' // is a compiler-computed md5.sum for the blob, 'pkpath' is the // package path, 'pkid' is the hard-coded ID that the compiler is // using for the package (or -1 if the compiler doesn't think a // hard-coded ID is needed), and 'cmode'/'cgran' are the coverage // counter mode and granularity requested by the user. Return value is // the ID for the package for use by the package code itself. func addCovMeta(p unsafe.Pointer, dlen uint32, hash [16]byte, pkpath string, pkid int, cmode uint8, cgran uint8) uint32 { slot := len(covMeta.metaList) covMeta.metaList = append(covMeta.metaList, rtcov.CovMetaBlob{ P: (*byte)(p), Len: dlen, Hash: hash, PkgPath: pkpath, PkgID: pkid, CounterMode: cmode, CounterGranularity: cgran, }) if pkid != -1 { if covMeta.pkgMap == nil { covMeta.pkgMap = make(map[int]int) } if _, ok := covMeta.pkgMap[pkid]; ok { throw("runtime.addCovMeta: coverage package map collision") } // Record the real slot (position on meta-list) for this // package; we'll use the map to fix things up later on. covMeta.pkgMap[pkid] = slot } // ID zero is reserved as invalid. return uint32(slot + 1) } //go:linkname runtime_coverage_getCovMetaList runtime/coverage.getCovMetaList func runtime_coverage_getCovMetaList() []rtcov.CovMetaBlob { return covMeta.metaList } //go:linkname runtime_coverage_getCovPkgMap runtime/coverage.getCovPkgMap func runtime_coverage_getCovPkgMap() map[int]int { return covMeta.pkgMap }