sync.mx raw

   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 pkgbits
   6  
   7  import (
   8  	"fmt"
   9  	"runtime"
  10  	"bytes"
  11  )
  12  
  13  // fmtFrames formats a backtrace for reporting reader/writer desyncs.
  14  func fmtFrames(pcs ...uintptr) [][]byte {
  15  	res := [][]byte{:0:len(pcs)}
  16  	walkFrames(pcs, func(file []byte, line int, name []byte, offset uintptr) {
  17  		// Trim package from function name. It's just redundant noise.
  18  		name = bytes.TrimPrefix(name, "cmd/compile/internal/noder.")
  19  
  20  		res = append(res, fmt.Sprintf("%s:%v: %s +0x%v", file, line, name, offset))
  21  	})
  22  	return res
  23  }
  24  
  25  type frameVisitor func(file []byte, line int, name []byte, offset uintptr)
  26  
  27  // walkFrames calls visit for each call frame represented by pcs.
  28  //
  29  // pcs should be a slice of PCs, as returned by runtime.Callers.
  30  func walkFrames(pcs []uintptr, visit frameVisitor) {
  31  	if len(pcs) == 0 {
  32  		return
  33  	}
  34  
  35  	frames := runtime.CallersFrames(pcs)
  36  	for {
  37  		frame, more := frames.Next()
  38  		visit(frame.File, frame.Line, frame.Function, frame.PC-frame.Entry)
  39  		if !more {
  40  			return
  41  		}
  42  	}
  43  }
  44  
  45  // SyncMarker is an enum type that represents markers that may be
  46  // written to export data to ensure the reader and writer stay
  47  // synchronized.
  48  type SyncMarker int
  49  
  50  //go:generate stringer -type=SyncMarker -trimprefix=Sync
  51  
  52  const (
  53  	_ SyncMarker = iota
  54  
  55  	// Public markers (known to go/types importers).
  56  
  57  	// Low-level coding markers.
  58  	SyncEOF
  59  	SyncBool
  60  	SyncInt64
  61  	SyncUint64
  62  	SyncString
  63  	SyncValue
  64  	SyncVal
  65  	SyncRelocs
  66  	SyncReloc
  67  	SyncUseReloc
  68  
  69  	// Higher-level object and type markers.
  70  	SyncPublic
  71  	SyncPos
  72  	SyncPosBase
  73  	SyncObject
  74  	SyncObject1
  75  	SyncPkg
  76  	SyncPkgDef
  77  	SyncMethod
  78  	SyncType
  79  	SyncTypeIdx
  80  	SyncTypeParamNames
  81  	SyncSignature
  82  	SyncParams
  83  	SyncParam
  84  	SyncCodeObj
  85  	SyncSym
  86  	SyncLocalIdent
  87  	SyncSelector
  88  
  89  	// Private markers (only known to cmd/compile).
  90  	SyncPrivate
  91  
  92  	SyncFuncExt
  93  	SyncVarExt
  94  	SyncTypeExt
  95  	SyncPragma
  96  
  97  	SyncExprList
  98  	SyncExprs
  99  	SyncExpr
 100  	SyncExprType
 101  	SyncAssign
 102  	SyncOp
 103  	SyncFuncLit
 104  	SyncCompLit
 105  
 106  	SyncDecl
 107  	SyncFuncBody
 108  	SyncOpenScope
 109  	SyncCloseScope
 110  	SyncCloseAnotherScope
 111  	SyncDeclNames
 112  	SyncDeclName
 113  
 114  	SyncStmts
 115  	SyncBlockStmt
 116  	SyncIfStmt
 117  	SyncForStmt
 118  	SyncSwitchStmt
 119  	SyncRangeStmt
 120  	SyncCaseClause
 121  	SyncCommClause
 122  	SyncSelectStmt
 123  	SyncDecls
 124  	SyncLabeledStmt
 125  	SyncUseObjLocal
 126  	SyncAddLocal
 127  	SyncLinkname
 128  	SyncStmt1
 129  	SyncStmtsEnd
 130  	SyncLabel
 131  	SyncOptLabel
 132  
 133  	SyncMultiExpr
 134  	SyncRType
 135  	SyncConvRTTI
 136  )
 137