// 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 syncObjectName )