From f2656f20ea420ada5f15ef06ddf18d2797e18841 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Wed, 7 Sep 2022 13:23:19 -0400 Subject: cmd/compile,cmd/link,runtime: add start line numbers to func metadata This adds the function "start line number" to runtime._func and runtime.inlinedCall objects. The "start line number" is the line number of the func keyword or TEXT directive for assembly. Subtracting the start line number from PC line number provides the relative line offset of a PC from the the start of the function. This helps with source stability by allowing code above the function to move without invalidating samples within the function. Encoding start line rather than relative lines directly is convenient because the pprof format already contains a start line field. This CL uses a straightforward encoding of explictly including a start line field in every _func and inlinedCall. It is possible that we could compress this further in the future. e.g., functions with a prologue usually have == . In runtime.test, 95% of functions have == . According to bent, this is geomean +0.83% binary size vs master and -0.31% binary size vs 1.19. Note that //line directives can change the file and line numbers arbitrarily. The encoded start line is as adjusted by //line directives. Since this can change in the middle of a function, `line - start line` offset calculations may not be meaningful if //line directives are in use. For #55022. Change-Id: Iaabbc6dd4f85ffdda294266ef982ae838cc692f6 Reviewed-on: https://go-review.googlesource.com/c/go/+/429638 Run-TryBot: Michael Pratt Auto-Submit: Michael Pratt Reviewed-by: Matthew Dempsky TryBot-Result: Gopher Robot Reviewed-by: Cherry Mui --- src/runtime/runtime2.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'src/runtime/runtime2.go') diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go index cf44156c53..5b55b55ce1 100644 --- a/src/runtime/runtime2.go +++ b/src/runtime/runtime2.go @@ -879,6 +879,7 @@ type _func struct { pcln uint32 npcdata uint32 cuOffset uint32 // runtime.cutab offset of this function's CU + startLine int32 // line number of start of function (func keyword/TEXT directive) funcID funcID // set for certain special runtime functions flag funcFlag _ [1]byte // pad @@ -911,11 +912,12 @@ type _func struct { // A *Func can be either a *_func or a *funcinl, and they are distinguished // by the first uintptr. type funcinl struct { - ones uint32 // set to ^0 to distinguish from _func - entry uintptr // entry of the real (the "outermost") frame - name string - file string - line int + ones uint32 // set to ^0 to distinguish from _func + entry uintptr // entry of the real (the "outermost") frame + name string + file string + line int32 + startLine int32 } // layout of Itab known to compilers -- cgit v1.3