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 5package objabi 6 7import ( 8 "fmt" 9 "log" 10 "os" 11 "strings" 12) 13 14func envOr(key, value string) string { 15 if x := os.Getenv(key); x != "" { 16 return x 17 } 18 return value 19} 20 21var ( 22 defaultGOROOT string // set by linker 23 24 GOROOT = envOr("GOROOT", defaultGOROOT) 25 GOARCH = envOr("GOARCH", defaultGOARCH) 26 GOOS = envOr("GOOS", defaultGOOS) 27 GO386 = envOr("GO386", defaultGO386) 28 GOARM = goarm() 29 GOMIPS = gomips() 30 Version = version 31) 32 33func goarm() int { 34 switch v := envOr("GOARM", defaultGOARM); v { 35 case "5": 36 return 5 37 case "6": 38 return 6 39 case "7": 40 return 7 41 } 42 // Fail here, rather than validate at multiple call sites. 43 log.Fatalf("Invalid GOARM value. Must be 5, 6, or 7.") 44 panic("unreachable") 45} 46 47func gomips() string { 48 switch v := envOr("GOMIPS", defaultGOMIPS); v { 49 case "hardfloat", "softfloat": 50 return v 51 } 52 log.Fatalf("Invalid GOMIPS value. Must be hardfloat or softfloat.") 53 panic("unreachable") 54} 55 56func Getgoextlinkenabled() string { 57 return envOr("GO_EXTLINK_ENABLED", defaultGO_EXTLINK_ENABLED) 58} 59 60func init() { 61 for _, f := range strings.Split(goexperiment, ",") { 62 if f != "" { 63 addexp(f) 64 } 65 } 66} 67 68func Framepointer_enabled(goos, goarch string) bool { 69 return framepointer_enabled != 0 && goarch == "amd64" && goos != "nacl" 70} 71 72func addexp(s string) { 73 // Could do general integer parsing here, but the runtime copy doesn't yet. 74 v := 1 75 name := s 76 if len(name) > 2 && name[:2] == "no" { 77 v = 0 78 name = name[2:] 79 } 80 for i := 0; i < len(exper); i++ { 81 if exper[i].name == name { 82 if exper[i].val != nil { 83 *exper[i].val = v 84 } 85 return 86 } 87 } 88 89 fmt.Printf("unknown experiment %s\n", s) 90 os.Exit(2) 91} 92 93var ( 94 framepointer_enabled int = 1 95 Fieldtrack_enabled int 96 Preemptibleloops_enabled int 97 Clobberdead_enabled int 98) 99 100// Toolchain experiments. 101// These are controlled by the GOEXPERIMENT environment 102// variable recorded when the toolchain is built. 103// This list is also known to cmd/gc. 104var exper = []struct { 105 name string 106 val *int 107}{ 108 {"fieldtrack", &Fieldtrack_enabled}, 109 {"framepointer", &framepointer_enabled}, 110 {"preemptibleloops", &Preemptibleloops_enabled}, 111 {"clobberdead", &Clobberdead_enabled}, 112} 113 114var defaultExpstring = Expstring() 115 116func DefaultExpstring() string { 117 return defaultExpstring 118} 119 120func Expstring() string { 121 buf := "X" 122 for i := range exper { 123 if *exper[i].val != 0 { 124 buf += "," + exper[i].name 125 } 126 } 127 if buf == "X" { 128 buf += ",none" 129 } 130 return "X:" + buf[2:] 131} 132