mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
This has a minor performance cost, but far less than is being gained by SSA. As an experiment, enable it during the Go 1.7 beta. Having frame pointers on by default makes Linux's perf, Intel VTune, and other profilers much more useful, because it lets them gather a stack trace efficiently on profiling events. (It doesn't help us that much, since when we walk the stack we usually need to look up PC-specific information as well.) Fixes #15840. Change-Id: I4efd38412a0de4a9c87b1b6e5d11c301e63f1a2a Reviewed-on: https://go-review.googlesource.com/23451 Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
86 lines
1.5 KiB
Go
86 lines
1.5 KiB
Go
// Copyright 2009 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package obj
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
// go-specific code shared across loaders (5l, 6l, 8l).
|
|
|
|
var (
|
|
framepointer_enabled int
|
|
Fieldtrack_enabled int
|
|
)
|
|
|
|
// Toolchain experiments.
|
|
// These are controlled by the GOEXPERIMENT environment
|
|
// variable recorded when the toolchain is built.
|
|
// This list is also known to cmd/gc.
|
|
var exper = []struct {
|
|
name string
|
|
val *int
|
|
}{
|
|
{"fieldtrack", &Fieldtrack_enabled},
|
|
{"framepointer", &framepointer_enabled},
|
|
}
|
|
|
|
func addexp(s string) {
|
|
// Could do general integer parsing here, but the runtime copy doesn't yet.
|
|
v := 1
|
|
name := s
|
|
if len(name) > 2 && name[:2] == "no" {
|
|
v = 0
|
|
name = name[2:]
|
|
}
|
|
for i := 0; i < len(exper); i++ {
|
|
if exper[i].name == name {
|
|
if exper[i].val != nil {
|
|
*exper[i].val = v
|
|
}
|
|
return
|
|
}
|
|
}
|
|
|
|
fmt.Printf("unknown experiment %s\n", s)
|
|
os.Exit(2)
|
|
}
|
|
|
|
func init() {
|
|
framepointer_enabled = 1 // default
|
|
for _, f := range strings.Split(goexperiment, ",") {
|
|
if f != "" {
|
|
addexp(f)
|
|
}
|
|
}
|
|
}
|
|
|
|
func Framepointer_enabled(goos, goarch string) bool {
|
|
return framepointer_enabled != 0 && goarch == "amd64" && goos != "nacl"
|
|
}
|
|
|
|
func Nopout(p *Prog) {
|
|
p.As = ANOP
|
|
p.Scond = 0
|
|
p.From = Addr{}
|
|
p.From3 = nil
|
|
p.Reg = 0
|
|
p.To = Addr{}
|
|
}
|
|
|
|
func Expstring() string {
|
|
buf := "X"
|
|
for i := range exper {
|
|
if *exper[i].val != 0 {
|
|
buf += "," + exper[i].name
|
|
}
|
|
}
|
|
if buf == "X" {
|
|
buf += ",none"
|
|
}
|
|
return "X:" + buf[2:]
|
|
}
|