package report import ( "github.com/google/pprof/profile" ) // synthCode assigns addresses to locations without an address. type synthCode struct { next uint64 addr map[*profile.Location]uint64 // Synthesized address assigned to a location } func newSynthCode(mappings []*profile.Mapping) *synthCode { // Find a larger address than any mapping. s := &synthCode{next: 1} for _, m := range mappings { if s.next < m.Limit { s.next = m.Limit } } return s } // address returns the synthetic address for loc, creating one if needed. func (s *synthCode) address(loc *profile.Location) uint64 { if loc.Address != 0 { panic("can only synthesize addresses for locations without an address") } if addr, ok := s.addr[loc]; ok { return addr } if s.addr == nil { s.addr = map[*profile.Location]uint64{} } addr := s.next s.next++ s.addr[loc] = addr return addr }