github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/cmd/compile/internal/gc/plive.go (about)

     1  // Copyright 2013 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  // Garbage collector liveness bitmap generation.
     6  
     7  // The command line flag -live causes this code to print debug information.
     8  // The levels are:
     9  //
    10  //	-live (aka -live=1): print liveness lists as code warnings at safe points
    11  //	-live=2: print an assembly listing with liveness annotations
    12  //
    13  // Each level includes the earlier output as well.
    14  
    15  package gc
    16  
    17  import (
    18  	"cmd/compile/internal/ssa"
    19  	"cmd/compile/internal/types"
    20  	"cmd/internal/obj"
    21  	"cmd/internal/objabi"
    22  	"cmd/internal/src"
    23  	"crypto/md5"
    24  	"crypto/sha1"
    25  	"fmt"
    26  	"os"
    27  	"strings"
    28  )
    29  
    30  // TODO(mdempsky): Update to reference OpVar{Def,Kill,Live} instead.
    31  
    32  // VARDEF is an annotation for the liveness analysis, marking a place
    33  // where a complete initialization (definition) of a variable begins.
    34  // Since the liveness analysis can see initialization of single-word
    35  // variables quite easy, gvardef is usually only called for multi-word
    36  // or 'fat' variables, those satisfying isfat(n->type).
    37  // However, gvardef is also called when a non-fat variable is initialized
    38  // via a block move; the only time this happens is when you have
    39  //	return f()
    40  // for a function with multiple return values exactly matching the return
    41  // types of the current function.
    42  //
    43  // A 'VARDEF x' annotation in the instruction stream tells the liveness
    44  // analysis to behave as though the variable x is being initialized at that
    45  // point in the instruction stream. The VARDEF must appear before the
    46  // actual (multi-instruction) initialization, and it must also appear after
    47  // any uses of the previous value, if any. For example, if compiling:
    48  //
    49  //	x = x[1:]
    50  //
    51  // it is important to generate code like:
    52  //
    53  //	base, len, cap = pieces of x[1:]
    54  //	VARDEF x
    55  //	x = {base, len, cap}
    56  //
    57  // If instead the generated code looked like:
    58  //
    59  //	VARDEF x
    60  //	base, len, cap = pieces of x[1:]
    61  //	x = {base, len, cap}
    62  //
    63  // then the liveness analysis would decide the previous value of x was
    64  // unnecessary even though it is about to be used by the x[1:] computation.
    65  // Similarly, if the generated code looked like:
    66  //
    67  //	base, len, cap = pieces of x[1:]
    68  //	x = {base, len, cap}
    69  //	VARDEF x
    70  //
    71  // then the liveness analysis will not preserve the new value of x, because
    72  // the VARDEF appears to have "overwritten" it.
    73  //
    74  // VARDEF is a bit of a kludge to work around the fact that the instruction
    75  // stream is working on single-word values but the liveness analysis
    76  // wants to work on individual variables, which might be multi-word
    77  // aggregates. It might make sense at some point to look into letting
    78  // the liveness analysis work on single-word values as well, although
    79  // there are complications around interface values, slices, and strings,
    80  // all of which cannot be treated as individual words.
    81  //
    82  // VARKILL is the opposite of VARDEF: it marks a value as no longer needed,
    83  // even if its address has been taken. That is, a VARKILL annotation asserts
    84  // that its argument is certainly dead, for use when the liveness analysis
    85  // would not otherwise be able to deduce that fact.
    86  
    87  // BlockEffects summarizes the liveness effects on an SSA block.
    88  type BlockEffects struct {
    89  	lastbitmapindex int // for livenessepilogue
    90  
    91  	// Computed during livenessprologue using only the content of
    92  	// individual blocks:
    93  	//
    94  	//	uevar: upward exposed variables (used before set in block)
    95  	//	varkill: killed variables (set in block)
    96  	//	avarinit: addrtaken variables set or used (proof of initialization)
    97  	uevar    bvec
    98  	varkill  bvec
    99  	avarinit bvec
   100  
   101  	// Computed during livenesssolve using control flow information:
   102  	//
   103  	//	livein: variables live at block entry
   104  	//	liveout: variables live at block exit
   105  	//	avarinitany: addrtaken variables possibly initialized at block exit
   106  	//		(initialized in block or at exit from any predecessor block)
   107  	//	avarinitall: addrtaken variables certainly initialized at block exit
   108  	//		(initialized in block or at exit from all predecessor blocks)
   109  	livein      bvec
   110  	liveout     bvec
   111  	avarinitany bvec
   112  	avarinitall bvec
   113  }
   114  
   115  // A collection of global state used by liveness analysis.
   116  type Liveness struct {
   117  	fn         *Node
   118  	f          *ssa.Func
   119  	vars       []*Node
   120  	idx        map[*Node]int32
   121  	stkptrsize int64
   122  
   123  	be []BlockEffects
   124  
   125  	// stackMapIndex maps from safe points (i.e., CALLs) to their
   126  	// index within the stack maps.
   127  	stackMapIndex map[*ssa.Value]int
   128  
   129  	// An array with a bit vector for each safe point tracking live variables.
   130  	livevars []bvec
   131  
   132  	cache progeffectscache
   133  }
   134  
   135  type progeffectscache struct {
   136  	textavarinit []int32
   137  	retuevar     []int32
   138  	tailuevar    []int32
   139  	initialized  bool
   140  }
   141  
   142  // livenessShouldTrack reports whether the liveness analysis
   143  // should track the variable n.
   144  // We don't care about variables that have no pointers,
   145  // nor do we care about non-local variables,
   146  // nor do we care about empty structs (handled by the pointer check),
   147  // nor do we care about the fake PAUTOHEAP variables.
   148  func livenessShouldTrack(n *Node) bool {
   149  	return n.Op == ONAME && (n.Class() == PAUTO || n.Class() == PPARAM || n.Class() == PPARAMOUT) && types.Haspointers(n.Type)
   150  }
   151  
   152  // getvariables returns the list of on-stack variables that we need to track
   153  // and a map for looking up indices by *Node.
   154  func getvariables(fn *Node) ([]*Node, map[*Node]int32) {
   155  	var vars []*Node
   156  	for _, n := range fn.Func.Dcl {
   157  		if livenessShouldTrack(n) {
   158  			vars = append(vars, n)
   159  		}
   160  	}
   161  	idx := make(map[*Node]int32, len(vars))
   162  	for i, n := range vars {
   163  		idx[n] = int32(i)
   164  	}
   165  	return vars, idx
   166  }
   167  
   168  func (lv *Liveness) initcache() {
   169  	if lv.cache.initialized {
   170  		Fatalf("liveness cache initialized twice")
   171  		return
   172  	}
   173  	lv.cache.initialized = true
   174  
   175  	for i, node := range lv.vars {
   176  		switch node.Class() {
   177  		case PPARAM:
   178  			// A return instruction with a p.to is a tail return, which brings
   179  			// the stack pointer back up (if it ever went down) and then jumps
   180  			// to a new function entirely. That form of instruction must read
   181  			// all the parameters for correctness, and similarly it must not
   182  			// read the out arguments - they won't be set until the new
   183  			// function runs.
   184  
   185  			lv.cache.tailuevar = append(lv.cache.tailuevar, int32(i))
   186  
   187  			if node.Addrtaken() {
   188  				lv.cache.textavarinit = append(lv.cache.textavarinit, int32(i))
   189  			}
   190  
   191  		case PPARAMOUT:
   192  			// If the result had its address taken, it is being tracked
   193  			// by the avarinit code, which does not use uevar.
   194  			// If we added it to uevar too, we'd not see any kill
   195  			// and decide that the variable was live entry, which it is not.
   196  			// So only use uevar in the non-addrtaken case.
   197  			// The p.to.type == obj.TYPE_NONE limits the bvset to
   198  			// non-tail-call return instructions; see note below for details.
   199  			if !node.Addrtaken() {
   200  				lv.cache.retuevar = append(lv.cache.retuevar, int32(i))
   201  			}
   202  		}
   203  	}
   204  }
   205  
   206  // A liveEffect is a set of flags that describe an instruction's
   207  // liveness effects on a variable.
   208  //
   209  // The possible flags are:
   210  //	uevar - used by the instruction
   211  //	varkill - killed by the instruction
   212  //		for variables without address taken, means variable was set
   213  //		for variables with address taken, means variable was marked dead
   214  //	avarinit - initialized or referred to by the instruction,
   215  //		only for variables with address taken but not escaping to heap
   216  //
   217  // The avarinit output serves as a signal that the data has been
   218  // initialized, because any use of a variable must come after its
   219  // initialization.
   220  type liveEffect int
   221  
   222  const (
   223  	uevar liveEffect = 1 << iota
   224  	varkill
   225  	avarinit
   226  )
   227  
   228  // valueEffects returns the index of a variable in lv.vars and the
   229  // liveness effects v has on that variable.
   230  // If v does not affect any tracked variables, it returns -1, 0.
   231  func (lv *Liveness) valueEffects(v *ssa.Value) (int32, liveEffect) {
   232  	n, e := affectedNode(v)
   233  	if e == 0 || n == nil || n.Op != ONAME { // cheapest checks first
   234  		return -1, 0
   235  	}
   236  
   237  	// AllocFrame has dropped unused variables from
   238  	// lv.fn.Func.Dcl, but they might still be referenced by
   239  	// OpVarFoo pseudo-ops. Ignore them to prevent "lost track of
   240  	// variable" ICEs (issue 19632).
   241  	switch v.Op {
   242  	case ssa.OpVarDef, ssa.OpVarKill, ssa.OpVarLive, ssa.OpKeepAlive:
   243  		if !n.Name.Used() {
   244  			return -1, 0
   245  		}
   246  	}
   247  
   248  	var effect liveEffect
   249  	if n.Addrtaken() {
   250  		if v.Op != ssa.OpVarKill {
   251  			effect |= avarinit
   252  		}
   253  		if v.Op == ssa.OpVarDef || v.Op == ssa.OpVarKill {
   254  			effect |= varkill
   255  		}
   256  	} else {
   257  		// Read is a read, obviously.
   258  		// Addr by itself is also implicitly a read.
   259  		//
   260  		// Addr|Write means that the address is being taken
   261  		// but only so that the instruction can write to the value.
   262  		// It is not a read.
   263  
   264  		if e&ssa.SymRead != 0 || e&(ssa.SymAddr|ssa.SymWrite) == ssa.SymAddr {
   265  			effect |= uevar
   266  		}
   267  		if e&ssa.SymWrite != 0 && (!isfat(n.Type) || v.Op == ssa.OpVarDef) {
   268  			effect |= varkill
   269  		}
   270  	}
   271  
   272  	if effect == 0 {
   273  		return -1, 0
   274  	}
   275  
   276  	if pos, ok := lv.idx[n]; ok {
   277  		return pos, effect
   278  	}
   279  	return -1, 0
   280  }
   281  
   282  // affectedNode returns the *Node affected by v
   283  func affectedNode(v *ssa.Value) (*Node, ssa.SymEffect) {
   284  	// Special cases.
   285  	switch v.Op {
   286  	case ssa.OpLoadReg:
   287  		n, _ := AutoVar(v.Args[0])
   288  		return n, ssa.SymRead
   289  	case ssa.OpStoreReg:
   290  		n, _ := AutoVar(v)
   291  		return n, ssa.SymWrite
   292  
   293  	case ssa.OpVarLive:
   294  		return v.Aux.(*Node), ssa.SymRead
   295  	case ssa.OpVarDef, ssa.OpVarKill:
   296  		return v.Aux.(*Node), ssa.SymWrite
   297  	case ssa.OpKeepAlive:
   298  		n, _ := AutoVar(v.Args[0])
   299  		return n, ssa.SymRead
   300  	}
   301  
   302  	e := v.Op.SymEffect()
   303  	if e == 0 {
   304  		return nil, 0
   305  	}
   306  
   307  	var n *Node
   308  	switch a := v.Aux.(type) {
   309  	case nil, *obj.LSym:
   310  		// ok, but no node
   311  	case *Node:
   312  		n = a
   313  	default:
   314  		Fatalf("weird aux: %s", v.LongString())
   315  	}
   316  
   317  	return n, e
   318  }
   319  
   320  // Constructs a new liveness structure used to hold the global state of the
   321  // liveness computation. The cfg argument is a slice of *BasicBlocks and the
   322  // vars argument is a slice of *Nodes.
   323  func newliveness(fn *Node, f *ssa.Func, vars []*Node, idx map[*Node]int32, stkptrsize int64) *Liveness {
   324  	lv := &Liveness{
   325  		fn:         fn,
   326  		f:          f,
   327  		vars:       vars,
   328  		idx:        idx,
   329  		stkptrsize: stkptrsize,
   330  		be:         make([]BlockEffects, f.NumBlocks()),
   331  	}
   332  
   333  	nblocks := int32(len(f.Blocks))
   334  	nvars := int32(len(vars))
   335  	bulk := bvbulkalloc(nvars, nblocks*7)
   336  	for _, b := range f.Blocks {
   337  		be := lv.blockEffects(b)
   338  
   339  		be.uevar = bulk.next()
   340  		be.varkill = bulk.next()
   341  		be.livein = bulk.next()
   342  		be.liveout = bulk.next()
   343  		be.avarinit = bulk.next()
   344  		be.avarinitany = bulk.next()
   345  		be.avarinitall = bulk.next()
   346  	}
   347  	return lv
   348  }
   349  
   350  func (lv *Liveness) blockEffects(b *ssa.Block) *BlockEffects {
   351  	return &lv.be[b.ID]
   352  }
   353  
   354  // NOTE: The bitmap for a specific type t could be cached in t after
   355  // the first run and then simply copied into bv at the correct offset
   356  // on future calls with the same type t.
   357  func onebitwalktype1(t *types.Type, off int64, bv bvec) {
   358  	if t.Align > 0 && off&int64(t.Align-1) != 0 {
   359  		Fatalf("onebitwalktype1: invalid initial alignment, %v", t)
   360  	}
   361  
   362  	switch t.Etype {
   363  	case TINT8, TUINT8, TINT16, TUINT16,
   364  		TINT32, TUINT32, TINT64, TUINT64,
   365  		TINT, TUINT, TUINTPTR, TBOOL,
   366  		TFLOAT32, TFLOAT64, TCOMPLEX64, TCOMPLEX128:
   367  
   368  	case TPTR32, TPTR64, TUNSAFEPTR, TFUNC, TCHAN, TMAP:
   369  		if off&int64(Widthptr-1) != 0 {
   370  			Fatalf("onebitwalktype1: invalid alignment, %v", t)
   371  		}
   372  		bv.Set(int32(off / int64(Widthptr))) // pointer
   373  
   374  	case TSTRING:
   375  		// struct { byte *str; intgo len; }
   376  		if off&int64(Widthptr-1) != 0 {
   377  			Fatalf("onebitwalktype1: invalid alignment, %v", t)
   378  		}
   379  		bv.Set(int32(off / int64(Widthptr))) //pointer in first slot
   380  
   381  	case TINTER:
   382  		// struct { Itab *tab;	void *data; }
   383  		// or, when isnilinter(t)==true:
   384  		// struct { Type *type; void *data; }
   385  		if off&int64(Widthptr-1) != 0 {
   386  			Fatalf("onebitwalktype1: invalid alignment, %v", t)
   387  		}
   388  		bv.Set(int32(off / int64(Widthptr)))   // pointer in first slot
   389  		bv.Set(int32(off/int64(Widthptr) + 1)) // pointer in second slot
   390  
   391  	case TSLICE:
   392  		// struct { byte *array; uintgo len; uintgo cap; }
   393  		if off&int64(Widthptr-1) != 0 {
   394  			Fatalf("onebitwalktype1: invalid TARRAY alignment, %v", t)
   395  		}
   396  		bv.Set(int32(off / int64(Widthptr))) // pointer in first slot (BitsPointer)
   397  
   398  	case TARRAY:
   399  		elt := t.Elem()
   400  		if elt.Width == 0 {
   401  			// Short-circuit for #20739.
   402  			break
   403  		}
   404  		for i := int64(0); i < t.NumElem(); i++ {
   405  			onebitwalktype1(elt, off, bv)
   406  			off += elt.Width
   407  		}
   408  
   409  	case TSTRUCT:
   410  		for _, f := range t.Fields().Slice() {
   411  			onebitwalktype1(f.Type, off+f.Offset, bv)
   412  		}
   413  
   414  	default:
   415  		Fatalf("onebitwalktype1: unexpected type, %v", t)
   416  	}
   417  }
   418  
   419  // localWords returns the number of words of local variables.
   420  func (lv *Liveness) localWords() int32 {
   421  	return int32(lv.stkptrsize / int64(Widthptr))
   422  }
   423  
   424  // argWords returns the number of words of in and out arguments.
   425  func (lv *Liveness) argWords() int32 {
   426  	return int32(lv.fn.Type.ArgWidth() / int64(Widthptr))
   427  }
   428  
   429  // Generates live pointer value maps for arguments and local variables. The
   430  // this argument and the in arguments are always assumed live. The vars
   431  // argument is a slice of *Nodes.
   432  func (lv *Liveness) pointerMap(liveout bvec, vars []*Node, args, locals bvec) {
   433  	for i := int32(0); ; i++ {
   434  		i = liveout.Next(i)
   435  		if i < 0 {
   436  			break
   437  		}
   438  		node := vars[i]
   439  		switch node.Class() {
   440  		case PAUTO:
   441  			onebitwalktype1(node.Type, node.Xoffset+lv.stkptrsize, locals)
   442  
   443  		case PPARAM, PPARAMOUT:
   444  			onebitwalktype1(node.Type, node.Xoffset, args)
   445  		}
   446  	}
   447  }
   448  
   449  // Returns true for instructions that are safe points that must be annotated
   450  // with liveness information.
   451  func issafepoint(v *ssa.Value) bool {
   452  	return v.Op.IsCall()
   453  }
   454  
   455  // Initializes the sets for solving the live variables. Visits all the
   456  // instructions in each basic block to summarizes the information at each basic
   457  // block
   458  func (lv *Liveness) prologue() {
   459  	lv.initcache()
   460  
   461  	for _, b := range lv.f.Blocks {
   462  		be := lv.blockEffects(b)
   463  
   464  		// Walk the block instructions backward and update the block
   465  		// effects with the each prog effects.
   466  		for j := len(b.Values) - 1; j >= 0; j-- {
   467  			pos, e := lv.valueEffects(b.Values[j])
   468  			if e&varkill != 0 {
   469  				be.varkill.Set(pos)
   470  				be.uevar.Unset(pos)
   471  			}
   472  			if e&uevar != 0 {
   473  				be.uevar.Set(pos)
   474  			}
   475  		}
   476  
   477  		// Walk the block instructions forward to update avarinit bits.
   478  		// avarinit describes the effect at the end of the block, not the beginning.
   479  		for j := 0; j < len(b.Values); j++ {
   480  			pos, e := lv.valueEffects(b.Values[j])
   481  			if e&varkill != 0 {
   482  				be.avarinit.Unset(pos)
   483  			}
   484  			if e&avarinit != 0 {
   485  				be.avarinit.Set(pos)
   486  			}
   487  		}
   488  	}
   489  }
   490  
   491  // Solve the liveness dataflow equations.
   492  func (lv *Liveness) solve() {
   493  	// These temporary bitvectors exist to avoid successive allocations and
   494  	// frees within the loop.
   495  	newlivein := bvalloc(int32(len(lv.vars)))
   496  	newliveout := bvalloc(int32(len(lv.vars)))
   497  	any := bvalloc(int32(len(lv.vars)))
   498  	all := bvalloc(int32(len(lv.vars)))
   499  
   500  	// Push avarinitall, avarinitany forward.
   501  	// avarinitall says the addressed var is initialized along all paths reaching the block exit.
   502  	// avarinitany says the addressed var is initialized along some path reaching the block exit.
   503  	for _, b := range lv.f.Blocks {
   504  		be := lv.blockEffects(b)
   505  		if b == lv.f.Entry {
   506  			be.avarinitall.Copy(be.avarinit)
   507  		} else {
   508  			be.avarinitall.Clear()
   509  			be.avarinitall.Not()
   510  		}
   511  		be.avarinitany.Copy(be.avarinit)
   512  	}
   513  
   514  	// Walk blocks in the general direction of propagation (RPO
   515  	// for avarinit{any,all}, and PO for live{in,out}). This
   516  	// improves convergence.
   517  	po := lv.f.Postorder()
   518  
   519  	for change := true; change; {
   520  		change = false
   521  		for i := len(po) - 1; i >= 0; i-- {
   522  			b := po[i]
   523  			be := lv.blockEffects(b)
   524  			lv.avarinitanyall(b, any, all)
   525  
   526  			any.AndNot(any, be.varkill)
   527  			all.AndNot(all, be.varkill)
   528  			any.Or(any, be.avarinit)
   529  			all.Or(all, be.avarinit)
   530  			if !any.Eq(be.avarinitany) {
   531  				change = true
   532  				be.avarinitany.Copy(any)
   533  			}
   534  
   535  			if !all.Eq(be.avarinitall) {
   536  				change = true
   537  				be.avarinitall.Copy(all)
   538  			}
   539  		}
   540  	}
   541  
   542  	// Iterate through the blocks in reverse round-robin fashion. A work
   543  	// queue might be slightly faster. As is, the number of iterations is
   544  	// so low that it hardly seems to be worth the complexity.
   545  
   546  	for change := true; change; {
   547  		change = false
   548  		for _, b := range po {
   549  			be := lv.blockEffects(b)
   550  
   551  			newliveout.Clear()
   552  			switch b.Kind {
   553  			case ssa.BlockRet:
   554  				for _, pos := range lv.cache.retuevar {
   555  					newliveout.Set(pos)
   556  				}
   557  			case ssa.BlockRetJmp:
   558  				for _, pos := range lv.cache.tailuevar {
   559  					newliveout.Set(pos)
   560  				}
   561  			case ssa.BlockExit:
   562  				// nothing to do
   563  			default:
   564  				// A variable is live on output from this block
   565  				// if it is live on input to some successor.
   566  				//
   567  				// out[b] = \bigcup_{s \in succ[b]} in[s]
   568  				newliveout.Copy(lv.blockEffects(b.Succs[0].Block()).livein)
   569  				for _, succ := range b.Succs[1:] {
   570  					newliveout.Or(newliveout, lv.blockEffects(succ.Block()).livein)
   571  				}
   572  			}
   573  
   574  			if !be.liveout.Eq(newliveout) {
   575  				change = true
   576  				be.liveout.Copy(newliveout)
   577  			}
   578  
   579  			// A variable is live on input to this block
   580  			// if it is live on output from this block and
   581  			// not set by the code in this block.
   582  			//
   583  			// in[b] = uevar[b] \cup (out[b] \setminus varkill[b])
   584  			newlivein.AndNot(be.liveout, be.varkill)
   585  			be.livein.Or(newlivein, be.uevar)
   586  		}
   587  	}
   588  }
   589  
   590  // Visits all instructions in a basic block and computes a bit vector of live
   591  // variables at each safe point locations.
   592  func (lv *Liveness) epilogue() {
   593  	nvars := int32(len(lv.vars))
   594  	liveout := bvalloc(nvars)
   595  	any := bvalloc(nvars)
   596  	all := bvalloc(nvars)
   597  	livedefer := bvalloc(nvars) // always-live variables
   598  
   599  	// If there is a defer (that could recover), then all output
   600  	// parameters are live all the time.  In addition, any locals
   601  	// that are pointers to heap-allocated output parameters are
   602  	// also always live (post-deferreturn code needs these
   603  	// pointers to copy values back to the stack).
   604  	// TODO: if the output parameter is heap-allocated, then we
   605  	// don't need to keep the stack copy live?
   606  	if lv.fn.Func.HasDefer() {
   607  		for i, n := range lv.vars {
   608  			if n.Class() == PPARAMOUT {
   609  				if n.IsOutputParamHeapAddr() {
   610  					// Just to be paranoid.  Heap addresses are PAUTOs.
   611  					Fatalf("variable %v both output param and heap output param", n)
   612  				}
   613  				if n.Name.Param.Heapaddr != nil {
   614  					// If this variable moved to the heap, then
   615  					// its stack copy is not live.
   616  					continue
   617  				}
   618  				// Note: zeroing is handled by zeroResults in walk.go.
   619  				livedefer.Set(int32(i))
   620  			}
   621  			if n.IsOutputParamHeapAddr() {
   622  				n.Name.SetNeedzero(true)
   623  				livedefer.Set(int32(i))
   624  			}
   625  		}
   626  	}
   627  
   628  	{
   629  		// Reserve an entry for function entry.
   630  		live := bvalloc(nvars)
   631  		for _, pos := range lv.cache.textavarinit {
   632  			live.Set(pos)
   633  		}
   634  		lv.livevars = append(lv.livevars, live)
   635  	}
   636  
   637  	for _, b := range lv.f.Blocks {
   638  		be := lv.blockEffects(b)
   639  
   640  		// Compute avarinitany and avarinitall for entry to block.
   641  		// This duplicates information known during livenesssolve
   642  		// but avoids storing two more vectors for each block.
   643  		lv.avarinitanyall(b, any, all)
   644  
   645  		// Walk forward through the basic block instructions and
   646  		// allocate liveness maps for those instructions that need them.
   647  		// Seed the maps with information about the addrtaken variables.
   648  		for _, v := range b.Values {
   649  			pos, e := lv.valueEffects(v)
   650  			if e&varkill != 0 {
   651  				any.Unset(pos)
   652  				all.Unset(pos)
   653  			}
   654  			if e&avarinit != 0 {
   655  				any.Set(pos)
   656  				all.Set(pos)
   657  			}
   658  
   659  			if !issafepoint(v) {
   660  				continue
   661  			}
   662  
   663  			// Annotate ambiguously live variables so that they can
   664  			// be zeroed at function entry and at VARKILL points.
   665  			// liveout is dead here and used as a temporary.
   666  			liveout.AndNot(any, all)
   667  			if !liveout.IsEmpty() {
   668  				for pos := int32(0); pos < liveout.n; pos++ {
   669  					if !liveout.Get(pos) {
   670  						continue
   671  					}
   672  					all.Set(pos) // silence future warnings in this block
   673  					n := lv.vars[pos]
   674  					if !n.Name.Needzero() {
   675  						n.Name.SetNeedzero(true)
   676  						if debuglive >= 1 {
   677  							Warnl(v.Pos, "%v: %L is ambiguously live", lv.fn.Func.Nname, n)
   678  						}
   679  					}
   680  				}
   681  			}
   682  
   683  			// Live stuff first.
   684  			live := bvalloc(nvars)
   685  			live.Copy(any)
   686  			lv.livevars = append(lv.livevars, live)
   687  		}
   688  
   689  		be.lastbitmapindex = len(lv.livevars) - 1
   690  	}
   691  
   692  	for _, b := range lv.f.Blocks {
   693  		be := lv.blockEffects(b)
   694  
   695  		// walk backward, construct maps at each safe point
   696  		index := int32(be.lastbitmapindex)
   697  		if index < 0 {
   698  			// the first block we encounter should have the ATEXT so
   699  			// at no point should pos ever be less than zero.
   700  			Fatalf("livenessepilogue")
   701  		}
   702  
   703  		liveout.Copy(be.liveout)
   704  		for i := len(b.Values) - 1; i >= 0; i-- {
   705  			v := b.Values[i]
   706  
   707  			if issafepoint(v) {
   708  				// Found an interesting instruction, record the
   709  				// corresponding liveness information.
   710  
   711  				live := lv.livevars[index]
   712  				live.Or(live, liveout)
   713  				live.Or(live, livedefer) // only for non-entry safe points
   714  				index--
   715  			}
   716  
   717  			// Update liveness information.
   718  			pos, e := lv.valueEffects(v)
   719  			if e&varkill != 0 {
   720  				liveout.Unset(pos)
   721  			}
   722  			if e&uevar != 0 {
   723  				liveout.Set(pos)
   724  			}
   725  		}
   726  
   727  		if b == lv.f.Entry {
   728  			if index != 0 {
   729  				Fatalf("bad index for entry point: %v", index)
   730  			}
   731  
   732  			// Record live variables.
   733  			live := lv.livevars[index]
   734  			live.Or(live, liveout)
   735  		}
   736  	}
   737  
   738  	// Useful sanity check: on entry to the function,
   739  	// the only things that can possibly be live are the
   740  	// input parameters.
   741  	for j, n := range lv.vars {
   742  		if n.Class() != PPARAM && lv.livevars[0].Get(int32(j)) {
   743  			Fatalf("internal error: %v %L recorded as live on entry", lv.fn.Func.Nname, n)
   744  		}
   745  	}
   746  }
   747  
   748  func (lv *Liveness) clobber() {
   749  	// The clobberdead experiment inserts code to clobber all the dead variables (locals and args)
   750  	// before and after every safepoint. This experiment is useful for debugging the generation
   751  	// of live pointer bitmaps.
   752  	if objabi.Clobberdead_enabled == 0 {
   753  		return
   754  	}
   755  	var varSize int64
   756  	for _, n := range lv.vars {
   757  		varSize += n.Type.Size()
   758  	}
   759  	if len(lv.livevars) > 1000 || varSize > 10000 {
   760  		// Be careful to avoid doing too much work.
   761  		// Bail if >1000 safepoints or >10000 bytes of variables.
   762  		// Otherwise, giant functions make this experiment generate too much code.
   763  		return
   764  	}
   765  	if h := os.Getenv("GOCLOBBERDEADHASH"); h != "" {
   766  		// Clobber only functions where the hash of the function name matches a pattern.
   767  		// Useful for binary searching for a miscompiled function.
   768  		hstr := ""
   769  		for _, b := range sha1.Sum([]byte(lv.fn.funcname())) {
   770  			hstr += fmt.Sprintf("%08b", b)
   771  		}
   772  		if !strings.HasSuffix(hstr, h) {
   773  			return
   774  		}
   775  		fmt.Printf("\t\t\tCLOBBERDEAD %s\n", lv.fn.funcname())
   776  	}
   777  	if lv.f.Name == "forkAndExecInChild" {
   778  		// forkAndExecInChild calls vfork (on linux/amd64, anyway).
   779  		// The code we add here clobbers parts of the stack in the child.
   780  		// When the parent resumes, it is using the same stack frame. But the
   781  		// child has clobbered stack variables that the parent needs. Boom!
   782  		// In particular, the sys argument gets clobbered.
   783  		// Note to self: GOCLOBBERDEADHASH=011100101110
   784  		return
   785  	}
   786  
   787  	var oldSched []*ssa.Value
   788  	for _, b := range lv.f.Blocks {
   789  		// Copy block's values to a temporary.
   790  		oldSched = append(oldSched[:0], b.Values...)
   791  		b.Values = b.Values[:0]
   792  
   793  		// Clobber all dead variables at entry.
   794  		if b == lv.f.Entry {
   795  			for len(oldSched) > 0 && len(oldSched[0].Args) == 0 {
   796  				// Skip argless ops. We need to skip at least
   797  				// the lowered ClosurePtr op, because it
   798  				// really wants to be first. This will also
   799  				// skip ops like InitMem and SP, which are ok.
   800  				b.Values = append(b.Values, oldSched[0])
   801  				oldSched = oldSched[1:]
   802  			}
   803  			clobber(lv, b, lv.livevars[0])
   804  		}
   805  
   806  		// Copy values into schedule, adding clobbering around safepoints.
   807  		for _, v := range oldSched {
   808  			if !issafepoint(v) {
   809  				b.Values = append(b.Values, v)
   810  				continue
   811  			}
   812  			before := true
   813  			if v.Op.IsCall() && v.Aux != nil && v.Aux.(*obj.LSym) == typedmemmove {
   814  				// Can't put clobber code before the call to typedmemmove.
   815  				// The variable to-be-copied is marked as dead
   816  				// at the callsite. That is ok, though, as typedmemmove
   817  				// is marked as nosplit, and the first thing it does
   818  				// is to call memmove (also nosplit), after which
   819  				// the source value is dead.
   820  				// See issue 16026.
   821  				before = false
   822  			}
   823  			if before {
   824  				clobber(lv, b, lv.livevars[lv.stackMapIndex[v]])
   825  			}
   826  			b.Values = append(b.Values, v)
   827  			clobber(lv, b, lv.livevars[lv.stackMapIndex[v]])
   828  		}
   829  	}
   830  }
   831  
   832  // clobber generates code to clobber all dead variables (those not marked in live).
   833  // Clobbering instructions are added to the end of b.Values.
   834  func clobber(lv *Liveness, b *ssa.Block, live bvec) {
   835  	for i, n := range lv.vars {
   836  		if !live.Get(int32(i)) {
   837  			clobberVar(b, n)
   838  		}
   839  	}
   840  }
   841  
   842  // clobberVar generates code to trash the pointers in v.
   843  // Clobbering instructions are added to the end of b.Values.
   844  func clobberVar(b *ssa.Block, v *Node) {
   845  	clobberWalk(b, v, 0, v.Type)
   846  }
   847  
   848  // b = block to which we append instructions
   849  // v = variable
   850  // offset = offset of (sub-portion of) variable to clobber (in bytes)
   851  // t = type of sub-portion of v.
   852  func clobberWalk(b *ssa.Block, v *Node, offset int64, t *types.Type) {
   853  	if !types.Haspointers(t) {
   854  		return
   855  	}
   856  	switch t.Etype {
   857  	case TPTR32,
   858  		TPTR64,
   859  		TUNSAFEPTR,
   860  		TFUNC,
   861  		TCHAN,
   862  		TMAP:
   863  		clobberPtr(b, v, offset)
   864  
   865  	case TSTRING:
   866  		// struct { byte *str; int len; }
   867  		clobberPtr(b, v, offset)
   868  
   869  	case TINTER:
   870  		// struct { Itab *tab; void *data; }
   871  		// or, when isnilinter(t)==true:
   872  		// struct { Type *type; void *data; }
   873  		clobberPtr(b, v, offset)
   874  		clobberPtr(b, v, offset+int64(Widthptr))
   875  
   876  	case TSLICE:
   877  		// struct { byte *array; int len; int cap; }
   878  		clobberPtr(b, v, offset)
   879  
   880  	case TARRAY:
   881  		for i := int64(0); i < t.NumElem(); i++ {
   882  			clobberWalk(b, v, offset+i*t.Elem().Size(), t.Elem())
   883  		}
   884  
   885  	case TSTRUCT:
   886  		for _, t1 := range t.Fields().Slice() {
   887  			clobberWalk(b, v, offset+t1.Offset, t1.Type)
   888  		}
   889  
   890  	default:
   891  		Fatalf("clobberWalk: unexpected type, %v", t)
   892  	}
   893  }
   894  
   895  // clobberPtr generates a clobber of the pointer at offset offset in v.
   896  // The clobber instruction is added at the end of b.
   897  func clobberPtr(b *ssa.Block, v *Node, offset int64) {
   898  	b.NewValue0IA(src.NoXPos, ssa.OpClobber, types.TypeVoid, offset, v)
   899  }
   900  
   901  func (lv *Liveness) avarinitanyall(b *ssa.Block, any, all bvec) {
   902  	if len(b.Preds) == 0 {
   903  		any.Clear()
   904  		all.Clear()
   905  		for _, pos := range lv.cache.textavarinit {
   906  			any.Set(pos)
   907  			all.Set(pos)
   908  		}
   909  		return
   910  	}
   911  
   912  	be := lv.blockEffects(b.Preds[0].Block())
   913  	any.Copy(be.avarinitany)
   914  	all.Copy(be.avarinitall)
   915  
   916  	for _, pred := range b.Preds[1:] {
   917  		be := lv.blockEffects(pred.Block())
   918  		any.Or(any, be.avarinitany)
   919  		all.And(all, be.avarinitall)
   920  	}
   921  }
   922  
   923  // FNV-1 hash function constants.
   924  const (
   925  	H0 = 2166136261
   926  	Hp = 16777619
   927  )
   928  
   929  func hashbitmap(h uint32, bv bvec) uint32 {
   930  	n := int((bv.n + 31) / 32)
   931  	for i := 0; i < n; i++ {
   932  		w := bv.b[i]
   933  		h = (h * Hp) ^ (w & 0xff)
   934  		h = (h * Hp) ^ ((w >> 8) & 0xff)
   935  		h = (h * Hp) ^ ((w >> 16) & 0xff)
   936  		h = (h * Hp) ^ ((w >> 24) & 0xff)
   937  	}
   938  
   939  	return h
   940  }
   941  
   942  // Compact liveness information by coalescing identical per-call-site bitmaps.
   943  // The merging only happens for a single function, not across the entire binary.
   944  //
   945  // There are actually two lists of bitmaps, one list for the local variables and one
   946  // list for the function arguments. Both lists are indexed by the same PCDATA
   947  // index, so the corresponding pairs must be considered together when
   948  // merging duplicates. The argument bitmaps change much less often during
   949  // function execution than the local variable bitmaps, so it is possible that
   950  // we could introduce a separate PCDATA index for arguments vs locals and
   951  // then compact the set of argument bitmaps separately from the set of
   952  // local variable bitmaps. As of 2014-04-02, doing this to the godoc binary
   953  // is actually a net loss: we save about 50k of argument bitmaps but the new
   954  // PCDATA tables cost about 100k. So for now we keep using a single index for
   955  // both bitmap lists.
   956  func (lv *Liveness) compact() {
   957  	// Linear probing hash table of bitmaps seen so far.
   958  	// The hash table has 4n entries to keep the linear
   959  	// scan short. An entry of -1 indicates an empty slot.
   960  	n := len(lv.livevars)
   961  
   962  	tablesize := 4 * n
   963  	table := make([]int, tablesize)
   964  	for i := range table {
   965  		table[i] = -1
   966  	}
   967  
   968  	// remap[i] = the new index of the old bit vector #i.
   969  	remap := make([]int, n)
   970  	for i := range remap {
   971  		remap[i] = -1
   972  	}
   973  	uniq := 0 // unique tables found so far
   974  
   975  	// Consider bit vectors in turn.
   976  	// If new, assign next number using uniq,
   977  	// record in remap, record in lv.livevars
   978  	// under the new index, and add entry to hash table.
   979  	// If already seen, record earlier index in remap.
   980  Outer:
   981  	for i, live := range lv.livevars {
   982  		h := hashbitmap(H0, live) % uint32(tablesize)
   983  
   984  		for {
   985  			j := table[h]
   986  			if j < 0 {
   987  				break
   988  			}
   989  			jlive := lv.livevars[j]
   990  			if live.Eq(jlive) {
   991  				remap[i] = j
   992  				continue Outer
   993  			}
   994  
   995  			h++
   996  			if h == uint32(tablesize) {
   997  				h = 0
   998  			}
   999  		}
  1000  
  1001  		table[h] = uniq
  1002  		remap[i] = uniq
  1003  		lv.livevars[uniq] = live
  1004  		uniq++
  1005  	}
  1006  
  1007  	// We've already reordered lv.livevars[0:uniq]. Clear the
  1008  	// pointers later in the array so they can be GC'd.
  1009  	tail := lv.livevars[uniq:]
  1010  	for i := range tail { // memclr loop pattern
  1011  		tail[i] = bvec{}
  1012  	}
  1013  	lv.livevars = lv.livevars[:uniq]
  1014  
  1015  	// Record compacted stack map indexes for each value.
  1016  	// These will later become PCDATA instructions.
  1017  	lv.showlive(nil, lv.livevars[0])
  1018  	pos := 1
  1019  	lv.stackMapIndex = make(map[*ssa.Value]int)
  1020  	for _, b := range lv.f.Blocks {
  1021  		for _, v := range b.Values {
  1022  			if issafepoint(v) {
  1023  				lv.showlive(v, lv.livevars[remap[pos]])
  1024  				lv.stackMapIndex[v] = int(remap[pos])
  1025  				pos++
  1026  			}
  1027  		}
  1028  	}
  1029  }
  1030  
  1031  func (lv *Liveness) showlive(v *ssa.Value, live bvec) {
  1032  	if debuglive == 0 || lv.fn.funcname() == "init" || strings.HasPrefix(lv.fn.funcname(), ".") {
  1033  		return
  1034  	}
  1035  	if live.IsEmpty() {
  1036  		return
  1037  	}
  1038  
  1039  	pos := lv.fn.Func.Nname.Pos
  1040  	if v != nil {
  1041  		pos = v.Pos
  1042  	}
  1043  
  1044  	s := "live at "
  1045  	if v == nil {
  1046  		s += fmt.Sprintf("entry to %s:", lv.fn.funcname())
  1047  	} else if sym, ok := v.Aux.(*obj.LSym); ok {
  1048  		fn := sym.Name
  1049  		if pos := strings.Index(fn, "."); pos >= 0 {
  1050  			fn = fn[pos+1:]
  1051  		}
  1052  		s += fmt.Sprintf("call to %s:", fn)
  1053  	} else {
  1054  		s += "indirect call:"
  1055  	}
  1056  
  1057  	for j, n := range lv.vars {
  1058  		if live.Get(int32(j)) {
  1059  			s += fmt.Sprintf(" %v", n)
  1060  		}
  1061  	}
  1062  
  1063  	Warnl(pos, s)
  1064  }
  1065  
  1066  func (lv *Liveness) printbvec(printed bool, name string, live bvec) bool {
  1067  	started := false
  1068  	for i, n := range lv.vars {
  1069  		if !live.Get(int32(i)) {
  1070  			continue
  1071  		}
  1072  		if !started {
  1073  			if !printed {
  1074  				fmt.Printf("\t")
  1075  			} else {
  1076  				fmt.Printf(" ")
  1077  			}
  1078  			started = true
  1079  			printed = true
  1080  			fmt.Printf("%s=", name)
  1081  		} else {
  1082  			fmt.Printf(",")
  1083  		}
  1084  
  1085  		fmt.Printf("%s", n.Sym.Name)
  1086  	}
  1087  	return printed
  1088  }
  1089  
  1090  // printeffect is like printbvec, but for a single variable.
  1091  func (lv *Liveness) printeffect(printed bool, name string, pos int32, x bool) bool {
  1092  	if !x {
  1093  		return printed
  1094  	}
  1095  	if !printed {
  1096  		fmt.Printf("\t")
  1097  	} else {
  1098  		fmt.Printf(" ")
  1099  	}
  1100  	fmt.Printf("%s=%s", name, lv.vars[pos].Sym.Name)
  1101  	return true
  1102  }
  1103  
  1104  // Prints the computed liveness information and inputs, for debugging.
  1105  // This format synthesizes the information used during the multiple passes
  1106  // into a single presentation.
  1107  func (lv *Liveness) printDebug() {
  1108  	fmt.Printf("liveness: %s\n", lv.fn.funcname())
  1109  
  1110  	pcdata := 0
  1111  	for i, b := range lv.f.Blocks {
  1112  		if i > 0 {
  1113  			fmt.Printf("\n")
  1114  		}
  1115  
  1116  		// bb#0 pred=1,2 succ=3,4
  1117  		fmt.Printf("bb#%d pred=", b.ID)
  1118  		for j, pred := range b.Preds {
  1119  			if j > 0 {
  1120  				fmt.Printf(",")
  1121  			}
  1122  			fmt.Printf("%d", pred.Block().ID)
  1123  		}
  1124  		fmt.Printf(" succ=")
  1125  		for j, succ := range b.Succs {
  1126  			if j > 0 {
  1127  				fmt.Printf(",")
  1128  			}
  1129  			fmt.Printf("%d", succ.Block().ID)
  1130  		}
  1131  		fmt.Printf("\n")
  1132  
  1133  		be := lv.blockEffects(b)
  1134  
  1135  		// initial settings
  1136  		printed := false
  1137  		printed = lv.printbvec(printed, "uevar", be.uevar)
  1138  		printed = lv.printbvec(printed, "livein", be.livein)
  1139  		if printed {
  1140  			fmt.Printf("\n")
  1141  		}
  1142  
  1143  		// program listing, with individual effects listed
  1144  
  1145  		if b == lv.f.Entry {
  1146  			live := lv.livevars[pcdata]
  1147  			fmt.Printf("(%s) function entry\n", linestr(lv.fn.Func.Nname.Pos))
  1148  			fmt.Printf("\tlive=")
  1149  			printed = false
  1150  			for j, n := range lv.vars {
  1151  				if !live.Get(int32(j)) {
  1152  					continue
  1153  				}
  1154  				if printed {
  1155  					fmt.Printf(",")
  1156  				}
  1157  				fmt.Printf("%v", n)
  1158  				printed = true
  1159  			}
  1160  			fmt.Printf("\n")
  1161  		}
  1162  
  1163  		for _, v := range b.Values {
  1164  			fmt.Printf("(%s) %v\n", linestr(v.Pos), v.LongString())
  1165  
  1166  			if pos, ok := lv.stackMapIndex[v]; ok {
  1167  				pcdata = pos
  1168  			}
  1169  
  1170  			pos, effect := lv.valueEffects(v)
  1171  			printed = false
  1172  			printed = lv.printeffect(printed, "uevar", pos, effect&uevar != 0)
  1173  			printed = lv.printeffect(printed, "varkill", pos, effect&varkill != 0)
  1174  			printed = lv.printeffect(printed, "avarinit", pos, effect&avarinit != 0)
  1175  			if printed {
  1176  				fmt.Printf("\n")
  1177  			}
  1178  
  1179  			if !issafepoint(v) {
  1180  				continue
  1181  			}
  1182  
  1183  			live := lv.livevars[pcdata]
  1184  			fmt.Printf("\tlive=")
  1185  			printed = false
  1186  			for j, n := range lv.vars {
  1187  				if !live.Get(int32(j)) {
  1188  					continue
  1189  				}
  1190  				if printed {
  1191  					fmt.Printf(",")
  1192  				}
  1193  				fmt.Printf("%v", n)
  1194  				printed = true
  1195  			}
  1196  			fmt.Printf("\n")
  1197  		}
  1198  
  1199  		// bb bitsets
  1200  		fmt.Printf("end\n")
  1201  		printed = false
  1202  		printed = lv.printbvec(printed, "varkill", be.varkill)
  1203  		printed = lv.printbvec(printed, "liveout", be.liveout)
  1204  		printed = lv.printbvec(printed, "avarinit", be.avarinit)
  1205  		printed = lv.printbvec(printed, "avarinitany", be.avarinitany)
  1206  		printed = lv.printbvec(printed, "avarinitall", be.avarinitall)
  1207  		if printed {
  1208  			fmt.Printf("\n")
  1209  		}
  1210  	}
  1211  
  1212  	fmt.Printf("\n")
  1213  }
  1214  
  1215  // Dumps a slice of bitmaps to a symbol as a sequence of uint32 values. The
  1216  // first word dumped is the total number of bitmaps. The second word is the
  1217  // length of the bitmaps. All bitmaps are assumed to be of equal length. The
  1218  // remaining bytes are the raw bitmaps.
  1219  func (lv *Liveness) emit(argssym, livesym *obj.LSym) {
  1220  	args := bvalloc(lv.argWords())
  1221  	aoff := duint32(argssym, 0, uint32(len(lv.livevars))) // number of bitmaps
  1222  	aoff = duint32(argssym, aoff, uint32(args.n))         // number of bits in each bitmap
  1223  
  1224  	locals := bvalloc(lv.localWords())
  1225  	loff := duint32(livesym, 0, uint32(len(lv.livevars))) // number of bitmaps
  1226  	loff = duint32(livesym, loff, uint32(locals.n))       // number of bits in each bitmap
  1227  
  1228  	for _, live := range lv.livevars {
  1229  		args.Clear()
  1230  		locals.Clear()
  1231  
  1232  		lv.pointerMap(live, lv.vars, args, locals)
  1233  
  1234  		aoff = dbvec(argssym, aoff, args)
  1235  		loff = dbvec(livesym, loff, locals)
  1236  	}
  1237  
  1238  	// Give these LSyms content-addressable names,
  1239  	// so that they can be de-duplicated.
  1240  	// This provides significant binary size savings.
  1241  	// It is safe to rename these LSyms because
  1242  	// they are tracked separately from ctxt.hash.
  1243  	argssym.Name = fmt.Sprintf("gclocals·%x", md5.Sum(argssym.P))
  1244  	livesym.Name = fmt.Sprintf("gclocals·%x", md5.Sum(livesym.P))
  1245  }
  1246  
  1247  // Entry pointer for liveness analysis. Solves for the liveness of
  1248  // pointer variables in the function and emits a runtime data
  1249  // structure read by the garbage collector.
  1250  // Returns a map from GC safe points to their corresponding stack map index.
  1251  func liveness(e *ssafn, f *ssa.Func) map[*ssa.Value]int {
  1252  	// Construct the global liveness state.
  1253  	vars, idx := getvariables(e.curfn)
  1254  	lv := newliveness(e.curfn, f, vars, idx, e.stkptrsize)
  1255  
  1256  	// Run the dataflow framework.
  1257  	lv.prologue()
  1258  	lv.solve()
  1259  	lv.epilogue()
  1260  	lv.compact()
  1261  	lv.clobber()
  1262  	if debuglive >= 2 {
  1263  		lv.printDebug()
  1264  	}
  1265  
  1266  	// Emit the live pointer map data structures
  1267  	if ls := e.curfn.Func.lsym; ls != nil {
  1268  		lv.emit(&ls.Func.GCArgs, &ls.Func.GCLocals)
  1269  	}
  1270  	return lv.stackMapIndex
  1271  }