github.com/activestate/go@v0.0.0-20170614201249-0b81c023a722/src/cmd/internal/objabi/util.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package objabi 6 7 import ( 8 "fmt" 9 "log" 10 "os" 11 "strings" 12 ) 13 14 func envOr(key, value string) string { 15 if x := os.Getenv(key); x != "" { 16 return x 17 } 18 return value 19 } 20 21 var ( 22 GOROOT = envOr("GOROOT", defaultGOROOT) 23 GOARCH = envOr("GOARCH", defaultGOARCH) 24 GOOS = envOr("GOOS", defaultGOOS) 25 GO386 = envOr("GO386", defaultGO386) 26 GOARM = goarm() 27 Version = version 28 ) 29 30 func goarm() int { 31 switch v := envOr("GOARM", defaultGOARM); v { 32 case "5": 33 return 5 34 case "6": 35 return 6 36 case "7": 37 return 7 38 } 39 // Fail here, rather than validate at multiple call sites. 40 log.Fatalf("Invalid GOARM value. Must be 5, 6, or 7.") 41 panic("unreachable") 42 } 43 44 func Getgoextlinkenabled() string { 45 return envOr("GO_EXTLINK_ENABLED", defaultGO_EXTLINK_ENABLED) 46 } 47 48 func init() { 49 framepointer_enabled = 1 // default 50 for _, f := range strings.Split(goexperiment, ",") { 51 if f != "" { 52 addexp(f) 53 } 54 } 55 } 56 57 func Framepointer_enabled(goos, goarch string) bool { 58 return framepointer_enabled != 0 && goarch == "amd64" && goos != "nacl" 59 } 60 61 func addexp(s string) { 62 // Could do general integer parsing here, but the runtime copy doesn't yet. 63 v := 1 64 name := s 65 if len(name) > 2 && name[:2] == "no" { 66 v = 0 67 name = name[2:] 68 } 69 for i := 0; i < len(exper); i++ { 70 if exper[i].name == name { 71 if exper[i].val != nil { 72 *exper[i].val = v 73 } 74 return 75 } 76 } 77 78 fmt.Printf("unknown experiment %s\n", s) 79 os.Exit(2) 80 } 81 82 var ( 83 framepointer_enabled int 84 Fieldtrack_enabled int 85 Preemptibleloops_enabled int 86 Clobberdead_enabled int 87 ) 88 89 // Toolchain experiments. 90 // These are controlled by the GOEXPERIMENT environment 91 // variable recorded when the toolchain is built. 92 // This list is also known to cmd/gc. 93 var exper = []struct { 94 name string 95 val *int 96 }{ 97 {"fieldtrack", &Fieldtrack_enabled}, 98 {"framepointer", &framepointer_enabled}, 99 {"preemptibleloops", &Preemptibleloops_enabled}, 100 {"clobberdead", &Clobberdead_enabled}, 101 } 102 103 func Expstring() string { 104 buf := "X" 105 for i := range exper { 106 if *exper[i].val != 0 { 107 buf += "," + exper[i].name 108 } 109 } 110 if buf == "X" { 111 buf += ",none" 112 } 113 return "X:" + buf[2:] 114 }