| // 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:] | |
| } |