github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/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 for _, f := range strings.Split(goexperiment, ",") { 50 if f != "" { 51 addexp(f) 52 } 53 } 54 } 55 56 func Framepointer_enabled(goos, goarch string) bool { 57 return framepointer_enabled != 0 && goarch == "amd64" && goos != "nacl" 58 } 59 60 func addexp(s string) { 61 // Could do general integer parsing here, but the runtime copy doesn't yet. 62 v := 1 63 name := s 64 if len(name) > 2 && name[:2] == "no" { 65 v = 0 66 name = name[2:] 67 } 68 for i := 0; i < len(exper); i++ { 69 if exper[i].name == name { 70 if exper[i].val != nil { 71 *exper[i].val = v 72 } 73 return 74 } 75 } 76 77 fmt.Printf("unknown experiment %s\n", s) 78 os.Exit(2) 79 } 80 81 var ( 82 framepointer_enabled int = 1 83 Fieldtrack_enabled int 84 Preemptibleloops_enabled int 85 Clobberdead_enabled int 86 ) 87 88 // Toolchain experiments. 89 // These are controlled by the GOEXPERIMENT environment 90 // variable recorded when the toolchain is built. 91 // This list is also known to cmd/gc. 92 var exper = []struct { 93 name string 94 val *int 95 }{ 96 {"fieldtrack", &Fieldtrack_enabled}, 97 {"framepointer", &framepointer_enabled}, 98 {"preemptibleloops", &Preemptibleloops_enabled}, 99 {"clobberdead", &Clobberdead_enabled}, 100 } 101 102 var defaultExpstring = Expstring() 103 104 func DefaultExpstring() string { 105 return defaultExpstring 106 } 107 108 func Expstring() string { 109 buf := "X" 110 for i := range exper { 111 if *exper[i].val != 0 { 112 buf += "," + exper[i].name 113 } 114 } 115 if buf == "X" { 116 buf += ",none" 117 } 118 return "X:" + buf[2:] 119 }