}
if strings.HasPrefix(s.Name, counterPrefix) {
ckTypSanity(nm, "countervar")
- nm.SetCoverageCounter(true)
+ nm.SetCoverageAuxVar(true)
s := nm.Linksym()
s.Type = objabi.SCOVERAGE_COUNTER
}
}
types.CalcSize(n.Type())
ggloblnod(n)
- if n.CoverageCounter() || n.CoverageAuxVar() || n.Linksym().Static() {
+ if n.CoverageAuxVar() || n.Linksym().Static() {
return
}
base.Ctxt.DwarfGlobal(types.TypeSymName(n.Type()), n.Linksym())
linkname := nam.Sym().Linkname
name := nam.Sym().Name
+ var saveType objabi.SymKind
+ if nam.CoverageAuxVar() {
+ saveType = s.Type
+ }
+
// We've skipped linkname'd globals's instrument, so we can skip them here as well.
if base.Flag.ASan && linkname == "" && pkginit.InstrumentGlobalsMap[name] != nil {
// Write the new size of instrumented global variables that have
if nam.Libfuzzer8BitCounter() {
s.Type = objabi.SLIBFUZZER_8BIT_COUNTER
}
- if nam.CoverageCounter() {
- s.Type = objabi.SCOVERAGE_COUNTER
+ if nam.CoverageAuxVar() && saveType == objabi.SCOVERAGE_COUNTER {
+ // restore specialized counter type (which Globl call above overwrote)
+ s.Type = saveType
}
if nam.Sym().Linkname != "" {
// Make sure linkname'd symbol is non-package. When a symbol is
return false
}
nn := ixn.X.(*ir.Name)
- return nn.CoverageCounter()
+ // CoverageAuxVar implies either a coverage counter or a package
+ // ID; since the cover tool never emits code to index into ID vars
+ // this is effectively testing whether nn is a coverage counter.
+ return nn.CoverageAuxVar()
}
// isAtomicCoverageCounterUpdate examines the specified node to
nameInlLocal // PAUTO created by inliner, derived from callee local
nameOpenDeferSlot // if temporary var storing info for open-coded defers
nameLibfuzzer8BitCounter // if PEXTERN should be assigned to __sancov_cntrs section
- nameCoverageCounter // instrumentation counter var for cmd/cover
- nameCoverageAuxVar // instrumentation pkg ID variable cmd/cover
+ nameCoverageAuxVar // instrumentation counter var or pkg ID for cmd/cover
nameAlias // is type name an alias
)
func (n *Name) InlLocal() bool { return n.flags&nameInlLocal != 0 }
func (n *Name) OpenDeferSlot() bool { return n.flags&nameOpenDeferSlot != 0 }
func (n *Name) Libfuzzer8BitCounter() bool { return n.flags&nameLibfuzzer8BitCounter != 0 }
-func (n *Name) CoverageCounter() bool { return n.flags&nameCoverageCounter != 0 }
func (n *Name) CoverageAuxVar() bool { return n.flags&nameCoverageAuxVar != 0 }
func (n *Name) setReadonly(b bool) { n.flags.set(nameReadonly, b) }
func (n *Name) SetInlLocal(b bool) { n.flags.set(nameInlLocal, b) }
func (n *Name) SetOpenDeferSlot(b bool) { n.flags.set(nameOpenDeferSlot, b) }
func (n *Name) SetLibfuzzer8BitCounter(b bool) { n.flags.set(nameLibfuzzer8BitCounter, b) }
-func (n *Name) SetCoverageCounter(b bool) { n.flags.set(nameCoverageCounter, b) }
func (n *Name) SetCoverageAuxVar(b bool) { n.flags.set(nameCoverageAuxVar, b) }
// OnStack reports whether variable n may reside on the stack.