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