q.To.Reg = r
}
case ssa.OpAMD64CALLstatic:
- if v.Aux.(*gc.Sym) == gc.Deferreturn.Sym {
+ if v.Aux.(*obj.LSym) == gc.Linksym(gc.Deferreturn.Sym) {
// Deferred calls will appear to be returning to
// the CALL deferreturn(SB) that we are about to emit.
// However, the stack trace code will show the line
p := gc.Prog(obj.ACALL)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(v.Aux.(*gc.Sym))
+ p.To.Sym = v.Aux.(*obj.LSym)
if gc.Maxarg < v.AuxInt {
gc.Maxarg = v.AuxInt
}
p := gc.Prog(obj.AJMP)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(b.Aux.(*gc.Sym))
+ p.To.Sym = b.Aux.(*obj.LSym)
case ssa.BlockAMD64EQF:
gc.SSAGenFPJump(s, b, next, &eqfJumps)
p.To.Type = obj.TYPE_REG
p.To.Reg = v.Reg()
case ssa.OpARMCALLstatic:
- if v.Aux.(*gc.Sym) == gc.Deferreturn.Sym {
+ if v.Aux.(*obj.LSym) == gc.Linksym(gc.Deferreturn.Sym) {
// Deferred calls will appear to be returning to
// the CALL deferreturn(SB) that we are about to emit.
// However, the stack trace code will show the line
p := gc.Prog(obj.ACALL)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(v.Aux.(*gc.Sym))
+ p.To.Sym = v.Aux.(*obj.LSym)
if gc.Maxarg < v.AuxInt {
gc.Maxarg = v.AuxInt
}
p := gc.Prog(obj.ARET)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(b.Aux.(*gc.Sym))
+ p.To.Sym = b.Aux.(*obj.LSym)
case ssa.BlockARMEQ, ssa.BlockARMNE,
ssa.BlockARMLT, ssa.BlockARMGE,
p4.To.Type = obj.TYPE_BRANCH
gc.Patch(p4, p)
case ssa.OpARM64CALLstatic:
- if v.Aux.(*gc.Sym) == gc.Deferreturn.Sym {
+ if v.Aux.(*obj.LSym) == gc.Linksym(gc.Deferreturn.Sym) {
// Deferred calls will appear to be returning to
// the CALL deferreturn(SB) that we are about to emit.
// However, the stack trace code will show the line
p := gc.Prog(obj.ACALL)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(v.Aux.(*gc.Sym))
+ p.To.Sym = v.Aux.(*obj.LSym)
if gc.Maxarg < v.AuxInt {
gc.Maxarg = v.AuxInt
}
p := gc.Prog(obj.ARET)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(b.Aux.(*gc.Sym))
+ p.To.Sym = b.Aux.(*obj.LSym)
case ssa.BlockARM64EQ, ssa.BlockARM64NE,
ssa.BlockARM64LT, ssa.BlockARM64GE,
s.stmtList(n.List)
b := s.exit()
b.Kind = ssa.BlockRetJmp // override BlockRet
- b.Aux = n.Left.Sym
+ b.Aux = Linksym(n.Left.Sym)
case OCONTINUE, OBREAK:
var op string
case codeptr != nil:
call = s.newValue2(ssa.OpInterCall, ssa.TypeMem, codeptr, s.mem())
case sym != nil:
- call = s.newValue1A(ssa.OpStaticCall, ssa.TypeMem, sym, s.mem())
+ call = s.newValue1A(ssa.OpStaticCall, ssa.TypeMem, Linksym(sym), s.mem())
default:
Fatalf("bad call type %v %v", n.Op, n)
}
}
// Issue call
- call := s.newValue1A(ssa.OpStaticCall, ssa.TypeMem, fn.Sym, s.mem())
+ call := s.newValue1A(ssa.OpStaticCall, ssa.TypeMem, Linksym(fn.Sym), s.mem())
s.vars[&memVar] = call
if !returns {
return Debug_wb != 0
}
-func (e *ssaExport) Syslook(name string) interface{} {
- return syslook(name).Sym
+func (e *ssaExport) Syslook(name string) *obj.LSym {
+ return Linksym(syslook(name).Sym)
}
func (n *Node) Typ() ssa.Type {
p6.To.Type = obj.TYPE_BRANCH
gc.Patch(p6, p2)
case ssa.OpMIPSCALLstatic:
- if v.Aux.(*gc.Sym) == gc.Deferreturn.Sym {
+ if v.Aux.(*obj.LSym) == gc.Linksym(gc.Deferreturn.Sym) {
// Deferred calls will appear to be returning to
// the CALL deferreturn(SB) that we are about to emit.
// However, the stack trace code will show the line
p := gc.Prog(obj.ACALL)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(v.Aux.(*gc.Sym))
+ p.To.Sym = v.Aux.(*obj.LSym)
if gc.Maxarg < v.AuxInt {
gc.Maxarg = v.AuxInt
}
p := gc.Prog(obj.ARET)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(b.Aux.(*gc.Sym))
+ p.To.Sym = b.Aux.(*obj.LSym)
case ssa.BlockMIPSEQ, ssa.BlockMIPSNE,
ssa.BlockMIPSLTZ, ssa.BlockMIPSGEZ,
ssa.BlockMIPSLEZ, ssa.BlockMIPSGTZ,
p6.To.Type = obj.TYPE_BRANCH
gc.Patch(p6, p2)
case ssa.OpMIPS64CALLstatic:
- if v.Aux.(*gc.Sym) == gc.Deferreturn.Sym {
+ if v.Aux.(*obj.LSym) == gc.Linksym(gc.Deferreturn.Sym) {
// Deferred calls will appear to be returning to
// the CALL deferreturn(SB) that we are about to emit.
// However, the stack trace code will show the line
p := gc.Prog(obj.ACALL)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(v.Aux.(*gc.Sym))
+ p.To.Sym = v.Aux.(*obj.LSym)
if gc.Maxarg < v.AuxInt {
gc.Maxarg = v.AuxInt
}
p := gc.Prog(obj.ARET)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(b.Aux.(*gc.Sym))
+ p.To.Sym = b.Aux.(*obj.LSym)
case ssa.BlockMIPS64EQ, ssa.BlockMIPS64NE,
ssa.BlockMIPS64LTZ, ssa.BlockMIPS64GEZ,
ssa.BlockMIPS64LEZ, ssa.BlockMIPS64GTZ,
gc.Patch(p4, p)
case ssa.OpPPC64CALLstatic:
- if v.Aux.(*gc.Sym) == gc.Deferreturn.Sym {
+ if v.Aux.(*obj.LSym) == gc.Linksym(gc.Deferreturn.Sym) {
// Deferred calls will appear to be returning to
// the CALL deferreturn(SB) that we are about to emit.
// However, the stack trace code will show the line
p := gc.Prog(obj.ACALL)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(v.Aux.(*gc.Sym))
+ p.To.Sym = v.Aux.(*obj.LSym)
if gc.Maxarg < v.AuxInt {
gc.Maxarg = v.AuxInt
}
p := gc.Prog(obj.AJMP)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(b.Aux.(*gc.Sym))
+ p.To.Sym = b.Aux.(*obj.LSym)
case ssa.BlockPPC64EQ, ssa.BlockPPC64NE,
ssa.BlockPPC64LT, ssa.BlockPPC64GE,
p.To.Type = obj.TYPE_REG
p.To.Reg = r
case ssa.OpS390XCALLstatic:
- if v.Aux.(*gc.Sym) == gc.Deferreturn.Sym {
+ if v.Aux.(*obj.LSym) == gc.Linksym(gc.Deferreturn.Sym) {
// Deferred calls will appear to be returning to
// the CALL deferreturn(SB) that we are about to emit.
// However, the stack trace code will show the line
p := gc.Prog(obj.ACALL)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(v.Aux.(*gc.Sym))
+ p.To.Sym = v.Aux.(*obj.LSym)
if gc.Maxarg < v.AuxInt {
gc.Maxarg = v.AuxInt
}
p := gc.Prog(s390x.ABR)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(b.Aux.(*gc.Sym))
+ p.To.Sym = b.Aux.(*obj.LSym)
case ssa.BlockS390XEQ, ssa.BlockS390XNE,
ssa.BlockS390XLT, ssa.BlockS390XGE,
ssa.BlockS390XLE, ssa.BlockS390XGT,
// Syslook returns a symbol of the runtime function/variable with the
// given name.
- Syslook(string) interface{} // returns *gc.Sym
+ Syslook(string) *obj.LSym
}
// interface used to hold *gc.Node. We'd use *gc.Node directly but
var Opt = opt
var Deadcode = deadcode
var Copyelim = copyelim
+var TestCtxt = obj.Linknew(&x86.Linkamd64)
func testConfig(t testing.TB) *Config {
- testCtxt := &obj.Link{Arch: &x86.Linkamd64}
- return NewConfig("amd64", DummyFrontend{t}, testCtxt, true)
+ return NewConfig("amd64", DummyFrontend{t}, TestCtxt, true)
}
// DummyFrontend is a test-only frontend.
}
func (DummyFrontend) AllocFrame(f *Func) {
}
-func (DummyFrontend) Syslook(s string) interface{} {
- return DummySym(s)
+func (DummyFrontend) Syslook(s string) *obj.LSym {
+ return obj.Linklookup(TestCtxt, s, 0)
}
func (d DummyFrontend) Logf(msg string, args ...interface{}) { d.t.Logf(msg, args...) }
// There are no un-SSAable types in dummy land.
return true
}
-
-type DummySym string
-
-func (s DummySym) String() string { return string(s) }
package ssa
import (
+ "cmd/internal/obj"
"cmd/internal/src"
- "fmt"
)
// writebarrier expands write barrier ops (StoreWB, MoveWB, etc.) into
// number of blocks as fuse merges blocks introduced in this phase.
func writebarrier(f *Func) {
var sb, sp, wbaddr *Value
- var writebarrierptr, typedmemmove, typedmemclr interface{} // *gc.Sym
+ var writebarrierptr, typedmemmove, typedmemclr *obj.LSym
var storeWBs, others []*Value
var wbs *sparseSet
for _, b := range f.Blocks { // range loop is safe since the blocks we added contain no WB stores
if sp == nil {
sp = f.Entry.NewValue0(initln, OpSP, f.Config.fe.TypeUintptr())
}
- wbsym := &ExternSymbol{Typ: f.Config.fe.TypeBool(), Sym: f.Config.fe.Syslook("writeBarrier").(fmt.Stringer)}
+ wbsym := &ExternSymbol{Typ: f.Config.fe.TypeBool(), Sym: f.Config.fe.Syslook("writeBarrier")}
wbaddr = f.Entry.NewValue1A(initln, OpAddr, f.Config.fe.TypeUInt32().PtrTo(), wbsym, sb)
writebarrierptr = f.Config.fe.Syslook("writebarrierptr")
typedmemmove = f.Config.fe.Syslook("typedmemmove")
typ := w.Aux // only non-nil for MoveWB, MoveWBVolatile, ZeroWB
var op Op
- var fn interface{} // *gc.Sym
+ var fn *obj.LSym
switch w.Op {
case OpStoreWB:
op = OpStore
// wbcall emits write barrier runtime call in b, returns memory.
// if valIsVolatile, it moves val into temp space before making the call.
-func wbcall(pos src.XPos, b *Block, fn interface{}, typ interface{}, ptr, val, mem, sp, sb *Value, valIsVolatile bool) *Value {
+func wbcall(pos src.XPos, b *Block, fn *obj.LSym, typ interface{}, ptr, val, mem, sp, sb *Value, valIsVolatile bool) *Value {
config := b.Func.Config
var tmp GCNode
q.To.Reg = r
}
case ssa.Op386CALLstatic:
- if v.Aux.(*gc.Sym) == gc.Deferreturn.Sym {
+ if v.Aux.(*obj.LSym) == gc.Linksym(gc.Deferreturn.Sym) {
// Deferred calls will appear to be returning to
// the CALL deferreturn(SB) that we are about to emit.
// However, the stack trace code will show the line
p := gc.Prog(obj.ACALL)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(v.Aux.(*gc.Sym))
+ p.To.Sym = v.Aux.(*obj.LSym)
if gc.Maxarg < v.AuxInt {
gc.Maxarg = v.AuxInt
}
p := gc.Prog(obj.AJMP)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = gc.Linksym(b.Aux.(*gc.Sym))
+ p.To.Sym = b.Aux.(*obj.LSym)
case ssa.Block386EQF:
gc.SSAGenFPJump(s, b, next, &eqfJumps)