]> Cypherpunks repositories - gostls13.git/commitdiff
cmd: vendor github.com/google/pprof to fix mangled type parameter symbol names
authorEmmanuel T Odeke <emmanuel@orijtech.com>
Sat, 30 Jul 2022 04:38:24 +0000 (22:38 -0600)
committerEmmanuel Odeke <emmanuel@orijtech.com>
Tue, 9 Aug 2022 20:51:42 +0000 (20:51 +0000)
Updates github.com/google/pprof to bring in the commit from
https://github.com/google/pprof/pull/717 which fixes mangled
symbol names for type parameters.

Fixes #54105

Change-Id: I01af9f780aba3338b960a03b30906a23642e4448
Reviewed-on: https://go-review.googlesource.com/c/go/+/420234
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Run-TryBot: Emmanuel Odeke <emmanuel@orijtech.com>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/go.mod
src/cmd/go.sum
src/cmd/vendor/github.com/google/pprof/internal/driver/settings.go
src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph.go
src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer.go
src/cmd/vendor/modules.txt

index 6629512617ea662af1db06504ef72e42121a248d..326992ddd2e4916e0368baf8083a5866202f74e5 100644 (file)
@@ -3,7 +3,7 @@ module cmd
 go 1.20
 
 require (
-       github.com/google/pprof v0.0.0-20220517023622-154dc81eb7b0
+       github.com/google/pprof v0.0.0-20220729232143-a41b82acbcb1
        golang.org/x/arch v0.0.0-20220722155209-00200b7164a7
        golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4
        golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4
index aa726504005379a350c79353e7b42460c20c296c..dd5852ef7643674c8c305c10a07686888a99727a 100644 (file)
@@ -1,5 +1,5 @@
-github.com/google/pprof v0.0.0-20220517023622-154dc81eb7b0 h1:XgEFTOJTsN3Li0Txfhn2UzsysGJfXIDe7wE07uY7ZfI=
-github.com/google/pprof v0.0.0-20220517023622-154dc81eb7b0/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=
+github.com/google/pprof v0.0.0-20220729232143-a41b82acbcb1 h1:8pyqKJvrJqUYaKS851Ule26pwWvey6IDMiczaBLDKLQ=
+github.com/google/pprof v0.0.0-20220729232143-a41b82acbcb1/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=
 github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2 h1:rcanfLhLDA8nozr/K289V1zcntHr3V+SHlXwzz1ZI2g=
 github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
 golang.org/x/arch v0.0.0-20220722155209-00200b7164a7 h1:VBQqJMNMRfQsWSiCTLgz9XjAfWlgnJAPv8nsp1HF8Tw=
index f72314b1857ddbcb09dd8e81675288f3a575e3e3..1e9154c5f533690a90727f76c13cc14fea0f3d38 100644 (file)
@@ -79,7 +79,7 @@ type configMenuEntry struct {
 }
 
 // configMenu returns a list of items to add to a menu in the web UI.
-func configMenu(fname string, url url.URL) []configMenuEntry {
+func configMenu(fname string, u url.URL) []configMenuEntry {
        // Start with system configs.
        configs := []namedConfig{{Name: "Default", config: defaultConfig()}}
        if settings, err := readSettings(fname); err == nil {
@@ -91,13 +91,15 @@ func configMenu(fname string, url url.URL) []configMenuEntry {
        result := make([]configMenuEntry, len(configs))
        lastMatch := -1
        for i, cfg := range configs {
-               dst, changed := cfg.config.makeURL(url)
+               dst, changed := cfg.config.makeURL(u)
                if !changed {
                        lastMatch = i
                }
+               // Use a relative URL to work in presence of stripping/redirects in webui.go.
+               rel := &url.URL{RawQuery: dst.RawQuery, ForceQuery: true}
                result[i] = configMenuEntry{
                        Name:       cfg.Name,
-                       URL:        dst.String(),
+                       URL:        rel.String(),
                        UserConfig: (i != 0),
                }
        }
index 9ff4c95adbe32782af385305748d7a93ad935367..09d40fd2c9901773ece5de9201a4c7ab9236eb4b 100644 (file)
@@ -385,6 +385,9 @@ func multilinePrintableName(info *NodeInfo) string {
        infoCopy := *info
        infoCopy.Name = escapeForDot(ShortenFunctionName(infoCopy.Name))
        infoCopy.Name = strings.Replace(infoCopy.Name, "::", `\n`, -1)
+       // Go type parameters are reported as "[...]" by Go pprof profiles.
+       // Keep this ellipsis rather than replacing with newlines below.
+       infoCopy.Name = strings.Replace(infoCopy.Name, "[...]", "[…]", -1)
        infoCopy.Name = strings.Replace(infoCopy.Name, ".", `\n`, -1)
        if infoCopy.File != "" {
                infoCopy.File = filepath.Base(infoCopy.File)
index cbb0ed4d1b0bbaf2a06c118e9cb375f4274328c8..d243b800a92fc8f5dc627c6f3fd699af24678d9e 100644 (file)
@@ -205,49 +205,64 @@ func Demangle(prof *profile.Profile, force bool, demanglerMode string) {
                }
        }
 
-       var options []demangle.Option
+       options := demanglerModeToOptions(demanglerMode)
+       for _, fn := range prof.Function {
+               demangleSingleFunction(fn, options)
+       }
+}
+
+func demanglerModeToOptions(demanglerMode string) []demangle.Option {
        switch demanglerMode {
        case "": // demangled, simplified: no parameters, no templates, no return type
-               options = []demangle.Option{demangle.NoParams, demangle.NoTemplateParams}
+               return []demangle.Option{demangle.NoParams, demangle.NoTemplateParams}
        case "templates": // demangled, simplified: no parameters, no return type
-               options = []demangle.Option{demangle.NoParams}
+               return []demangle.Option{demangle.NoParams}
        case "full":
-               options = []demangle.Option{demangle.NoClones}
+               return []demangle.Option{demangle.NoClones}
        case "none": // no demangling
-               return
+               return []demangle.Option{}
        }
 
+       panic(fmt.Sprintf("unknown demanglerMode %s", demanglerMode))
+}
+
+func demangleSingleFunction(fn *profile.Function, options []demangle.Option) {
+       if fn.Name != "" && fn.SystemName != fn.Name {
+               return // Already demangled.
+       }
        // Copy the options because they may be updated by the call.
        o := make([]demangle.Option, len(options))
-       for _, fn := range prof.Function {
-               if fn.Name != "" && fn.SystemName != fn.Name {
-                       continue // Already demangled.
-               }
-               copy(o, options)
-               if demangled := demangle.Filter(fn.SystemName, o...); demangled != fn.SystemName {
-                       fn.Name = demangled
-                       continue
-               }
-               // Could not demangle. Apply heuristics in case the name is
-               // already demangled.
-               name := fn.SystemName
-               if looksLikeDemangledCPlusPlus(name) {
-                       if demanglerMode == "" || demanglerMode == "templates" {
+       copy(o, options)
+       if demangled := demangle.Filter(fn.SystemName, o...); demangled != fn.SystemName {
+               fn.Name = demangled
+               return
+       }
+       // Could not demangle. Apply heuristics in case the name is
+       // already demangled.
+       name := fn.SystemName
+       if looksLikeDemangledCPlusPlus(name) {
+               for _, o := range options {
+                       switch o {
+                       case demangle.NoParams:
                                name = removeMatching(name, '(', ')')
-                       }
-                       if demanglerMode == "" {
+                       case demangle.NoTemplateParams:
                                name = removeMatching(name, '<', '>')
                        }
                }
-               fn.Name = name
        }
+       fn.Name = name
 }
 
 // looksLikeDemangledCPlusPlus is a heuristic to decide if a name is
 // the result of demangling C++. If so, further heuristics will be
 // applied to simplify the name.
 func looksLikeDemangledCPlusPlus(demangled string) bool {
-       if strings.Contains(demangled, ".<") { // Skip java names of the form "class.<init>"
+       // Skip java names of the form "class.<init>".
+       if strings.Contains(demangled, ".<") {
+               return false
+       }
+       // Skip Go names of the form "foo.(*Bar[...]).Method".
+       if strings.Contains(demangled, "]).") {
                return false
        }
        return strings.ContainsAny(demangled, "<>[]") || strings.Contains(demangled, "::")
index 1df276804907fed9e88ed1c79a23d7a15dde0bfa..5dd6bfaadd7236fa5c4f859a401da69aca639167 100644 (file)
@@ -1,4 +1,4 @@
-# github.com/google/pprof v0.0.0-20220517023622-154dc81eb7b0
+# github.com/google/pprof v0.0.0-20220729232143-a41b82acbcb1
 ## explicit; go 1.17
 github.com/google/pprof/driver
 github.com/google/pprof/internal/binutils