github.com/huandu/go@v0.0.0-20151114150818-04e615e41150/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  	"bytes"
     9  	"cmd/compile/internal/big"
    10  	"cmd/internal/obj"
    11  )
    12  
    13  // avoid <ctype.h>
    14  
    15  // The parser's maximum stack size.
    16  // We have to use a #define macro here since yacc
    17  // or bison will check for its definition and use
    18  // a potentially smaller value if it is undefined.
    19  const (
    20  	NHUNK           = 50000
    21  	BUFSIZ          = 8192
    22  	NSYMB           = 500
    23  	NHASH           = 1024
    24  	MAXALIGN        = 7
    25  	UINF            = 100
    26  	PRIME1          = 3
    27  	BADWIDTH        = -1000000000
    28  	MaxStackVarSize = 10 * 1024 * 1024
    29  )
    30  
    31  const (
    32  	// These values are known by runtime.
    33  	// The MEMx and NOEQx values must run in parallel.  See algtype.
    34  	AMEM = iota
    35  	AMEM0
    36  	AMEM8
    37  	AMEM16
    38  	AMEM32
    39  	AMEM64
    40  	AMEM128
    41  	ANOEQ
    42  	ANOEQ0
    43  	ANOEQ8
    44  	ANOEQ16
    45  	ANOEQ32
    46  	ANOEQ64
    47  	ANOEQ128
    48  	ASTRING
    49  	AINTER
    50  	ANILINTER
    51  	ASLICE
    52  	AFLOAT32
    53  	AFLOAT64
    54  	ACPLX64
    55  	ACPLX128
    56  	AUNK = 100
    57  )
    58  
    59  const (
    60  	// Maximum size in bits for Mpints before signalling
    61  	// overflow and also mantissa precision for Mpflts.
    62  	Mpprec = 512
    63  	// Turn on for constant arithmetic debugging output.
    64  	Mpdebug = false
    65  )
    66  
    67  // Mpint represents an integer constant.
    68  type Mpint struct {
    69  	Val  big.Int
    70  	Ovf  bool // set if Val overflowed compiler limit (sticky)
    71  	Rune bool // set if syntax indicates default type rune
    72  }
    73  
    74  // Mpflt represents a floating-point constant.
    75  type Mpflt struct {
    76  	Val big.Float
    77  }
    78  
    79  // Mpcplx represents a complex constant.
    80  type Mpcplx struct {
    81  	Real Mpflt
    82  	Imag Mpflt
    83  }
    84  
    85  type Val struct {
    86  	// U contains one of:
    87  	// bool     bool when n.ValCtype() == CTBOOL
    88  	// *Mpint   int when n.ValCtype() == CTINT, rune when n.ValCtype() == CTRUNE
    89  	// *Mpflt   float when n.ValCtype() == CTFLT
    90  	// *Mpcplx  pair of floats when n.ValCtype() == CTCPLX
    91  	// string   string when n.ValCtype() == CTSTR
    92  	// *Nilval  when n.ValCtype() == CTNIL
    93  	U interface{}
    94  }
    95  
    96  type NilVal struct{}
    97  
    98  func (v Val) Ctype() int {
    99  	switch x := v.U.(type) {
   100  	default:
   101  		Fatal("unexpected Ctype for %T", v.U)
   102  		panic("not reached")
   103  	case nil:
   104  		return 0
   105  	case *NilVal:
   106  		return CTNIL
   107  	case bool:
   108  		return CTBOOL
   109  	case *Mpint:
   110  		if x.Rune {
   111  			return CTRUNE
   112  		}
   113  		return CTINT
   114  	case *Mpflt:
   115  		return CTFLT
   116  	case *Mpcplx:
   117  		return CTCPLX
   118  	case string:
   119  		return CTSTR
   120  	}
   121  }
   122  
   123  type Pkg struct {
   124  	Name     string // package name
   125  	Path     string // string literal used in import statement
   126  	Pathsym  *Sym
   127  	Prefix   string // escaped path for use in symbol table
   128  	Imported uint8  // export data of this package was parsed
   129  	Exported int8   // import line written in export data
   130  	Direct   int8   // imported directly
   131  	Safe     bool   // whether the package is marked as safe
   132  	Syms     map[string]*Sym
   133  }
   134  
   135  type Sym struct {
   136  	Lexical   uint16
   137  	Flags     uint8
   138  	Link      *Sym
   139  	Uniqgen   uint32
   140  	Importdef *Pkg   // where imported definition was found
   141  	Linkname  string // link name
   142  
   143  	// saved and restored by dcopy
   144  	Pkg        *Pkg
   145  	Name       string // variable name
   146  	Def        *Node  // definition: ONAME OTYPE OPACK or OLITERAL
   147  	Label      *Label // corresponding label (ephemeral)
   148  	Block      int32  // blocknumber to catch redeclaration
   149  	Lastlineno int32  // last declaration for diagnostic
   150  	Origpkg    *Pkg   // original package for . import
   151  	Lsym       *obj.LSym
   152  	Fsym       *Sym // funcsym
   153  }
   154  
   155  type Type struct {
   156  	Etype       uint8
   157  	Nointerface bool
   158  	Noalg       uint8
   159  	Chan        uint8
   160  	Trecur      uint8 // to detect loops
   161  	Printed     uint8
   162  	Embedded    uint8 // TFIELD embedded type
   163  	Siggen      uint8
   164  	Funarg      uint8 // on TSTRUCT and TFIELD
   165  	Copyany     uint8
   166  	Local       bool // created in this file
   167  	Deferwidth  uint8
   168  	Broke       uint8 // broken type definition.
   169  	Isddd       bool  // TFIELD is ... argument
   170  	Align       uint8
   171  	Haspointers uint8 // 0 unknown, 1 no, 2 yes
   172  
   173  	Nod    *Node // canonical OTYPE node
   174  	Orig   *Type // original type (type literal or predefined type)
   175  	Lineno int
   176  
   177  	// TFUNC
   178  	Thistuple int
   179  	Outtuple  int
   180  	Intuple   int
   181  	Outnamed  uint8
   182  
   183  	Method  *Type
   184  	Xmethod *Type
   185  
   186  	Sym    *Sym
   187  	Vargen int32 // unique name for OTYPE/ONAME
   188  
   189  	Nname  *Node
   190  	Argwid int64
   191  
   192  	// most nodes
   193  	Type  *Type // actual type for TFIELD, element type for TARRAY, TCHAN, TMAP, TPTRxx
   194  	Width int64 // offset in TFIELD, width in all others
   195  
   196  	// TFIELD
   197  	Down  *Type   // next struct field, also key type in TMAP
   198  	Outer *Type   // outer struct
   199  	Note  *string // literal string annotation
   200  
   201  	// TARRAY
   202  	Bound int64 // negative is dynamic array
   203  
   204  	// TMAP
   205  	Bucket *Type // internal type representing a hash bucket
   206  	Hmap   *Type // internal type representing a Hmap (map header object)
   207  	Hiter  *Type // internal type representing hash iterator state
   208  	Map    *Type // link from the above 3 internal types back to the map type.
   209  
   210  	Maplineno   int32 // first use of TFORW as map key
   211  	Embedlineno int32 // first use of TFORW as embedded type
   212  
   213  	// for TFORW, where to copy the eventual value to
   214  	Copyto *NodeList
   215  
   216  	Lastfn *Node // for usefield
   217  }
   218  
   219  type Label struct {
   220  	Used uint8
   221  	Sym  *Sym
   222  	Def  *Node
   223  	Use  *NodeList
   224  	Link *Label
   225  
   226  	// for use during gen
   227  	Gotopc   *obj.Prog // pointer to unresolved gotos
   228  	Labelpc  *obj.Prog // pointer to code
   229  	Breakpc  *obj.Prog // pointer to code
   230  	Continpc *obj.Prog // pointer to code
   231  }
   232  
   233  type InitEntry struct {
   234  	Xoffset int64 // struct, array only
   235  	Expr    *Node // bytes of run-time computed expressions
   236  }
   237  
   238  type InitPlan struct {
   239  	Lit  int64
   240  	Zero int64
   241  	Expr int64
   242  	E    []InitEntry
   243  }
   244  
   245  const (
   246  	SymExport   = 1 << 0 // to be exported
   247  	SymPackage  = 1 << 1
   248  	SymExported = 1 << 2 // already written out by export
   249  	SymUniq     = 1 << 3
   250  	SymSiggen   = 1 << 4
   251  	SymAsm      = 1 << 5
   252  	SymAlgGen   = 1 << 6
   253  )
   254  
   255  var dclstack *Sym
   256  
   257  type Iter struct {
   258  	Done  int
   259  	Tfunc *Type
   260  	T     *Type
   261  }
   262  
   263  const (
   264  	Txxx = iota
   265  
   266  	TINT8
   267  	TUINT8
   268  	TINT16
   269  	TUINT16
   270  	TINT32
   271  	TUINT32
   272  	TINT64
   273  	TUINT64
   274  	TINT
   275  	TUINT
   276  	TUINTPTR
   277  
   278  	TCOMPLEX64
   279  	TCOMPLEX128
   280  
   281  	TFLOAT32
   282  	TFLOAT64
   283  
   284  	TBOOL
   285  
   286  	TPTR32
   287  	TPTR64
   288  
   289  	TFUNC
   290  	TARRAY
   291  	T_old_DARRAY
   292  	TSTRUCT
   293  	TCHAN
   294  	TMAP
   295  	TINTER
   296  	TFORW
   297  	TFIELD
   298  	TANY
   299  	TSTRING
   300  	TUNSAFEPTR
   301  
   302  	// pseudo-types for literals
   303  	TIDEAL
   304  	TNIL
   305  	TBLANK
   306  
   307  	// pseudo-type for frame layout
   308  	TFUNCARGS
   309  	TCHANARGS
   310  	TINTERMETH
   311  
   312  	NTYPE
   313  )
   314  
   315  const (
   316  	CTxxx = iota
   317  
   318  	CTINT
   319  	CTRUNE
   320  	CTFLT
   321  	CTCPLX
   322  	CTSTR
   323  	CTBOOL
   324  	CTNIL
   325  )
   326  
   327  const (
   328  	/* types of channel */
   329  	/* must match ../../pkg/nreflect/type.go:/Chandir */
   330  	Cxxx  = 0
   331  	Crecv = 1 << 0
   332  	Csend = 1 << 1
   333  	Cboth = Crecv | Csend
   334  )
   335  
   336  // declaration context
   337  const (
   338  	Pxxx      = uint8(iota)
   339  	PEXTERN   // global variable
   340  	PAUTO     // local variables
   341  	PPARAM    // input arguments
   342  	PPARAMOUT // output results
   343  	PPARAMREF // closure variable reference
   344  	PFUNC     // global function
   345  
   346  	PDISCARD // discard during parse of duplicate import
   347  
   348  	PHEAP = uint8(1 << 7) // an extra bit to identify an escaped variable
   349  )
   350  
   351  const (
   352  	Etop      = 1 << 1 // evaluated at statement level
   353  	Erv       = 1 << 2 // evaluated in value context
   354  	Etype     = 1 << 3
   355  	Ecall     = 1 << 4  // call-only expressions are ok
   356  	Efnstruct = 1 << 5  // multivalue function returns are ok
   357  	Eiota     = 1 << 6  // iota is ok
   358  	Easgn     = 1 << 7  // assigning to expression
   359  	Eindir    = 1 << 8  // indirecting through expression
   360  	Eaddr     = 1 << 9  // taking address of expression
   361  	Eproc     = 1 << 10 // inside a go statement
   362  	Ecomplit  = 1 << 11 // type in composite literal
   363  )
   364  
   365  type Typedef struct {
   366  	Name   string
   367  	Etype  int
   368  	Sameas int
   369  }
   370  
   371  type Sig struct {
   372  	name   string
   373  	pkg    *Pkg
   374  	isym   *Sym
   375  	tsym   *Sym
   376  	type_  *Type
   377  	mtype  *Type
   378  	offset int32
   379  	link   *Sig
   380  }
   381  
   382  type Io struct {
   383  	infile     string
   384  	bin        *obj.Biobuf
   385  	nlsemi     int
   386  	eofnl      int
   387  	last       int
   388  	peekc      int
   389  	peekc1     int    // second peekc for ...
   390  	cp         string // used for content when bin==nil
   391  	importsafe bool
   392  }
   393  
   394  type Dlist struct {
   395  	field *Type
   396  }
   397  
   398  type Idir struct {
   399  	link *Idir
   400  	dir  string
   401  }
   402  
   403  /*
   404   * argument passing to/from
   405   * smagic and umagic
   406   */
   407  type Magic struct {
   408  	W   int // input for both - width
   409  	S   int // output for both - shift
   410  	Bad int // output for both - unexpected failure
   411  
   412  	// magic multiplier for signed literal divisors
   413  	Sd int64 // input - literal divisor
   414  	Sm int64 // output - multiplier
   415  
   416  	// magic multiplier for unsigned literal divisors
   417  	Ud uint64 // input - literal divisor
   418  	Um uint64 // output - multiplier
   419  	Ua int    // output - adder
   420  }
   421  
   422  /*
   423   * note this is the runtime representation
   424   * of the compilers arrays.
   425   *
   426   * typedef	struct
   427   * {				// must not move anything
   428   *	uchar	array[8];	// pointer to data
   429   *	uchar	nel[4];		// number of elements
   430   *	uchar	cap[4];		// allocated number of elements
   431   * } Array;
   432   */
   433  var Array_array int // runtime offsetof(Array,array) - same for String
   434  
   435  var Array_nel int // runtime offsetof(Array,nel) - same for String
   436  
   437  var Array_cap int // runtime offsetof(Array,cap)
   438  
   439  var sizeof_Array int // runtime sizeof(Array)
   440  
   441  /*
   442   * note this is the runtime representation
   443   * of the compilers strings.
   444   *
   445   * typedef	struct
   446   * {				// must not move anything
   447   *	uchar	array[8];	// pointer to data
   448   *	uchar	nel[4];		// number of elements
   449   * } String;
   450   */
   451  var sizeof_String int // runtime sizeof(String)
   452  
   453  var dotlist [10]Dlist // size is max depth of embeddeds
   454  
   455  var curio Io
   456  
   457  var pushedio Io
   458  
   459  var lexlineno int32
   460  
   461  var lineno int32
   462  
   463  var prevlineno int32
   464  
   465  var pragcgobuf string
   466  
   467  var infile string
   468  
   469  var outfile string
   470  
   471  var bout *obj.Biobuf
   472  
   473  var nerrors int
   474  
   475  var nsavederrors int
   476  
   477  var nsyntaxerrors int
   478  
   479  var decldepth int32
   480  
   481  var safemode int
   482  
   483  var nolocalimports int
   484  
   485  var lexbuf bytes.Buffer
   486  var strbuf bytes.Buffer
   487  
   488  var litbuf string
   489  
   490  var Debug [256]int
   491  
   492  var debugstr string
   493  
   494  var Debug_checknil int
   495  var Debug_typeassert int
   496  
   497  var importmyname *Sym // my name for package
   498  
   499  var localpkg *Pkg // package being compiled
   500  
   501  var importpkg *Pkg // package being imported
   502  
   503  var structpkg *Pkg // package that declared struct, during import
   504  
   505  var builtinpkg *Pkg // fake package for builtins
   506  
   507  var gostringpkg *Pkg // fake pkg for Go strings
   508  
   509  var itabpkg *Pkg // fake pkg for itab cache
   510  
   511  var Runtimepkg *Pkg // package runtime
   512  
   513  var racepkg *Pkg // package runtime/race
   514  
   515  var typepkg *Pkg // fake package for runtime type info (headers)
   516  
   517  var typelinkpkg *Pkg // fake package for runtime type info (data)
   518  
   519  var weaktypepkg *Pkg // weak references to runtime type info
   520  
   521  var unsafepkg *Pkg // package unsafe
   522  
   523  var trackpkg *Pkg // fake package for field tracking
   524  
   525  var Tptr int // either TPTR32 or TPTR64
   526  
   527  var myimportpath string
   528  
   529  var idirs *Idir
   530  
   531  var localimport string
   532  
   533  var asmhdr string
   534  
   535  var Types [NTYPE]*Type
   536  
   537  var idealstring *Type
   538  
   539  var idealbool *Type
   540  
   541  var bytetype *Type
   542  
   543  var runetype *Type
   544  
   545  var errortype *Type
   546  
   547  var Simtype [NTYPE]uint8
   548  
   549  var (
   550  	Isptr     [NTYPE]bool
   551  	isforw    [NTYPE]bool
   552  	Isint     [NTYPE]bool
   553  	Isfloat   [NTYPE]bool
   554  	Iscomplex [NTYPE]bool
   555  	Issigned  [NTYPE]bool
   556  	issimple  [NTYPE]bool
   557  )
   558  
   559  var (
   560  	okforeq    [NTYPE]bool
   561  	okforadd   [NTYPE]bool
   562  	okforand   [NTYPE]bool
   563  	okfornone  [NTYPE]bool
   564  	okforcmp   [NTYPE]bool
   565  	okforbool  [NTYPE]bool
   566  	okforcap   [NTYPE]bool
   567  	okforlen   [NTYPE]bool
   568  	okforarith [NTYPE]bool
   569  	okforconst [NTYPE]bool
   570  )
   571  
   572  var (
   573  	okfor [OEND][]bool
   574  	iscmp [OEND]bool
   575  )
   576  
   577  var Minintval [NTYPE]*Mpint
   578  
   579  var Maxintval [NTYPE]*Mpint
   580  
   581  var minfltval [NTYPE]*Mpflt
   582  
   583  var maxfltval [NTYPE]*Mpflt
   584  
   585  var xtop *NodeList
   586  
   587  var externdcl *NodeList
   588  
   589  var exportlist *NodeList
   590  
   591  var importlist *NodeList // imported functions and methods with inlinable bodies
   592  
   593  var funcsyms *NodeList
   594  
   595  var dclcontext uint8 // PEXTERN/PAUTO
   596  
   597  var incannedimport int
   598  
   599  var statuniqgen int // name generator for static temps
   600  
   601  var loophack int
   602  
   603  var iota_ int32
   604  
   605  var lastconst *NodeList
   606  
   607  var lasttype *Node
   608  
   609  var Maxarg int64
   610  
   611  var Stksize int64 // stack size for current frame
   612  
   613  var stkptrsize int64 // prefix of stack containing pointers
   614  
   615  var blockgen int32 // max block number
   616  
   617  var block int32 // current block number
   618  
   619  var Hasdefer int // flag that curfn has defer statetment
   620  
   621  var Curfn *Node
   622  
   623  var Widthptr int
   624  
   625  var Widthint int
   626  
   627  var Widthreg int
   628  
   629  var typesw *Node
   630  
   631  var nblank *Node
   632  
   633  var hunk string
   634  
   635  var nhunk int32
   636  
   637  var thunk int32
   638  
   639  var Funcdepth int32
   640  
   641  var typecheckok int
   642  
   643  var compiling_runtime int
   644  
   645  var compiling_wrappers int
   646  
   647  var use_writebarrier int
   648  
   649  var pure_go int
   650  
   651  var flag_installsuffix string
   652  
   653  var flag_race int
   654  
   655  var flag_largemodel int
   656  
   657  // Pending annotations for next func declaration.
   658  var (
   659  	noescape       bool
   660  	nosplit        bool
   661  	nowritebarrier bool
   662  	systemstack    bool
   663  	norace         bool
   664  )
   665  
   666  var debuglive int
   667  
   668  var Ctxt *obj.Link
   669  
   670  var nointerface bool
   671  
   672  var writearchive int
   673  
   674  var bstdout obj.Biobuf
   675  
   676  var Nacl bool
   677  
   678  var continpc *obj.Prog
   679  
   680  var breakpc *obj.Prog
   681  
   682  var Pc *obj.Prog
   683  
   684  var nodfp *Node
   685  
   686  var Disable_checknil int
   687  
   688  var zerosize int64
   689  
   690  type Flow struct {
   691  	Prog   *obj.Prog // actual instruction
   692  	P1     *Flow     // predecessors of this instruction: p1,
   693  	P2     *Flow     // and then p2 linked though p2link.
   694  	P2link *Flow
   695  	S1     *Flow // successors of this instruction (at most two: s1 and s2).
   696  	S2     *Flow
   697  	Link   *Flow // next instruction in function code
   698  
   699  	Active int32 // usable by client
   700  
   701  	Id     int32  // sequence number in flow graph
   702  	Rpo    int32  // reverse post ordering
   703  	Loop   uint16 // x5 for every loop
   704  	Refset uint8  // diagnostic generated
   705  
   706  	Data interface{} // for use by client
   707  }
   708  
   709  type Graph struct {
   710  	Start *Flow
   711  	Num   int
   712  
   713  	// After calling flowrpo, rpo lists the flow nodes in reverse postorder,
   714  	// and each non-dead Flow node f has g->rpo[f->rpo] == f.
   715  	Rpo []*Flow
   716  }
   717  
   718  /*
   719   *	interface to back end
   720   */
   721  
   722  const (
   723  	// Pseudo-op, like TEXT, GLOBL, TYPE, PCDATA, FUNCDATA.
   724  	Pseudo = 1 << 1
   725  
   726  	// There's nothing to say about the instruction,
   727  	// but it's still okay to see.
   728  	OK = 1 << 2
   729  
   730  	// Size of right-side write, or right-side read if no write.
   731  	SizeB = 1 << 3
   732  	SizeW = 1 << 4
   733  	SizeL = 1 << 5
   734  	SizeQ = 1 << 6
   735  	SizeF = 1 << 7
   736  	SizeD = 1 << 8
   737  
   738  	// Left side (Prog.from): address taken, read, write.
   739  	LeftAddr  = 1 << 9
   740  	LeftRead  = 1 << 10
   741  	LeftWrite = 1 << 11
   742  
   743  	// Register in middle (Prog.reg); only ever read. (arm, ppc64)
   744  	RegRead    = 1 << 12
   745  	CanRegRead = 1 << 13
   746  
   747  	// Right side (Prog.to): address taken, read, write.
   748  	RightAddr  = 1 << 14
   749  	RightRead  = 1 << 15
   750  	RightWrite = 1 << 16
   751  
   752  	// Instruction kinds
   753  	Move  = 1 << 17 // straight move
   754  	Conv  = 1 << 18 // size conversion
   755  	Cjmp  = 1 << 19 // conditional jump
   756  	Break = 1 << 20 // breaks control flow (no fallthrough)
   757  	Call  = 1 << 21 // function call
   758  	Jump  = 1 << 22 // jump
   759  	Skip  = 1 << 23 // data instruction
   760  
   761  	// Set, use, or kill of carry bit.
   762  	// Kill means we never look at the carry bit after this kind of instruction.
   763  	SetCarry  = 1 << 24
   764  	UseCarry  = 1 << 25
   765  	KillCarry = 1 << 26
   766  
   767  	// Special cases for register use. (amd64, 386)
   768  	ShiftCX  = 1 << 27 // possible shift by CX
   769  	ImulAXDX = 1 << 28 // possible multiply into DX:AX
   770  
   771  	// Instruction updates whichever of from/to is type D_OREG. (ppc64)
   772  	PostInc = 1 << 29
   773  )
   774  
   775  type Arch struct {
   776  	Thechar      int
   777  	Thestring    string
   778  	Thelinkarch  *obj.LinkArch
   779  	Typedefs     []Typedef
   780  	REGSP        int
   781  	REGCTXT      int
   782  	REGCALLX     int // BX
   783  	REGCALLX2    int // AX
   784  	REGRETURN    int // AX
   785  	REGMIN       int
   786  	REGMAX       int
   787  	REGZERO      int // architectural zero register, if available
   788  	FREGMIN      int
   789  	FREGMAX      int
   790  	MAXWIDTH     int64
   791  	ReservedRegs []int
   792  
   793  	AddIndex     func(*Node, int64, *Node) bool // optional
   794  	Betypeinit   func()
   795  	Bgen_float   func(*Node, bool, int, *obj.Prog) // optional
   796  	Cgen64       func(*Node, *Node)                // only on 32-bit systems
   797  	Cgenindex    func(*Node, *Node, bool) *obj.Prog
   798  	Cgen_bmul    func(int, *Node, *Node, *Node) bool
   799  	Cgen_float   func(*Node, *Node) // optional
   800  	Cgen_hmul    func(*Node, *Node, *Node)
   801  	Cgen_shift   func(int, bool, *Node, *Node, *Node)
   802  	Clearfat     func(*Node)
   803  	Cmp64        func(*Node, *Node, int, int, *obj.Prog) // only on 32-bit systems
   804  	Defframe     func(*obj.Prog)
   805  	Dodiv        func(int, *Node, *Node, *Node)
   806  	Excise       func(*Flow)
   807  	Expandchecks func(*obj.Prog)
   808  	Getg         func(*Node)
   809  	Gins         func(int, *Node, *Node) *obj.Prog
   810  
   811  	// Ginscmp generates code comparing n1 to n2 and jumping away if op is satisfied.
   812  	// The returned prog should be Patch'ed with the jump target.
   813  	// If op is not satisfied, code falls through to the next emitted instruction.
   814  	// Likely is the branch prediction hint: +1 for likely, -1 for unlikely, 0 for no opinion.
   815  	//
   816  	// Ginscmp must be able to handle all kinds of arguments for n1 and n2,
   817  	// not just simple registers, although it can assume that there are no
   818  	// function calls needed during the evaluation, and on 32-bit systems
   819  	// the values are guaranteed not to be 64-bit values, so no in-memory
   820  	// temporaries are necessary.
   821  	Ginscmp func(op int, t *Type, n1, n2 *Node, likely int) *obj.Prog
   822  
   823  	// Ginsboolval inserts instructions to convert the result
   824  	// of a just-completed comparison to a boolean value.
   825  	// The first argument is the conditional jump instruction
   826  	// corresponding to the desired value.
   827  	// The second argument is the destination.
   828  	// If not present, Ginsboolval will be emulated with jumps.
   829  	Ginsboolval func(int, *Node)
   830  
   831  	Ginscon      func(int, int64, *Node)
   832  	Ginsnop      func()
   833  	Gmove        func(*Node, *Node)
   834  	Igenindex    func(*Node, *Node, bool) *obj.Prog
   835  	Linkarchinit func()
   836  	Peep         func(*obj.Prog)
   837  	Proginfo     func(*obj.Prog) // fills in Prog.Info
   838  	Regtyp       func(*obj.Addr) bool
   839  	Sameaddr     func(*obj.Addr, *obj.Addr) bool
   840  	Smallindir   func(*obj.Addr, *obj.Addr) bool
   841  	Stackaddr    func(*obj.Addr) bool
   842  	Blockcopy    func(*Node, *Node, int64, int64, int64)
   843  	Sudoaddable  func(int, *Node, *obj.Addr) bool
   844  	Sudoclean    func()
   845  	Excludedregs func() uint64
   846  	RtoB         func(int) uint64
   847  	FtoB         func(int) uint64
   848  	BtoR         func(uint64) int
   849  	BtoF         func(uint64) int
   850  	Optoas       func(int, *Type) int
   851  	Doregbits    func(int) uint64
   852  	Regnames     func(*int) []string
   853  	Use387       bool // should 8g use 387 FP instructions instead of sse2.
   854  }
   855  
   856  var pcloc int32
   857  
   858  var Thearch Arch
   859  
   860  var Newproc *Node
   861  
   862  var Deferproc *Node
   863  
   864  var Deferreturn *Node
   865  
   866  var Panicindex *Node
   867  
   868  var panicslice *Node
   869  
   870  var throwreturn *Node