const debugTraceFuncs … const debugTraceFuncFlags … const debugTraceResults … const debugTraceParams … const debugTraceExprClassify … const debugTraceCalls … const debugTraceScoring … type propAnalyzer … type fnInlHeur … var fpmap … // AnalyzeFunc computes function properties for fn and its contained // closures, updating the global 'fpmap' table. It is assumed that // "CanInline" has been run on fn and on the closures that feed // directly into calls; other closures not directly called will also // be checked inlinability for inlinability here in case they are // returned as a result. func AnalyzeFunc(fn *ir.Func, canInline func(*ir.Func), budgetForFunc func(*ir.Func) int32, inlineMaxBudget int) { … } // TearDown is invoked at the end of the main inlining pass; doing // function analysis and call site scoring is unlikely to help a lot // after this point, so nil out fpmap and other globals to reclaim // storage. func TearDown() { … } func analyzeFunc(fn *ir.Func, inlineMaxBudget int, nf *nameFinder) *FuncProps { … } // revisitInlinability revisits the question of whether to continue to // treat function 'fn' as an inline candidate based on the set of // properties we've computed for it. If (for example) it has an // initial size score of 150 and no interesting properties to speak // of, then there isn't really any point to moving ahead with it as an // inline candidate. func revisitInlinability(fn *ir.Func, funcProps *FuncProps, budgetForFunc func(*ir.Func) int32) { … } // computeFuncProps examines the Go function 'fn' and computes for it // a function "properties" object, to be used to drive inlining // heuristics. See comments on the FuncProps type for more info. func computeFuncProps(fn *ir.Func, inlineMaxBudget int, nf *nameFinder) (*FuncProps, CallSiteTab) { … } func runAnalyzersOnFunction(fn *ir.Func, analyzers []propAnalyzer) { … } func propsForFunc(fn *ir.Func) *FuncProps { … } func fnFileLine(fn *ir.Func) (string, uint) { … } func Enabled() bool { … } func UnitTesting() bool { … } // DumpFuncProps computes and caches function properties for the func // 'fn', writing out a description of the previously computed set of // properties to the file given in 'dumpfile'. Used for the // "-d=dumpinlfuncprops=..." command line flag, intended for use // primarily in unit testing. func DumpFuncProps(fn *ir.Func, dumpfile string) { … } // emitDumpToFile writes out the buffer function property dump entries // to a file, for unit testing. Dump entries need to be sorted by // definition line, and due to generics we need to account for the // possibility that several ir.Func's will have the same def line. func emitDumpToFile(dumpfile string) { … } // captureFuncDumpEntry grabs the function properties object for 'fn' // and enqueues it for later dumping. Used for the // "-d=dumpinlfuncprops=..." command line flag, intended for use // primarily in unit testing. func captureFuncDumpEntry(fn *ir.Func) { … } // dumpFilePreamble writes out a file-level preamble for a given // Go function as part of a function properties dump. func dumpFilePreamble(w io.Writer) { … } // dumpFnPreamble writes out a function-level preamble for a given // Go function as part of a function properties dump. See the // README.txt file in testdata/props for more on the format of // this preamble. func dumpFnPreamble(w io.Writer, funcInlHeur *fnInlHeur, ecst encodedCallSiteTab, idx, atl uint) error { … } // sortFnInlHeurSlice sorts a slice of fnInlHeur based on // the starting line of the function definition, then by name. func sortFnInlHeurSlice(sl []fnInlHeur) []fnInlHeur { … } const preambleDelimiter … const fnDelimiter … const comDelimiter … const csDelimiter … var dumpBuffer …