type varPos … // This is the main entry point for collection of raw material to // drive generation of DWARF "inlined subroutine" DIEs. See proposal // 22080 for more details and background info. func assembleInlines(fnsym *obj.LSym, dwVars []*dwarf.Var) dwarf.InlCalls { … } // Secondary hook for DWARF inlined subroutine generation. This is called // late in the compilation when it is determined that we need an // abstract function DIE for an inlined routine imported from a // previously compiled package. func AbstractFunc(fn *obj.LSym) { … } // Given a function that was inlined as part of the compilation, dig // up the pre-inlining DCL list for the function and create a map that // supports lookup of pre-inline dcl index, based on variable // position/name. NB: the recipe for computing variable pos/file/line // needs to be kept in sync with the similar code in gc.createSimpleVars // and related functions. func makePreinlineDclMap(fnsym *obj.LSym) map[varPos]int { … } func insertInlCall(dwcalls *dwarf.InlCalls, inlIdx int, imap map[int]int) int { … } // Given a src.XPos, return its associated inlining index if it // corresponds to something created as a result of an inline, or -1 if // there is no inline info. Note that the index returned will refer to // the deepest call in the inlined stack, e.g. if you have "A calls B // calls C calls D" and all three callees are inlined (B, C, and D), // the index for a node from the inlined body of D will refer to the // call to D from C. Whew. func posInlIndex(xpos src.XPos) int { … } func addRange(calls []dwarf.InlCall, start, end int64, ii int, imap map[int]int) { … } func dumpInlCall(inlcalls dwarf.InlCalls, idx, ilevel int) { … } func dumpInlCalls(inlcalls dwarf.InlCalls) { … } func dumpInlVars(dwvars []*dwarf.Var) { … } func rangesContains(par []dwarf.Range, rng dwarf.Range) (bool, string) { … } func rangesContainsAll(parent, child []dwarf.Range) (bool, string) { … } // checkInlCall verifies that the PC ranges for inline info 'idx' are // enclosed/contained within the ranges of its parent inline (or if // this is a root/toplevel inline, checks that the ranges fall within // the extent of the top level function). A panic is issued if a // malformed range is found. func checkInlCall(funcName string, inlCalls dwarf.InlCalls, funcSize int64, idx, parentIdx int) { … } // unifyCallRanges ensures that the ranges for a given inline // transitively include all of the ranges for its child inlines. func unifyCallRanges(inlcalls dwarf.InlCalls, idx int) { … }