aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/link/internal/ld/data.go
diff options
context:
space:
mode:
authorThan McIntosh <thanm@google.com>2022-04-19 19:41:40 -0400
committerThan McIntosh <thanm@google.com>2022-09-27 10:29:51 +0000
commit072c7d4969862c84430cc2daef20a8f7f3ba78a2 (patch)
treef0cb83f688a4a5bc18168f1e1e2a72f37999a783 /src/cmd/link/internal/ld/data.go
parent361f5eba9f9e9902226e7edac76646253b7025e4 (diff)
downloadgo-072c7d4969862c84430cc2daef20a8f7f3ba78a2.tar.xz
cmd/compile,cmd/link: hooks for identifying coverage counters
Add a new "coverage counter" classification for variables to be used for storing code coverage counter values (somewhat in the same way that we identify fuzzer counters). Tagging such variables allows us to aggregate them in the linker, and to treat updates specially. Updates #51430. Change-Id: Ib49fb05736ffece98bcc2f7a7c37e991b7f67bbb Reviewed-on: https://go-review.googlesource.com/c/go/+/401235 Reviewed-by: David Chase <drchase@google.com> Run-TryBot: Than McIntosh <thanm@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/cmd/link/internal/ld/data.go')
-rw-r--r--src/cmd/link/internal/ld/data.go13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go
index c2668b29a4..c23eac08a4 100644
--- a/src/cmd/link/internal/ld/data.go
+++ b/src/cmd/link/internal/ld/data.go
@@ -1074,6 +1074,8 @@ func dwarfblk(ctxt *Link, out *OutBuf, addr int64, size int64) {
writeBlocks(ctxt, out, ctxt.outSem, ctxt.loader, syms, addr, size, zeros[:])
}
+var covCounterDataStartOff, covCounterDataLen uint64
+
var zeros [512]byte
var (
@@ -1781,6 +1783,15 @@ func (state *dodataState) allocateDataSections(ctxt *Link) {
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.enoptrbss", 0), sect)
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.end", 0), sect)
+ // Code coverage counters are assigned to the .noptrbss section.
+ // We assign them in a separate pass so that they stay aggregated
+ // together in a single blob (coverage runtime depends on this).
+ covCounterDataStartOff = sect.Length
+ state.assignToSection(sect, sym.SCOVERAGE_COUNTER, sym.SNOPTRBSS)
+ covCounterDataLen = sect.Length - covCounterDataStartOff
+ ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.covctrs", 0), sect)
+ ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.ecovctrs", 0), sect)
+
// Coverage instrumentation counters for libfuzzer.
if len(state.data[sym.SLIBFUZZER_8BIT_COUNTER]) > 0 {
sect := state.allocateNamedSectionAndAssignSyms(&Segdata, "__sancov_cntrs", sym.SLIBFUZZER_8BIT_COUNTER, sym.Sxxx, 06)
@@ -2682,6 +2693,8 @@ func (ctxt *Link) address() []*sym.Segment {
ctxt.xdefine("runtime.edata", sym.SDATA, int64(data.Vaddr+data.Length))
ctxt.xdefine("runtime.noptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr))
ctxt.xdefine("runtime.enoptrbss", sym.SNOPTRBSS, int64(noptrbss.Vaddr+noptrbss.Length))
+ ctxt.xdefine("runtime.covctrs", sym.SCOVERAGE_COUNTER, int64(noptrbss.Vaddr+covCounterDataStartOff))
+ ctxt.xdefine("runtime.ecovctrs", sym.SCOVERAGE_COUNTER, int64(noptrbss.Vaddr+covCounterDataStartOff+covCounterDataLen))
ctxt.xdefine("runtime.end", sym.SBSS, int64(Segdata.Vaddr+Segdata.Length))
if fuzzCounters != nil {