internal/abi, runtime, cmd: merge funcFlag_* consts into internal/abi
For #59670.
Change-Id: Ie784ba4dd2701e4f455e1abde4a6bfebee4b1387
Reviewed-on: https://go-review.googlesource.com/c/go/+/485496
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Austin Clements <austin@google.com>
Auto-Submit: Austin Clements <austin@google.com>
diff --git a/src/cmd/internal/goobj/funcinfo.go b/src/cmd/internal/goobj/funcinfo.go
index 118c514..9aa1188 100644
--- a/src/cmd/internal/goobj/funcinfo.go
+++ b/src/cmd/internal/goobj/funcinfo.go
@@ -6,7 +6,6 @@
import (
"bytes"
- "cmd/internal/objabi"
"encoding/binary"
"internal/abi"
)
@@ -21,7 +20,7 @@
Args uint32
Locals uint32
FuncID abi.FuncID
- FuncFlag objabi.FuncFlag
+ FuncFlag abi.FuncFlag
StartLine int32
File []CUFileIndex
InlTree []InlTreeNode
@@ -92,7 +91,7 @@
func (*FuncInfo) ReadFuncID(b []byte) abi.FuncID { return abi.FuncID(b[8]) }
-func (*FuncInfo) ReadFuncFlag(b []byte) objabi.FuncFlag { return objabi.FuncFlag(b[9]) }
+func (*FuncInfo) ReadFuncFlag(b []byte) abi.FuncFlag { return abi.FuncFlag(b[9]) }
func (*FuncInfo) ReadStartLine(b []byte) int32 { return int32(binary.LittleEndian.Uint32(b[12:])) }
diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go
index 38aa11c..285fb88 100644
--- a/src/cmd/internal/obj/arm/obj5.go
+++ b/src/cmd/internal/obj/arm/obj5.go
@@ -34,6 +34,7 @@
"cmd/internal/obj"
"cmd/internal/objabi"
"cmd/internal/sys"
+ "internal/abi"
"internal/buildcfg"
"log"
)
@@ -618,8 +619,8 @@
if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
f := c.cursym.Func()
- if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
- c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+ if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+ c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
if ctxt.Debugvlog || !ctxt.IsAsm {
ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
if !ctxt.IsAsm {
diff --git a/src/cmd/internal/obj/arm64/obj7.go b/src/cmd/internal/obj/arm64/obj7.go
index 6c2cb63..fca064a 100644
--- a/src/cmd/internal/obj/arm64/obj7.go
+++ b/src/cmd/internal/obj/arm64/obj7.go
@@ -35,6 +35,7 @@
"cmd/internal/objabi"
"cmd/internal/src"
"cmd/internal/sys"
+ "internal/abi"
"internal/buildcfg"
"log"
"math"
@@ -1037,8 +1038,8 @@
if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
f := c.cursym.Func()
- if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
- c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+ if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+ c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
if ctxt.Debugvlog || !ctxt.IsAsm {
ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
if !ctxt.IsAsm {
diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go
index c238070..b50305f 100644
--- a/src/cmd/internal/obj/link.go
+++ b/src/cmd/internal/obj/link.go
@@ -478,7 +478,7 @@
Locals int32
Align int32
FuncID abi.FuncID
- FuncFlag objabi.FuncFlag
+ FuncFlag abi.FuncFlag
StartLine int32
Text *Prog
Autot map[*LSym]struct{}
@@ -912,7 +912,7 @@
// TextAttrString formats the symbol attributes for printing in as part of a TEXT prog.
func (s *LSym) TextAttrString() string {
attr := s.Attribute.String()
- if s.Func().FuncFlag&objabi.FuncFlag_TOPFRAME != 0 {
+ if s.Func().FuncFlag&abi.FuncFlagTopFrame != 0 {
if attr != "" {
attr += "|"
}
diff --git a/src/cmd/internal/obj/loong64/obj.go b/src/cmd/internal/obj/loong64/obj.go
index 0c1f5c0..86a0bdd 100644
--- a/src/cmd/internal/obj/loong64/obj.go
+++ b/src/cmd/internal/obj/loong64/obj.go
@@ -8,6 +8,7 @@
"cmd/internal/obj"
"cmd/internal/objabi"
"cmd/internal/sys"
+ "internal/abi"
"log"
"math"
)
@@ -477,8 +478,8 @@
if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
f := c.cursym.Func()
- if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
- c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+ if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+ c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
if ctxt.Debugvlog || !ctxt.IsAsm {
ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
if !ctxt.IsAsm {
diff --git a/src/cmd/internal/obj/mips/obj0.go b/src/cmd/internal/obj/mips/obj0.go
index 9241dfd..e8b9c31 100644
--- a/src/cmd/internal/obj/mips/obj0.go
+++ b/src/cmd/internal/obj/mips/obj0.go
@@ -35,6 +35,7 @@
"cmd/internal/sys"
"encoding/binary"
"fmt"
+ "internal/abi"
"log"
"math"
)
@@ -560,8 +561,8 @@
if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
f := c.cursym.Func()
- if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
- c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+ if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+ c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
if ctxt.Debugvlog || !ctxt.IsAsm {
ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
if !ctxt.IsAsm {
diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go
index 1e9e5a8..a9ddf0e 100644
--- a/src/cmd/internal/obj/objfile.go
+++ b/src/cmd/internal/obj/objfile.go
@@ -15,6 +15,7 @@
"cmd/internal/sys"
"encoding/binary"
"fmt"
+ "internal/abi"
"io"
"log"
"os"
@@ -841,10 +842,10 @@
if s.NoSplit() {
fmt.Fprintf(ctxt.Bso, "nosplit ")
}
- if s.Func() != nil && s.Func().FuncFlag&objabi.FuncFlag_TOPFRAME != 0 {
+ if s.Func() != nil && s.Func().FuncFlag&abi.FuncFlagTopFrame != 0 {
fmt.Fprintf(ctxt.Bso, "topframe ")
}
- if s.Func() != nil && s.Func().FuncFlag&objabi.FuncFlag_ASM != 0 {
+ if s.Func() != nil && s.Func().FuncFlag&abi.FuncFlagAsm != 0 {
fmt.Fprintf(ctxt.Bso, "asm ")
}
fmt.Fprintf(ctxt.Bso, "size=%d", s.Size)
diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go
index 278ba65..9ff8e42 100644
--- a/src/cmd/internal/obj/plist.go
+++ b/src/cmd/internal/obj/plist.go
@@ -8,6 +8,7 @@
"cmd/internal/objabi"
"cmd/internal/src"
"fmt"
+ "internal/abi"
"strings"
)
@@ -204,13 +205,13 @@
ctxt.dwarfSym(s)
}
-func (ctxt *Link) toFuncFlag(flag int) objabi.FuncFlag {
- var out objabi.FuncFlag
+func (ctxt *Link) toFuncFlag(flag int) abi.FuncFlag {
+ var out abi.FuncFlag
if flag&TOPFRAME != 0 {
- out |= objabi.FuncFlag_TOPFRAME
+ out |= abi.FuncFlagTopFrame
}
if ctxt.IsAsm {
- out |= objabi.FuncFlag_ASM
+ out |= abi.FuncFlagAsm
}
return out
}
diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go
index e9d47b2..a0ef526 100644
--- a/src/cmd/internal/obj/ppc64/obj9.go
+++ b/src/cmd/internal/obj/ppc64/obj9.go
@@ -34,6 +34,7 @@
"cmd/internal/objabi"
"cmd/internal/src"
"cmd/internal/sys"
+ "internal/abi"
"log"
)
@@ -1004,8 +1005,8 @@
if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 && p.As != ACMPU {
f := c.cursym.Func()
- if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
- c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+ if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+ c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
if ctxt.Debugvlog || !ctxt.IsAsm {
ctxt.Logf("auto-SPWRITE: %s %v\n", c.cursym.Name, p)
if !ctxt.IsAsm {
diff --git a/src/cmd/internal/obj/riscv/obj.go b/src/cmd/internal/obj/riscv/obj.go
index 0d97121..38ea195 100644
--- a/src/cmd/internal/obj/riscv/obj.go
+++ b/src/cmd/internal/obj/riscv/obj.go
@@ -25,6 +25,7 @@
"cmd/internal/objabi"
"cmd/internal/sys"
"fmt"
+ "internal/abi"
"log"
"math/bits"
)
@@ -592,8 +593,8 @@
if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
f := cursym.Func()
- if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
- f.FuncFlag |= objabi.FuncFlag_SPWRITE
+ if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+ f.FuncFlag |= abi.FuncFlagSPWrite
if ctxt.Debugvlog || !ctxt.IsAsm {
ctxt.Logf("auto-SPWRITE: %s %v\n", cursym.Name, p)
if !ctxt.IsAsm {
diff --git a/src/cmd/internal/obj/s390x/objz.go b/src/cmd/internal/obj/s390x/objz.go
index 4e84756..3bab614 100644
--- a/src/cmd/internal/obj/s390x/objz.go
+++ b/src/cmd/internal/obj/s390x/objz.go
@@ -33,6 +33,7 @@
"cmd/internal/obj"
"cmd/internal/objabi"
"cmd/internal/sys"
+ "internal/abi"
"log"
"math"
)
@@ -568,8 +569,8 @@
if p.To.Type == obj.TYPE_REG && p.To.Reg == REGSP && p.Spadj == 0 {
f := c.cursym.Func()
- if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
- c.cursym.Func().FuncFlag |= objabi.FuncFlag_SPWRITE
+ if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+ c.cursym.Func().FuncFlag |= abi.FuncFlagSPWrite
if ctxt.Debugvlog || !ctxt.IsAsm {
ctxt.Logf("auto-SPWRITE: %s\n", c.cursym.Name)
if !ctxt.IsAsm {
diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go
index 8c9ea4f..7f202da 100644
--- a/src/cmd/internal/obj/x86/obj6.go
+++ b/src/cmd/internal/obj/x86/obj6.go
@@ -35,6 +35,7 @@
"cmd/internal/objabi"
"cmd/internal/src"
"cmd/internal/sys"
+ "internal/abi"
"log"
"math"
"path"
@@ -867,8 +868,8 @@
default:
if p.To.Type == obj.TYPE_REG && p.To.Reg == REG_SP && p.As != ACMPL && p.As != ACMPQ {
f := cursym.Func()
- if f.FuncFlag&objabi.FuncFlag_SPWRITE == 0 {
- f.FuncFlag |= objabi.FuncFlag_SPWRITE
+ if f.FuncFlag&abi.FuncFlagSPWrite == 0 {
+ f.FuncFlag |= abi.FuncFlagSPWrite
if ctxt.Debugvlog || !ctxt.IsAsm {
ctxt.Logf("auto-SPWRITE: %s %v\n", cursym.Name, p)
if !ctxt.IsAsm {
diff --git a/src/cmd/internal/objabi/funcid.go b/src/cmd/internal/objabi/funcid.go
index 65f605d..afe9deb 100644
--- a/src/cmd/internal/objabi/funcid.go
+++ b/src/cmd/internal/objabi/funcid.go
@@ -9,16 +9,6 @@
"strings"
)
-// A FuncFlag records bits about a function, passed to the runtime.
-type FuncFlag uint8
-
-// Note: This list must match the list in runtime/symtab.go.
-const (
- FuncFlag_TOPFRAME = 1 << iota
- FuncFlag_SPWRITE
- FuncFlag_ASM
-)
-
var funcIDs = map[string]abi.FuncID{
"abort": abi.FuncID_abort,
"asmcgocall": abi.FuncID_asmcgocall,
diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go
index 7a0425d..13e8cd3 100644
--- a/src/cmd/link/internal/ld/pcln.go
+++ b/src/cmd/link/internal/ld/pcln.go
@@ -706,7 +706,7 @@
off = sb.SetUint8(ctxt.Arch, off, uint8(funcID))
// flag uint8
- var flag objabi.FuncFlag
+ var flag abi.FuncFlag
if fi.Valid() {
flag = fi.FuncFlag()
}
diff --git a/src/cmd/link/internal/loader/loader.go b/src/cmd/link/internal/loader/loader.go
index e72c89f..c94f597 100644
--- a/src/cmd/link/internal/loader/loader.go
+++ b/src/cmd/link/internal/loader/loader.go
@@ -1995,7 +1995,7 @@
return (*goobj.FuncInfo)(nil).ReadFuncID(fi.data)
}
-func (fi *FuncInfo) FuncFlag() objabi.FuncFlag {
+func (fi *FuncInfo) FuncFlag() abi.FuncFlag {
return (*goobj.FuncInfo)(nil).ReadFuncFlag(fi.data)
}
@@ -2027,7 +2027,7 @@
// is an entry point, meaning that unwinders should stop when they hit
// this function.
func (fi *FuncInfo) TopFrame() bool {
- return (fi.FuncFlag() & objabi.FuncFlag_TOPFRAME) != 0
+ return (fi.FuncFlag() & abi.FuncFlagTopFrame) != 0
}
type InlTreeNode struct {
diff --git a/src/internal/abi/symtab.go b/src/internal/abi/symtab.go
index 2f84343..c6a9689 100644
--- a/src/internal/abi/symtab.go
+++ b/src/internal/abi/symtab.go
@@ -4,6 +4,31 @@
package abi
+// A FuncFlag records bits about a function, passed to the runtime.
+type FuncFlag uint8
+
+const (
+ // FuncFlagTopFrame indicates a function that appears at the top of its stack.
+ // The traceback routine stop at such a function and consider that a
+ // successful, complete traversal of the stack.
+ // Examples of TopFrame functions include goexit, which appears
+ // at the top of a user goroutine stack, and mstart, which appears
+ // at the top of a system goroutine stack.
+ FuncFlagTopFrame FuncFlag = 1 << iota
+
+ // FuncFlagSPWrite indicates a function that writes an arbitrary value to SP
+ // (any write other than adding or subtracting a constant amount).
+ // The traceback routines cannot encode such changes into the
+ // pcsp tables, so the function traceback cannot safely unwind past
+ // SPWrite functions. Stopping at an SPWrite function is considered
+ // to be an incomplete unwinding of the stack. In certain contexts
+ // (in particular garbage collector stack scans) that is a fatal error.
+ FuncFlagSPWrite
+
+ // FuncFlagAsm indicates that a function was implemented in assembly.
+ FuncFlagAsm
+)
+
// A FuncID identifies particular functions that need to be treated
// specially by the runtime.
// Note that in some situations involving plugins, there may be multiple
diff --git a/src/runtime/preempt.go b/src/runtime/preempt.go
index a6623c0..751268e 100644
--- a/src/runtime/preempt.go
+++ b/src/runtime/preempt.go
@@ -403,7 +403,7 @@
// functions (except at calls).
return false, 0
}
- if fd := funcdata(f, _FUNCDATA_LocalsPointerMaps); fd == nil || f.flag&funcFlag_ASM != 0 {
+ if fd := funcdata(f, _FUNCDATA_LocalsPointerMaps); fd == nil || f.flag&abi.FuncFlagAsm != 0 {
// This is assembly code. Don't assume it's well-formed.
// TODO: Empirically we still need the fd == nil check. Why?
//
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index ae218da..84a0956 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -3573,7 +3573,7 @@
if !f.valid() {
throw("preempt at unknown pc")
}
- if f.flag&funcFlag_SPWRITE != 0 {
+ if f.flag&abi.FuncFlagSPWrite != 0 {
println("runtime: unexpected SPWRITE function", funcname(f), "in async preempt")
throw("preempt SPWRITE")
}
diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go
index 616e59c..eb9a169 100644
--- a/src/runtime/runtime2.go
+++ b/src/runtime/runtime2.go
@@ -903,7 +903,7 @@
cuOffset uint32 // runtime.cutab offset of this function's CU
startLine int32 // line number of start of function (func keyword/TEXT directive)
funcID abi.FuncID // set for certain special runtime functions
- flag funcFlag
+ flag abi.FuncFlag
_ [1]byte // pad
nfuncdata uint8 // must be last, must end on a uint32-aligned boundary
diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go
index 4d3e269..82c6c9a 100644
--- a/src/runtime/symtab.go
+++ b/src/runtime/symtab.go
@@ -335,32 +335,6 @@
_PCDATA_RestartAtEntry = -5
)
-// A FuncFlag holds bits about a function.
-// This list must match the list in cmd/internal/objabi/funcid.go.
-type funcFlag uint8
-
-const (
- // TOPFRAME indicates a function that appears at the top of its stack.
- // The traceback routine stop at such a function and consider that a
- // successful, complete traversal of the stack.
- // Examples of TOPFRAME functions include goexit, which appears
- // at the top of a user goroutine stack, and mstart, which appears
- // at the top of a system goroutine stack.
- funcFlag_TOPFRAME funcFlag = 1 << iota
-
- // SPWRITE indicates a function that writes an arbitrary value to SP
- // (any write other than adding or subtracting a constant amount).
- // The traceback routines cannot encode such changes into the
- // pcsp tables, so the function traceback cannot safely unwind past
- // SPWRITE functions. Stopping at an SPWRITE function is considered
- // to be an incomplete unwinding of the stack. In certain contexts
- // (in particular garbage collector stack scans) that is a fatal error.
- funcFlag_SPWRITE
-
- // ASM indicates that a function was implemented in assembly.
- funcFlag_ASM
-)
-
// pcHeader holds data used by the pclntab lookups.
type pcHeader struct {
magic uint32 // 0xFFFFFFF1
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index 2717b76..aac19dc 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -270,13 +270,13 @@
// but it carefully arranges that during the transition BOTH stacks
// have cgocallback frame valid for unwinding through.
// So we don't need to exclude it with the other SP-writing functions.
- flag &^= funcFlag_SPWRITE
+ flag &^= abi.FuncFlagSPWrite
}
if isSyscall {
// Some Syscall functions write to SP, but they do so only after
// saving the entry PC/SP using entersyscall.
// Since we are using the entry PC/SP, the later SP write doesn't matter.
- flag &^= funcFlag_SPWRITE
+ flag &^= abi.FuncFlagSPWrite
}
// Found an actual function.
@@ -315,14 +315,14 @@
// systemstack doesn't have an SP delta (the CALL
// instruction opens the frame), therefore no way
// to check.
- flag &^= funcFlag_SPWRITE
+ flag &^= abi.FuncFlagSPWrite
break
}
gp = gp.m.curg
u.g.set(gp)
frame.sp = gp.sched.sp
u.cgoCtxt = len(gp.cgoCtxt) - 1
- flag &^= funcFlag_SPWRITE
+ flag &^= abi.FuncFlagSPWrite
}
}
frame.fp = frame.sp + uintptr(funcspdelta(f, frame.pc, &u.cache))
@@ -333,10 +333,10 @@
}
// Derive link register.
- if flag&funcFlag_TOPFRAME != 0 {
+ if flag&abi.FuncFlagTopFrame != 0 {
// This function marks the top of the stack. Stop the traceback.
frame.lr = 0
- } else if flag&funcFlag_SPWRITE != 0 {
+ } else if flag&abi.FuncFlagSPWrite != 0 {
// The function we are in does a write to SP that we don't know
// how to encode in the spdelta table. Examples include context
// switch routines like runtime.gogo but also any code that switches