| // Copyright 2021 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package pkgbits | |
| import ( | |
| "fmt" | |
| "runtime" | |
| "strings" | |
| ) | |
| // fmtFrames formats a backtrace for reporting reader/writer desyncs. | |
| func fmtFrames(pcs ...uintptr) []string { | |
| res := make([]string, 0, len(pcs)) | |
| walkFrames(pcs, func(file string, line int, name string, offset uintptr) { | |
| // Trim package from function name. It's just redundant noise. | |
| name = strings.TrimPrefix(name, "cmd/compile/internal/noder.") | |
| res = append(res, fmt.Sprintf("%s:%v: %s +0x%v", file, line, name, offset)) | |
| }) | |
| return res | |
| } | |
| type frameVisitor func(file string, line int, name string, offset uintptr) | |
| // walkFrames calls visit for each call frame represented by pcs. | |
| // | |
| // pcs should be a slice of PCs, as returned by runtime.Callers. | |
| func walkFrames(pcs []uintptr, visit frameVisitor) { | |
| if len(pcs) == 0 { | |
| return | |
| } | |
| frames := runtime.CallersFrames(pcs) | |
| for { | |
| frame, more := frames.Next() | |
| visit(frame.File, frame.Line, frame.Function, frame.PC-frame.Entry) | |
| if !more { | |
| return | |
| } | |
| } | |
| } | |
| // SyncMarker is an enum type that represents markers that may be | |
| // written to export data to ensure the reader and writer stay | |
| // synchronized. | |
| type SyncMarker int | |
| //go:generate stringer -type=SyncMarker -trimprefix=Sync | |
| const ( | |
| _ SyncMarker = iota | |
| // Public markers (known to go/types importers). | |
| // Low-level coding markers. | |
| SyncEOF | |
| SyncBool | |
| SyncInt64 | |
| SyncUint64 | |
| SyncString | |
| SyncValue | |
| SyncVal | |
| SyncRelocs | |
| SyncReloc | |
| SyncUseReloc | |
| // Higher-level object and type markers. | |
| SyncPublic | |
| SyncPos | |
| SyncPosBase | |
| SyncObject | |
| SyncObject1 | |
| SyncPkg | |
| SyncPkgDef | |
| SyncMethod | |
| SyncType | |
| SyncTypeIdx | |
| SyncTypeParamNames | |
| SyncSignature | |
| SyncParams | |
| SyncParam | |
| SyncCodeObj | |
| SyncSym | |
| SyncLocalIdent | |
| SyncSelector | |
| // Private markers (only known to cmd/compile). | |
| SyncPrivate | |
| SyncFuncExt | |
| SyncVarExt | |
| SyncTypeExt | |
| SyncPragma | |
| SyncExprList | |
| SyncExprs | |
| SyncExpr | |
| SyncExprType | |
| SyncAssign | |
| SyncOp | |
| SyncFuncLit | |
| SyncCompLit | |
| SyncDecl | |
| SyncFuncBody | |
| SyncOpenScope | |
| SyncCloseScope | |
| SyncCloseAnotherScope | |
| SyncDeclNames | |
| SyncDeclName | |
| SyncStmts | |
| SyncBlockStmt | |
| SyncIfStmt | |
| SyncForStmt | |
| SyncSwitchStmt | |
| SyncRangeStmt | |
| SyncCaseClause | |
| SyncCommClause | |
| SyncSelectStmt | |
| SyncDecls | |
| SyncLabeledStmt | |
| SyncUseObjLocal | |
| SyncAddLocal | |
| SyncLinkname | |
| SyncStmt1 | |
| SyncStmtsEnd | |
| SyncLabel | |
| SyncOptLabel | |
| SyncMultiExpr | |
| SyncRType | |
| SyncConvRTTI | |
| ) | |