github.com/yukk001/go1.10.8@v0.0.0-20190813125351-6df2d3982e20/src/cmd/compile/internal/gc/go.go (about) 1 // Copyright 2009 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 gc 6 7 import ( 8 "cmd/compile/internal/ssa" 9 "cmd/compile/internal/types" 10 "cmd/internal/obj" 11 "cmd/internal/src" 12 "sync" 13 ) 14 15 const ( 16 BADWIDTH = types.BADWIDTH 17 maxStackVarSize = 10 * 1024 * 1024 18 ) 19 20 // isRuntimePkg reports whether p is package runtime. 21 func isRuntimePkg(p *types.Pkg) bool { 22 if compiling_runtime && p == localpkg { 23 return true 24 } 25 return p.Path == "runtime" 26 } 27 28 // The Class of a variable/function describes the "storage class" 29 // of a variable or function. During parsing, storage classes are 30 // called declaration contexts. 31 type Class uint8 32 33 //go:generate stringer -type=Class 34 const ( 35 Pxxx Class = iota // no class; used during ssa conversion to indicate pseudo-variables 36 PEXTERN // global variable 37 PAUTO // local variables 38 PAUTOHEAP // local variable or parameter moved to heap 39 PPARAM // input arguments 40 PPARAMOUT // output results 41 PFUNC // global function 42 43 PDISCARD // discard during parse of duplicate import 44 // Careful: Class is stored in three bits in Node.flags. 45 // Adding a new Class will overflow that. 46 ) 47 48 func init() { 49 if PDISCARD != 7 { 50 panic("PDISCARD changed; does all Class values still fit in three bits?") 51 } 52 } 53 54 // note this is the runtime representation 55 // of the compilers arrays. 56 // 57 // typedef struct 58 // { // must not move anything 59 // uchar array[8]; // pointer to data 60 // uchar nel[4]; // number of elements 61 // uchar cap[4]; // allocated number of elements 62 // } Array; 63 var array_array int // runtime offsetof(Array,array) - same for String 64 65 var array_nel int // runtime offsetof(Array,nel) - same for String 66 67 var array_cap int // runtime offsetof(Array,cap) 68 69 var sizeof_Array int // runtime sizeof(Array) 70 71 // note this is the runtime representation 72 // of the compilers strings. 73 // 74 // typedef struct 75 // { // must not move anything 76 // uchar array[8]; // pointer to data 77 // uchar nel[4]; // number of elements 78 // } String; 79 var sizeof_String int // runtime sizeof(String) 80 81 var pragcgobuf string 82 83 var outfile string 84 var linkobj string 85 var dolinkobj bool 86 87 // nerrors is the number of compiler errors reported 88 // since the last call to saveerrors. 89 var nerrors int 90 91 // nsavederrors is the total number of compiler errors 92 // reported before the last call to saveerrors. 93 var nsavederrors int 94 95 var nsyntaxerrors int 96 97 var decldepth int32 98 99 var safemode bool 100 101 var nolocalimports bool 102 103 var Debug [256]int 104 105 var debugstr string 106 107 var Debug_checknil int 108 var Debug_typeassert int 109 110 var localpkg *types.Pkg // package being compiled 111 112 var inimport bool // set during import 113 114 var itabpkg *types.Pkg // fake pkg for itab entries 115 116 var itablinkpkg *types.Pkg // fake package for runtime itab entries 117 118 var Runtimepkg *types.Pkg // fake package runtime 119 120 var racepkg *types.Pkg // package runtime/race 121 122 var msanpkg *types.Pkg // package runtime/msan 123 124 var unsafepkg *types.Pkg // package unsafe 125 126 var trackpkg *types.Pkg // fake package for field tracking 127 128 var mappkg *types.Pkg // fake package for map zero value 129 var zerosize int64 130 131 var myimportpath string 132 133 var localimport string 134 135 var asmhdr string 136 137 var simtype [NTYPE]types.EType 138 139 var ( 140 isforw [NTYPE]bool 141 isInt [NTYPE]bool 142 isFloat [NTYPE]bool 143 isComplex [NTYPE]bool 144 issimple [NTYPE]bool 145 ) 146 147 var ( 148 okforeq [NTYPE]bool 149 okforadd [NTYPE]bool 150 okforand [NTYPE]bool 151 okfornone [NTYPE]bool 152 okforcmp [NTYPE]bool 153 okforbool [NTYPE]bool 154 okforcap [NTYPE]bool 155 okforlen [NTYPE]bool 156 okforarith [NTYPE]bool 157 okforconst [NTYPE]bool 158 ) 159 160 var ( 161 okfor [OEND][]bool 162 iscmp [OEND]bool 163 ) 164 165 var minintval [NTYPE]*Mpint 166 167 var maxintval [NTYPE]*Mpint 168 169 var minfltval [NTYPE]*Mpflt 170 171 var maxfltval [NTYPE]*Mpflt 172 173 var xtop []*Node 174 175 var exportlist []*Node 176 177 var importlist []*Node // imported functions and methods with inlinable bodies 178 179 var ( 180 funcsymsmu sync.Mutex // protects funcsyms and associated package lookups (see func funcsym) 181 funcsyms []*types.Sym 182 ) 183 184 var dclcontext Class // PEXTERN/PAUTO 185 186 var Curfn *Node 187 188 var Widthptr int 189 190 var Widthreg int 191 192 var nblank *Node 193 194 var typecheckok bool 195 196 var compiling_runtime bool 197 198 // Compiling the standard library 199 var compiling_std bool 200 201 var compiling_wrappers bool 202 203 var use_writebarrier bool 204 205 var pure_go bool 206 207 var flag_installsuffix string 208 209 var flag_race bool 210 211 var flag_msan bool 212 213 var flagDWARF bool 214 215 // Whether we are adding any sort of code instrumentation, such as 216 // when the race detector is enabled. 217 var instrumenting bool 218 219 // Whether we are tracking lexical scopes for DWARF. 220 var trackScopes bool 221 222 // Controls generation of DWARF inlined instance records. Zero 223 // disables, 1 emits inlined routines but suppresses var info, 224 // and 2 emits inlined routines with tracking of formals/locals. 225 var genDwarfInline int 226 227 var debuglive int 228 229 var Ctxt *obj.Link 230 231 var writearchive bool 232 233 var Nacl bool 234 235 var nodfp *Node 236 237 var disable_checknil int 238 239 var autogeneratedPos src.XPos 240 241 // interface to back end 242 243 type Arch struct { 244 LinkArch *obj.LinkArch 245 246 REGSP int 247 MAXWIDTH int64 248 Use387 bool // should 386 backend use 387 FP instructions instead of sse2. 249 SoftFloat bool 250 251 PadFrame func(int64) int64 252 ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog 253 Ginsnop func(*Progs) 254 255 // SSAMarkMoves marks any MOVXconst ops that need to avoid clobbering flags. 256 SSAMarkMoves func(*SSAGenState, *ssa.Block) 257 258 // SSAGenValue emits Prog(s) for the Value. 259 SSAGenValue func(*SSAGenState, *ssa.Value) 260 261 // SSAGenBlock emits end-of-block Progs. SSAGenValue should be called 262 // for all values in the block before SSAGenBlock. 263 SSAGenBlock func(s *SSAGenState, b, next *ssa.Block) 264 265 // ZeroAuto emits code to zero the given auto stack variable. 266 // ZeroAuto must not use any non-temporary registers. 267 // ZeroAuto will only be called for variables which contain a pointer. 268 ZeroAuto func(*Progs, *Node) 269 } 270 271 var thearch Arch 272 273 var ( 274 staticbytes, 275 zerobase *Node 276 277 Newproc, 278 Deferproc, 279 Deferreturn, 280 Duffcopy, 281 Duffzero, 282 panicindex, 283 panicslice, 284 panicdivide, 285 growslice, 286 panicdottypeE, 287 panicdottypeI, 288 panicnildottype, 289 assertE2I, 290 assertE2I2, 291 assertI2I, 292 assertI2I2, 293 goschedguarded, 294 writeBarrier, 295 writebarrierptr, 296 gcWriteBarrier, 297 typedmemmove, 298 typedmemclr, 299 Udiv *obj.LSym 300 301 // GO386=387 302 ControlWord64trunc, 303 ControlWord32 *obj.LSym 304 )