mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
This CL extends the unified export data format's existing sync mechanism to save writer stacks, controlled by the -d=syncframes debug flag. This allows readers to provide more details when reporting desync errors, which should simplify development of the data format and the various reader/writer implementations. For example, CL 328051 updated reader and writer, but missed making a similar change to the linker (fix in CL 328054). Re-reviewing the CL in isolation after the failure, it was not immediately obvious what was going wrong. But the pair of stack traces below identifies exactly what happened: it should have updated linker.relocFuncExt to write out the new sync marker too. ``` data sync error: package "internal/abi", section 6, index 4, offset 536 found UseReloc, written at: /home/mdempsky/wd/go/src/cmd/compile/internal/noder/encoder.go:221: (*encoder).reloc +0x44 /home/mdempsky/wd/go/src/cmd/compile/internal/noder/linker.go:214: (*linker).relocFuncExt +0x580 /home/mdempsky/wd/go/src/cmd/compile/internal/noder/linker.go:233: (*linker).relocTypeExt +0x234 /home/mdempsky/wd/go/src/cmd/compile/internal/noder/linker.go:161: (*linker).relocObj +0x2198 /home/mdempsky/wd/go/src/cmd/compile/internal/noder/linker.go:64: (*linker).relocIdx +0x196 expected ImplicitTypes, reading at: /home/mdempsky/wd/go/src/cmd/compile/internal/noder/reader.go:796: (*reader).implicitTypes +0x36 /home/mdempsky/wd/go/src/cmd/compile/internal/noder/reader.go:810: (*reader).addBody +0x81 /home/mdempsky/wd/go/src/cmd/compile/internal/noder/reader.go:727: (*reader).funcExt +0x542 /home/mdempsky/wd/go/src/cmd/compile/internal/noder/reader.go:651: (*reader).method +0x324 /home/mdempsky/wd/go/src/cmd/compile/internal/noder/reader.go:557: (*pkgReader).objIdx +0x2704 ``` Change-Id: I911193edd2a965f81b7459f15fb613a773584685 Reviewed-on: https://go-review.googlesource.com/c/go/+/328909 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Robert Griesemer <gri@golang.org>
186 lines
3.3 KiB
Go
186 lines
3.3 KiB
Go
// UNREVIEWED
|
|
|
|
// 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 noder
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// enableSync controls whether sync markers are written into unified
|
|
// IR's export data format and also whether they're expected when
|
|
// reading them back in. They're inessential to the correct
|
|
// functioning of unified IR, but are helpful during development to
|
|
// detect mistakes.
|
|
//
|
|
// When sync is enabled, writer stack frames will also be included in
|
|
// the export data. Currently, a fixed number of frames are included,
|
|
// controlled by -d=syncframes (default 0).
|
|
const enableSync = true
|
|
|
|
// 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)
|
|
|
|
// 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
|
|
|
|
// TODO(mdempsky): Cleanup unneeded sync markers.
|
|
|
|
// TODO(mdempsky): Split these markers into public/stable markers, and
|
|
// private ones. Also, trim unused ones.
|
|
const (
|
|
_ syncMarker = iota
|
|
syncNode
|
|
syncBool
|
|
syncInt64
|
|
syncUint64
|
|
syncString
|
|
syncPos
|
|
syncPkg
|
|
syncSym
|
|
syncSelector
|
|
syncKind
|
|
syncType
|
|
syncTypePkg
|
|
syncSignature
|
|
syncParam
|
|
syncOp
|
|
syncObject
|
|
syncExpr
|
|
syncStmt
|
|
syncDecl
|
|
syncConstDecl
|
|
syncFuncDecl
|
|
syncTypeDecl
|
|
syncVarDecl
|
|
syncPragma
|
|
syncValue
|
|
syncEOF
|
|
syncMethod
|
|
syncFuncBody
|
|
syncUse
|
|
syncUseObj
|
|
syncObjectIdx
|
|
syncTypeIdx
|
|
syncBOF
|
|
syncEntry
|
|
syncOpenScope
|
|
syncCloseScope
|
|
syncGlobal
|
|
syncLocal
|
|
syncDefine
|
|
syncDefLocal
|
|
syncUseLocal
|
|
syncDefGlobal
|
|
syncUseGlobal
|
|
syncTypeParams
|
|
syncUseLabel
|
|
syncDefLabel
|
|
syncFuncLit
|
|
syncCommonFunc
|
|
syncBodyRef
|
|
syncLinksymExt
|
|
syncHack
|
|
syncSetlineno
|
|
syncName
|
|
syncImportDecl
|
|
syncDeclNames
|
|
syncDeclName
|
|
syncExprList
|
|
syncExprs
|
|
syncWrapname
|
|
syncTypeExpr
|
|
syncTypeExprOrNil
|
|
syncChanDir
|
|
syncParams
|
|
syncCloseAnotherScope
|
|
syncSum
|
|
syncUnOp
|
|
syncBinOp
|
|
syncStructType
|
|
syncInterfaceType
|
|
syncPackname
|
|
syncEmbedded
|
|
syncStmts
|
|
syncStmtsFall
|
|
syncStmtFall
|
|
syncBlockStmt
|
|
syncIfStmt
|
|
syncForStmt
|
|
syncSwitchStmt
|
|
syncRangeStmt
|
|
syncCaseClause
|
|
syncCommClause
|
|
syncSelectStmt
|
|
syncDecls
|
|
syncLabeledStmt
|
|
syncCompLit
|
|
|
|
sync1
|
|
sync2
|
|
sync3
|
|
sync4
|
|
|
|
syncN
|
|
syncDefImplicit
|
|
syncUseName
|
|
syncUseObjLocal
|
|
syncAddLocal
|
|
syncBothSignature
|
|
syncSetUnderlying
|
|
syncLinkname
|
|
syncStmt1
|
|
syncStmtsEnd
|
|
syncDeclare
|
|
syncTopDecls
|
|
syncTopConstDecl
|
|
syncTopFuncDecl
|
|
syncTopTypeDecl
|
|
syncTopVarDecl
|
|
syncObject1
|
|
syncAddBody
|
|
syncLabel
|
|
syncFuncExt
|
|
syncMethExt
|
|
syncOptLabel
|
|
syncScalar
|
|
syncStmtDecls
|
|
syncDeclLocal
|
|
syncObjLocal
|
|
syncObjLocal1
|
|
syncDeclareLocal
|
|
syncPublic
|
|
syncPrivate
|
|
syncRelocs
|
|
syncReloc
|
|
syncUseReloc
|
|
syncVarExt
|
|
syncPkgDef
|
|
syncTypeExt
|
|
syncVal
|
|
syncCodeObj
|
|
syncPosBase
|
|
syncLocalIdent
|
|
syncTypeParamNames
|
|
syncTypeParamBounds
|
|
syncImplicitTypes
|
|
)
|