LookupFunc looks up a function or method in export data. It is expected to be overridden by package noder, to break a dependency cycle.
var LookupFunc = func(fullName string) (*ir.Func, error) { base.Fatalf("pgo.LookupMethodFunc not overridden") panic("unreachable") }
func DirectCallee(fn ir.Node) *ir.Func
DirectCallee takes a function-typed expression and returns the underlying function that it refers to if statically known. Otherwise, it returns nil.
Equivalent to inline.inlCallee without calling CanInline on closures.
func NodeLineOffset(n ir.Node, fn *ir.Func) int
NodeLineOffset returns the line offset of n in fn.
func WeightInPercentage(value int64, total int64) float64
WeightInPercentage converts profile weights to a percentage.
CallSiteInfo captures call-site information and its caller/callee.
type CallSiteInfo struct { LineOffset int // Line offset from function start line. Caller *ir.Func Callee *ir.Func }
IREdge represents a call edge in the IRGraph with source, destination, weight, callsite, and line number information.
type IREdge struct { // Source and destination of the edge in IRNode. Src, Dst *IRNode Weight int64 CallSiteOffset int // Line offset from function start line. }
IRGraph is a call graph with nodes pointing to IRs of functions and edges carrying weights and callsite information.
Nodes for indirect calls may have missing IR (IRNode.AST == nil) if the node is not visible from this package (e.g., not in the transitive deps). Keeping these nodes allows determining the hottest edge from a call even if that callee is not available.
TODO(prattmic): Consider merging this data structure with Graph. This is effectively a copy of Graph aggregated to line number and pointing to IR.
type IRGraph struct { // Nodes of the graph. Each node represents a function, keyed by linker // symbol name. IRNodes map[string]*IRNode }
IRNode represents a node (function) in the IRGraph.
type IRNode struct { // Pointer to the IR of the Function represented by this node. AST *ir.Func // Linker symbol name of the Function represented by this node. // Populated only if AST == nil. LinkerSymbolName string // Set of out-edges in the callgraph. The map uniquely identifies each // edge based on the callsite and callee, for fast lookup. OutEdges map[NamedCallEdge]*IREdge }
func (i *IRNode) Name() string
Name returns the symbol name of this function.
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. ByWeight []NamedCallEdge }
Profile contains the processed PGO profile and weighted call graph used for PGO optimizations.
type Profile struct { // 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 // WeightedCG represents the IRGraph built from profile, which we will // update as part of inlining. WeightedCG *IRGraph }
func New(profileFile string) (*Profile, error)
New generates a profile-graph from the profile.
func (p *Profile) PrintWeightedCallGraphDOT(edgeThreshold float64)
PrintWeightedCallGraphDOT prints IRGraph in DOT format.
Name | Synopsis |
---|---|
.. |