}
type Frontend interface {
- CanSSA(t *types.Type) bool
-
Logger
+ // CanSSA reports whether variabbles of type t are SSA-able.
+ CanSSA(t *types.Type) bool
+
// StringData returns a symbol pointing to the given string's contents.
StringData(string) *obj.LSym
// for the parts of that compound type.
SplitSlot(parent *LocalSlot, suffix string, offset int64, t *types.Type) LocalSlot
- // Line returns a string describing the given position.
- Line(src.XPos) string
-
// AllocFrame assigns frame offsets to all live auto variables.
AllocFrame(f *Func)
// UseWriteBarrier reports whether write barrier is enabled
UseWriteBarrier() bool
- // SetWBPos indicates that a write barrier has been inserted
- // in this function at position pos.
- SetWBPos(pos src.XPos)
-
// MyImportPath provides the import name (roughly, the package) for the function being compiled.
MyImportPath() string
- // LSym returns the linker symbol of the function being compiled.
- LSym() string
+ // Func returns the ir.Func of the function being compiled.
+ Func() *ir.Func
}
// NewConfig returns a new configuration object for the given architecture.
func (c *Conf) Frontend() Frontend {
if c.fe == nil {
- c.fe = TestFrontend{t: c.tb, ctxt: c.config.ctxt}
+ f := ir.NewFunc(src.NoXPos)
+ f.Nname = ir.NewNameAt(f.Pos(), &types.Sym{
+ Pkg: types.NewPkg("my/import/path", "path"),
+ Name: "function",
+ })
+ f.LSym = &obj.LSym{Name: "my/import/path.function"}
+
+ c.fe = TestFrontend{
+ t: c.tb,
+ ctxt: c.config.ctxt,
+ f: f,
+ }
}
return c.fe
}
type TestFrontend struct {
t testing.TB
ctxt *obj.Link
+ f *ir.Func
}
func (TestFrontend) StringData(s string) *obj.LSym {
func (d TestFrontend) SplitSlot(parent *LocalSlot, suffix string, offset int64, t *types.Type) LocalSlot {
return LocalSlot{N: parent.N, Type: t, Off: offset}
}
-func (TestFrontend) Line(_ src.XPos) string {
- return "unknown.go:0"
-}
func (TestFrontend) AllocFrame(f *Func) {
}
func (d TestFrontend) Syslook(s string) *obj.LSym {
func (TestFrontend) UseWriteBarrier() bool {
return true // only writebarrier_test cares
}
-func (TestFrontend) SetWBPos(pos src.XPos) {
-}
func (d TestFrontend) Logf(msg string, args ...interface{}) { d.t.Logf(msg, args...) }
func (d TestFrontend) Log() bool { return true }
func (d TestFrontend) Debug_checknil() bool { return false }
func (d TestFrontend) MyImportPath() string {
- return "my/import/path"
+ return d.f.Sym().Pkg.Path
}
-func (d TestFrontend) LSym() string {
- return "my/import/path.function"
+func (d TestFrontend) Func() *ir.Func {
+ return d.f
}
var testTypes Types
}
func makeJumpTableSym(b *Block) *obj.LSym {
- s := base.Ctxt.Lookup(fmt.Sprintf("%s.jump%d", b.Func.fe.LSym(), b.ID))
+ s := base.Ctxt.Lookup(fmt.Sprintf("%s.jump%d", b.Func.fe.Func().LSym.Name, b.ID))
s.Set(obj.AttrDuplicateOK, true)
s.Set(obj.AttrLocal, true)
return s
// Save old value to write buffer.
addEntry(oldVal)
}
- f.fe.SetWBPos(pos)
+ f.fe.Func().SetWBPos(pos)
nWBops--
}
// zeroWB(&typ, dst)
taddr := b.NewValue1A(pos, OpAddr, b.Func.Config.Types.Uintptr, typ, sb)
memThen = wbcall(pos, bThen, wbZero, sp, memThen, taddr, dst)
- f.fe.SetWBPos(pos)
+ f.fe.Func().SetWBPos(pos)
nWBops--
case OpMoveWB:
dst := w.Args[0]
// moveWB(&typ, dst, src)
taddr := b.NewValue1A(pos, OpAddr, b.Func.Config.Types.Uintptr, typ, sb)
memThen = wbcall(pos, bThen, wbMove, sp, memThen, taddr, dst, src)
- f.fe.SetWBPos(pos)
+ f.fe.Func().SetWBPos(pos)
nWBops--
}
}
return TypeOK(t)
}
-func (e *ssafn) Line(pos src.XPos) string {
- return base.FmtPos(pos)
-}
-
// Logf logs a message from the compiler.
func (e *ssafn) Logf(msg string, args ...interface{}) {
if e.log {
return nil
}
-func (e *ssafn) SetWBPos(pos src.XPos) {
- e.curfn.SetWBPos(pos)
-}
-
func (e *ssafn) MyImportPath() string {
return base.Ctxt.Pkgpath
}
-func (e *ssafn) LSym() string {
- return e.curfn.LSym.Name
+func (e *ssafn) Func() *ir.Func {
+ return e.curfn
}
func clobberBase(n ir.Node) ir.Node {