github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/internal/goexperiment/flags.go (about) 1 // Copyright 2021 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 goexperiment implements support for toolchain experiments. 6 // 7 // Toolchain experiments are controlled by the GOEXPERIMENT 8 // environment variable. GOEXPERIMENT is a comma-separated list of 9 // experiment names. GOEXPERIMENT can be set at make.bash time, which 10 // sets the default experiments for binaries built with the tool 11 // chain; or it can be set at build time. GOEXPERIMENT can also be set 12 // to "none", which disables any experiments that were enabled at 13 // make.bash time. 14 // 15 // Experiments are exposed to the build in the following ways: 16 // 17 // - Build tag goexperiment.x is set if experiment x (lower case) is 18 // enabled. 19 // 20 // - For each experiment x (in camel case), this package contains a 21 // boolean constant x and an integer constant xInt. 22 // 23 // - In runtime assembly, the macro GOEXPERIMENT_x is defined if 24 // experiment x (lower case) is enabled. 25 // 26 // In the toolchain, the set of experiments enabled for the current 27 // build should be accessed via objabi.Experiment. 28 // 29 // The set of experiments is included in the output of runtime.Version() 30 // and "go version <binary>" if it differs from the default experiments. 31 // 32 // For the set of experiments supported by the current toolchain, see 33 // "go doc goexperiment.Flags". 34 // 35 // Note that this package defines the set of experiments (in Flags) 36 // and records the experiments that were enabled when the package 37 // was compiled (as boolean and integer constants). 38 // 39 // Note especially that this package does not itself change behavior 40 // at run time based on the GOEXPERIMENT variable. 41 // The code used in builds to interpret the GOEXPERIMENT variable 42 // is in the separate package internal/buildcfg. 43 package goexperiment 44 45 // Flags is the set of experiments that can be enabled or disabled in 46 // the current toolchain. 47 // 48 // When specified in the GOEXPERIMENT environment variable or as build 49 // tags, experiments use the strings.ToLower of their field name. 50 // 51 // For the baseline experimental configuration, see 52 // objabi.experimentBaseline. 53 // 54 // If you change this struct definition, run "go generate". 55 type Flags struct { 56 FieldTrack bool 57 PreemptibleLoops bool 58 StaticLockRanking bool 59 BoringCrypto bool 60 61 // RegabiWrappers enables ABI wrappers for calling between 62 // ABI0 and ABIInternal functions. Without this, the ABIs are 63 // assumed to be identical so cross-ABI calls are direct. 64 RegabiWrappers bool 65 // RegabiArgs enables register arguments/results in all 66 // compiled Go functions. 67 // 68 // Requires wrappers (to do ABI translation), and reflect (so 69 // reflection calls use registers). 70 RegabiArgs bool 71 72 // HeapMinimum512KiB reduces the minimum heap size to 512 KiB. 73 // 74 // This was originally reduced as part of PacerRedesign, but 75 // has been broken out to its own experiment that is disabled 76 // by default. 77 HeapMinimum512KiB bool 78 79 // CoverageRedesign enables the new compiler-based code coverage 80 // tooling. 81 CoverageRedesign bool 82 83 // Arenas causes the "arena" standard library package to be visible 84 // to the outside world. 85 Arenas bool 86 87 // PageTrace enables GODEBUG=pagetrace=/path/to/result. This feature 88 // is a GOEXPERIMENT due to a security risk with setuid binaries: 89 // this compels the Go runtime to write to some arbitrary file, which 90 // may be exploited. 91 PageTrace bool 92 93 // CgoCheck2 enables an expensive cgo rule checker. 94 // When this experiment is enabled, cgo rule checks occur regardless 95 // of the GODEBUG=cgocheck setting provided at runtime. 96 CgoCheck2 bool 97 98 // LoopVar changes loop semantics so that each iteration gets its own 99 // copy of the iteration variable. 100 LoopVar bool 101 102 // CacheProg adds support to cmd/go to use a child process to implement 103 // the build cache; see https://github.com/golang/go/issues/59719. 104 CacheProg bool 105 106 // NewInliner enables a new+improved version of the function 107 // inlining phase within the Go compiler. 108 NewInliner bool 109 110 // RangeFunc enables range over func. 111 RangeFunc bool 112 113 // Range enables range over int and func. 114 Range bool 115 116 // AllocHeaders enables a different, more efficient way for the GC to 117 // manage heap metadata. 118 AllocHeaders bool 119 120 // ExecTracer2 controls whether to use the new execution trace 121 // implementation. 122 ExecTracer2 bool 123 }