// Copyright 2024 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 pgo contains the compiler-agnostic portions of PGO profile handling. // Notably, parsing pprof profiles and serializing/deserializing from a custom // intermediate representation. package pgo // Profile contains the processed data from the PGO profile. type Profile struct { // TotalWeight is the aggregated edge weights across the profile. This // helps us determine the percentage threshold for hot/cold // partitioning. TotalWeight int64 // NamedEdgeMap contains all unique call edges in the profile and their // edge weight. NamedEdgeMap NamedEdgeMap } // NamedCallEdge identifies a call edge by linker symbol names and call site // offset. type NamedCallEdge struct { CallerName string CalleeName string CallSiteOffset int // Line offset from function start line. } // NamedEdgeMap contains all unique call edges in the profile and their // edge weight. type NamedEdgeMap struct { Weight map[NamedCallEdge]int64 // ByWeight lists all keys in Weight, sorted by edge weight from // highest to lowest. ByWeight []NamedCallEdge } func emptyProfile() *Profile { // Initialize empty maps/slices for easier use without a requiring a // nil check. return &Profile{ NamedEdgeMap: NamedEdgeMap{ ByWeight: make([]NamedCallEdge, 0), Weight: make(map[NamedCallEdge]int64), }, } } // WeightInPercentage converts profile weights to a percentage. func WeightInPercentage(value int64, total int64) float64 { return (float64(value) / float64(total)) * 100 }