// Argsize set below.
},
}
- nameAddr.Sym.Text = prog
+ nameAddr.Sym.Func.Text = prog
prog.To.Val = int32(argSize)
p.append(prog, "", true)
}
return
}
- fn.Func.lsym.Text = ptxt
+ fn.Func.lsym.Func.Text = ptxt
ptxt.From.Type = obj.TYPE_MEM
ptxt.From.Name = obj.NAME_EXTERN
ptxt.From.Sym = fn.Func.lsym
Addrconst(&p.From, obj.FUNCDATA_ArgsPointerMaps)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = &fn.Func.lsym.FuncInfo.GCArgs
+ p.To.Sym = &fn.Func.lsym.Func.GCArgs
p = pp.Prog(obj.AFUNCDATA)
Addrconst(&p.From, obj.FUNCDATA_LocalsPointerMaps)
p.To.Type = obj.TYPE_MEM
p.To.Name = obj.NAME_EXTERN
- p.To.Sym = &fn.Func.lsym.FuncInfo.GCLocals
+ p.To.Sym = &fn.Func.lsym.Func.GCLocals
}
func (f *Func) initLSym() {
func addGCLocals() {
seen := make(map[string]bool)
for _, s := range Ctxt.Text {
- if s.FuncInfo == nil {
+ if s.Func == nil {
continue
}
- for _, gcsym := range []*obj.LSym{&s.FuncInfo.GCArgs, &s.FuncInfo.GCLocals} {
+ for _, gcsym := range []*obj.LSym{&s.Func.GCArgs, &s.Func.GCLocals} {
if seen[gcsym.Name] {
continue
}
}
gotype := Linksym(ngotype(n))
- fnsym.Autom = append(fnsym.Autom, &obj.Auto{
+ fnsym.Func.Autom = append(fnsym.Func.Autom, &obj.Auto{
Asym: Ctxt.Lookup(n.Sym.Name, 0),
Aoffset: int32(n.Xoffset),
Name: name,
// Emit the live pointer map data structures
if ls := e.curfn.Func.lsym; ls != nil {
- livenessemit(lv, &ls.FuncInfo.GCArgs, &ls.FuncInfo.GCLocals)
+ livenessemit(lv, &ls.Func.GCArgs, &ls.Func.GCLocals)
}
return lv.stackMapIndex
}
var p *obj.Prog
var op *obj.Prog
- p = cursym.Text
+ p = cursym.Func.Text
if p == nil || p.Link == nil { // handle external functions and ELF section symbols
return
}
bflag = 0
pc = 0
times++
- c.cursym.Text.Pc = 0 // force re-layout the code.
- for p = c.cursym.Text; p != nil; p = p.Link {
+ c.cursym.Func.Text.Pc = 0 // force re-layout the code.
+ for p = c.cursym.Func.Text; p != nil; p = p.Link {
o = c.oplook(p)
if int64(pc) > p.Pc {
p.Pc = int64(pc)
* perhaps we'd be able to parallelize the span loop above.
*/
- p = c.cursym.Text
+ p = c.cursym.Func.Text
c.autosize = p.To.Offset + 4
c.cursym.Grow(c.cursym.Size)
func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
autosize := int32(0)
- if cursym.Text == nil || cursym.Text.Link == nil {
+ if cursym.Func.Text == nil || cursym.Func.Text.Link == nil {
return
}
c.softfloat()
- p := c.cursym.Text
+ p := c.cursym.Func.Text
autoffset := int32(p.To.Offset)
if autoffset < 0 {
autoffset = 0
}
- cursym.Locals = autoffset
- cursym.Args = p.To.Val.(int32)
+ cursym.Func.Locals = autoffset
+ cursym.Func.Args = p.To.Val.(int32)
/*
* find leaf subroutines
*/
var q1 *obj.Prog
var q *obj.Prog
- for p := cursym.Text; p != nil; p = p.Link {
+ for p := cursym.Func.Text; p != nil; p = p.Link {
switch p.As {
case obj.ATEXT:
p.Mark |= LEAF
case ADIV, ADIVU, AMOD, AMODU:
q = p
- cursym.Text.Mark &^= LEAF
+ cursym.Func.Text.Mark &^= LEAF
continue
case obj.ANOP:
ABX,
obj.ADUFFZERO,
obj.ADUFFCOPY:
- cursym.Text.Mark &^= LEAF
+ cursym.Func.Text.Mark &^= LEAF
fallthrough
case AB,
}
var q2 *obj.Prog
- for p := cursym.Text; p != nil; p = p.Link {
+ for p := cursym.Func.Text; p != nil; p = p.Link {
o := p.As
switch o {
case obj.ATEXT:
autosize = int32(p.To.Offset + 4)
if autosize <= 4 {
- if cursym.Text.Mark&LEAF != 0 {
+ if cursym.Func.Text.Mark&LEAF != 0 {
p.To.Offset = -4
autosize = 0
}
}
- if autosize == 0 && cursym.Text.Mark&LEAF == 0 {
+ if autosize == 0 && cursym.Func.Text.Mark&LEAF == 0 {
if ctxt.Debugvlog {
ctxt.Logf("save suppressed in: %s\n", cursym.Name)
}
- cursym.Text.Mark |= LEAF
+ cursym.Func.Text.Mark |= LEAF
}
- if cursym.Text.Mark&LEAF != 0 {
+ if cursym.Func.Text.Mark&LEAF != 0 {
cursym.Set(obj.AttrLeaf, true)
if autosize == 0 {
break
p.To.Reg = REGSP
p.Spadj = autosize
- if cursym.Text.From.Sym.Wrapper() {
+ if cursym.Func.Text.From.Sym.Wrapper() {
// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
//
// MOVW g_panic(g), R1
case obj.ARET:
nocache(p)
- if cursym.Text.Mark&LEAF != 0 {
+ if cursym.Func.Text.Mark&LEAF != 0 {
if autosize == 0 {
p.As = AB
p.From = obj.Addr{}
}
case ADIV, ADIVU, AMOD, AMODU:
- if cursym.Text.From.Sym.NoSplit() {
+ if cursym.Func.Text.From.Sym.NoSplit() {
ctxt.Diag("cannot divide in NOSPLIT function")
}
const debugdivmod = false
symsfloat := c.ctxt.Lookup("_sfloat", 0)
wasfloat := 0
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
if p.Pcond != nil {
p.Pcond.Mark |= LABEL
}
}
var next *obj.Prog
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
switch p.As {
case AMOVW:
if isfloatreg(&p.To) || isfloatreg(&p.From) {
bls.To.Type = obj.TYPE_BRANCH
var last *obj.Prog
- for last = c.cursym.Text; last.Link != nil; last = last.Link {
+ for last = c.cursym.Func.Text; last.Link != nil; last = last.Link {
}
// Now we are at the end of the function, but logically
spfix.Spadj = -framesize
pcdata := obj.Appendp(spfix, c.newprog)
- pcdata.Pos = c.cursym.Text.Pos
+ pcdata.Pos = c.cursym.Func.Text.Pos
pcdata.As = obj.APCDATA
pcdata.From.Type = obj.TYPE_CONST
pcdata.From.Offset = obj.PCDATA_StackMapIndex
switch {
case c.cursym.CFunc():
morestack = "runtime.morestackc"
- case !c.cursym.Text.From.Sym.NeedCtxt():
+ case !c.cursym.Func.Text.From.Sym.NeedCtxt():
morestack = "runtime.morestack_noctxt"
}
call.To.Sym = c.ctxt.Lookup(morestack, 0)
b := obj.Appendp(call, c.newprog)
b.As = obj.AJMP
b.To.Type = obj.TYPE_BRANCH
- b.Pcond = c.cursym.Text.Link
+ b.Pcond = c.cursym.Func.Text.Link
b.Spadj = +framesize
return bls
}
func span7(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
- p := cursym.Text
+ p := cursym.Func.Text
if p == nil || p.Link == nil { // handle external functions and ELF section symbols
return
}
for bflag != 0 {
bflag = 0
pc = 0
- for p = c.cursym.Text.Link; p != nil; p = p.Link {
+ for p = c.cursym.Func.Text.Link; p != nil; p = p.Link {
if p.As == ADWORD && (pc&7) != 0 {
pc += 4
}
psz := int32(0)
var i int
var out [6]uint32
- for p := c.cursym.Text.Link; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text.Link; p != nil; p = p.Link {
c.pc = p.Pc
o = c.oplook(p)
bls.To.Type = obj.TYPE_BRANCH
var last *obj.Prog
- for last = c.cursym.Text; last.Link != nil; last = last.Link {
+ for last = c.cursym.Func.Text; last.Link != nil; last = last.Link {
}
// Now we are at the end of the function, but logically
spfix.Spadj = -framesize
pcdata := obj.Appendp(spfix, c.newprog)
- pcdata.Pos = c.cursym.Text.Pos
+ pcdata.Pos = c.cursym.Func.Text.Pos
pcdata.As = obj.APCDATA
pcdata.From.Type = obj.TYPE_CONST
pcdata.From.Offset = obj.PCDATA_StackMapIndex
switch {
case c.cursym.CFunc():
morestack = "runtime.morestackc"
- case !c.cursym.Text.From.Sym.NeedCtxt():
+ case !c.cursym.Func.Text.From.Sym.NeedCtxt():
morestack = "runtime.morestack_noctxt"
}
call.To.Sym = c.ctxt.Lookup(morestack, 0)
jmp := obj.Appendp(call, c.newprog)
jmp.As = AB
jmp.To.Type = obj.TYPE_BRANCH
- jmp.Pcond = c.cursym.Text.Link
+ jmp.Pcond = c.cursym.Func.Text.Link
jmp.Spadj = +framesize
// placeholder for bls's jump target
}
func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
- if cursym.Text == nil || cursym.Text.Link == nil {
+ if cursym.Func.Text == nil || cursym.Func.Text.Link == nil {
return
}
c := ctxt7{ctxt: ctxt, newprog: newprog, cursym: cursym}
- p := c.cursym.Text
+ p := c.cursym.Func.Text
textstksiz := p.To.Offset
aoffset := int32(textstksiz)
- c.cursym.Args = p.To.Val.(int32)
- c.cursym.Locals = int32(textstksiz)
+ c.cursym.Func.Args = p.To.Val.(int32)
+ c.cursym.Func.Locals = int32(textstksiz)
/*
* find leaf subroutines
*/
q := (*obj.Prog)(nil)
var q1 *obj.Prog
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
switch p.As {
case obj.ATEXT:
p.Mark |= LEAF
case ABL,
obj.ADUFFZERO,
obj.ADUFFCOPY:
- c.cursym.Text.Mark &^= LEAF
+ c.cursym.Func.Text.Mark &^= LEAF
fallthrough
case ACBNZ,
var q2 *obj.Prog
var retjmp *obj.LSym
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
o := p.As
switch o {
case obj.ATEXT:
- c.cursym.Text = p
+ c.cursym.Func.Text = p
if textstksiz < 0 {
c.autosize = 0
} else {
c.autosize = int32(textstksiz + 8)
}
- if (c.cursym.Text.Mark&LEAF != 0) && c.autosize <= 8 {
+ if (c.cursym.Func.Text.Mark&LEAF != 0) && c.autosize <= 8 {
c.autosize = 0
} else if c.autosize&(16-1) != 0 {
// The frame includes an LR.
// that the frame size is 8 mod 16.
if c.autosize == 8 {
c.autosize += 8
- c.cursym.Locals += 8
+ c.cursym.Func.Locals += 8
} else {
c.ctxt.Diag("%v: unaligned frame size %d - must be 8 mod 16 (or 0)", p, c.autosize-8)
}
}
p.To.Offset = int64(c.autosize) - 8
- if c.autosize == 0 && !(c.cursym.Text.Mark&LEAF != 0) {
+ if c.autosize == 0 && !(c.cursym.Func.Text.Mark&LEAF != 0) {
if c.ctxt.Debugvlog {
- c.ctxt.Logf("save suppressed in: %s\n", c.cursym.Text.From.Sym.Name)
+ c.ctxt.Logf("save suppressed in: %s\n", c.cursym.Func.Text.From.Sym.Name)
}
- c.cursym.Text.Mark |= LEAF
+ c.cursym.Func.Text.Mark |= LEAF
}
if !p.From.Sym.NoSplit() {
if aoffset > 0xF0 {
aoffset = 0xF0
}
- if c.cursym.Text.Mark&LEAF != 0 {
+ if c.cursym.Func.Text.Mark&LEAF != 0 {
c.cursym.Set(obj.AttrLeaf, true)
if c.autosize == 0 {
break
q1.Spadj = aoffset
}
- if c.cursym.Text.From.Sym.Wrapper() {
+ if c.cursym.Func.Text.From.Sym.Wrapper() {
// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
//
// MOV g_panic(g), R1
retjmp = p.To.Sym
p.To = obj.Addr{}
- if c.cursym.Text.Mark&LEAF != 0 {
+ if c.cursym.Func.Text.Mark&LEAF != 0 {
if c.autosize != 0 {
p.As = AADD
p.From.Type = obj.TYPE_CONST
}
i := 0
- for p := sym.Text; p != nil && p.Link != nil; p = p.Link {
+ for p := sym.Func.Text; p != nil && p.Link != nil; p = p.Link {
i--
if i < 0 {
i = LOG - 1
P []byte
R []Reloc
- // TODO(mdempsky): De-anonymize field.
- *FuncInfo
+ Func *FuncInfo
}
// A FuncInfo contains extra fields for STEXT symbols.
var xcmp [C_NCLASS][C_NCLASS]bool
func span0(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
- p := cursym.Text
+ p := cursym.Func.Text
if p == nil || p.Link == nil { // handle external functions and ELF section symbols
return
}
for bflag != 0 {
bflag = 0
pc = 0
- for p = c.cursym.Text.Link; p != nil; p = p.Link {
+ for p = c.cursym.Func.Text.Link; p != nil; p = p.Link {
p.Pc = pc
o = c.oplook(p)
bp := c.cursym.P
var i int32
var out [4]uint32
- for p := c.cursym.Text.Link; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text.Link; p != nil; p = p.Link {
c.pc = p.Pc
o = c.oplook(p)
if int(o.size) > 4*len(out) {
}
o1 = OP_JMP(c.opirr(p.As), uint32(v))
if p.To.Sym == nil {
- p.To.Sym = c.cursym.Text.From.Sym
+ p.To.Sym = c.cursym.Func.Text.From.Sym
p.To.Offset = p.Pcond.Pc
}
rel := obj.Addrel(c.cursym)
// a switch for enabling/disabling instruction scheduling
nosched := true
- if c.cursym.Text == nil || c.cursym.Text.Link == nil {
+ if c.cursym.Func.Text == nil || c.cursym.Func.Text.Link == nil {
return
}
- p := c.cursym.Text
+ p := c.cursym.Func.Text
textstksiz := p.To.Offset
- c.cursym.Args = p.To.Val.(int32)
- c.cursym.Locals = int32(textstksiz)
+ c.cursym.Func.Args = p.To.Val.(int32)
+ c.cursym.Func.Locals = int32(textstksiz)
/*
* find leaf subroutines
var q *obj.Prog
var q1 *obj.Prog
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
switch p.As {
/* too hard, just leave alone */
case obj.ATEXT:
AJAL,
obj.ADUFFZERO,
obj.ADUFFCOPY:
- c.cursym.Text.Mark &^= LEAF
+ c.cursym.Func.Text.Mark &^= LEAF
fallthrough
case AJMP,
autosize := int32(0)
var p1 *obj.Prog
var p2 *obj.Prog
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
o := p.As
switch o {
case obj.ATEXT:
q.To.Type = obj.TYPE_REG
q.To.Reg = REGSP
q.Spadj = +autosize
- } else if c.cursym.Text.Mark&LEAF == 0 {
- if c.cursym.Text.From.Sym.NoSplit() {
+ } else if c.cursym.Func.Text.Mark&LEAF == 0 {
+ if c.cursym.Func.Text.From.Sym.NoSplit() {
if ctxt.Debugvlog {
ctxt.Logf("save suppressed in: %s\n", c.cursym.Name)
}
- c.cursym.Text.Mark |= LEAF
+ c.cursym.Func.Text.Mark |= LEAF
}
}
- if c.cursym.Text.Mark&LEAF != 0 {
+ if c.cursym.Func.Text.Mark&LEAF != 0 {
c.cursym.Set(obj.AttrLeaf, true)
break
}
- if c.cursym.Text.From.Sym.Wrapper() {
+ if c.cursym.Func.Text.From.Sym.Wrapper() {
// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
//
// MOV g_panic(g), R1
p.To.Name = obj.NAME_NONE // clear fields as we may modify p to other instruction
p.To.Sym = nil
- if c.cursym.Text.Mark&LEAF != 0 {
+ if c.cursym.Func.Text.Mark&LEAF != 0 {
if autosize == 0 {
p.As = AJMP
p.From = obj.Addr{}
if c.ctxt.Arch.Family == sys.MIPS {
// rewrite MOVD into two MOVF in 32-bit mode to avoid unaligned memory access
- for p = c.cursym.Text; p != nil; p = p1 {
+ for p = c.cursym.Func.Text; p != nil; p = p1 {
p1 = p.Link
if p.As != AMOVD {
if nosched {
// if we don't do instruction scheduling, simply add
// NOP after each branch instruction.
- for p = c.cursym.Text; p != nil; p = p.Link {
+ for p = c.cursym.Func.Text; p != nil; p = p.Link {
if p.Mark&BRANCH != 0 {
c.addnop(p)
}
}
// instruction scheduling
- q = nil // p - 1
- q1 = c.cursym.Text // top of block
- o := 0 // count of instructions
- for p = c.cursym.Text; p != nil; p = p1 {
+ q = nil // p - 1
+ q1 = c.cursym.Func.Text // top of block
+ o := 0 // count of instructions
+ for p = c.cursym.Func.Text; p != nil; p = p1 {
p1 = p.Link
o++
if p.Mark&NOSCHED != 0 {
p.To.Type = obj.TYPE_BRANCH
if c.cursym.CFunc() {
p.To.Sym = c.ctxt.Lookup("runtime.morestackc", 0)
- } else if !c.cursym.Text.From.Sym.NeedCtxt() {
+ } else if !c.cursym.Func.Text.From.Sym.NeedCtxt() {
p.To.Sym = c.ctxt.Lookup("runtime.morestack_noctxt", 0)
} else {
p.To.Sym = c.ctxt.Lookup("runtime.morestack", 0)
p.As = AJMP
p.To.Type = obj.TYPE_BRANCH
- p.Pcond = c.cursym.Text.Link
+ p.Pcond = c.cursym.Func.Text.Link
p.Mark |= BRANCH
// placeholder for q1's jump target
return
}
- pc := &s.Pcln
+ pc := &s.Func.Pcln
data := 0
data += len(pc.Pcsp.P)
w.nData += data
w.nPcdata += len(pc.Pcdata)
- w.nAutom += len(s.Autom)
+ w.nAutom += len(s.Func.Autom)
w.nFuncdata += len(pc.Funcdataoff)
w.nFile += len(pc.File)
}
// Data block
for _, s := range ctxt.Text {
w.wr.Write(s.P)
- pc := &s.Pcln
+ pc := &s.Func.Pcln
w.wr.Write(pc.Pcsp.P)
w.wr.Write(pc.Pcfile.P)
w.wr.Write(pc.Pcline.P)
}
if s.Type == STEXT {
- for _, a := range s.Autom {
+ for _, a := range s.Func.Autom {
w.writeRef(a.Asym, false)
w.writeRef(a.Gotype, false)
}
- pc := &s.Pcln
+ pc := &s.Func.Pcln
for _, d := range pc.Funcdata {
w.writeRef(d, false)
}
}
fmt.Fprintf(ctxt.Bso, "size=%d", s.Size)
if s.Type == STEXT {
- fmt.Fprintf(ctxt.Bso, " args=%#x locals=%#x", uint64(s.Args), uint64(s.Locals))
+ fmt.Fprintf(ctxt.Bso, " args=%#x locals=%#x", uint64(s.Func.Args), uint64(s.Func.Locals))
if s.Leaf() {
fmt.Fprintf(ctxt.Bso, " leaf")
}
}
fmt.Fprintf(ctxt.Bso, "\n")
if s.Type == STEXT {
- for p := s.Text; p != nil; p = p.Link {
+ for p := s.Func.Text; p != nil; p = p.Link {
fmt.Fprintf(ctxt.Bso, "\t%#04x %v\n", uint(int(p.Pc)), p)
}
}
return
}
- w.writeInt(int64(s.Args))
- w.writeInt(int64(s.Locals))
+ w.writeInt(int64(s.Func.Args))
+ w.writeInt(int64(s.Func.Locals))
if s.NoSplit() {
w.writeInt(1)
} else {
flags |= 1 << 2
}
w.writeInt(flags)
- w.writeInt(int64(len(s.Autom)))
- for _, a := range s.Autom {
+ w.writeInt(int64(len(s.Func.Autom)))
+ for _, a := range s.Func.Autom {
w.writeRefIndex(a.Asym)
w.writeInt(int64(a.Aoffset))
if a.Name == NAME_AUTO {
w.writeRefIndex(a.Gotype)
}
- pc := &s.Pcln
+ pc := &s.Func.Pcln
w.writeInt(int64(len(pc.Pcsp.P)))
w.writeInt(int64(len(pc.Pcfile.P)))
w.writeInt(int64(len(pc.Pcline.P)))
if s.Type != STEXT {
ctxt.Diag("dwarfSym of non-TEXT %v", s)
}
- if s.FuncInfo.dwarfSym == nil {
- s.FuncInfo.dwarfSym = ctxt.Lookup(dwarf.InfoPrefix+s.Name, int(s.Version))
+ if s.Func.dwarfSym == nil {
+ s.Func.dwarfSym = ctxt.Lookup(dwarf.InfoPrefix+s.Name, int(s.Version))
}
- return s.FuncInfo.dwarfSym
+ return s.Func.dwarfSym
}
// populateDWARF fills in the DWARF Debugging Information Entry for TEXT symbol s.
var name string
var q *Prog
- for p := sym.Text; p != nil; p = p.Link {
+ for p := sym.Func.Text; p != nil; p = p.Link {
checkaddr(ctxt, p, &p.From)
if p.From3 != nil {
checkaddr(ctxt, p, p.From3)
continue
}
c = int32(p.To.Offset)
- for q = sym.Text; q != nil; {
+ for q = sym.Func.Text; q != nil; {
if int64(c) == q.Pc {
break
}
}
// Collapse series of jumps to jumps.
- for p := sym.Text; p != nil; p = p.Link {
+ for p := sym.Func.Text; p != nil; p = p.Link {
if p.Pcond == nil {
continue
}
val := int32(-1)
oldval := val
- if func_.Text == nil {
+ if func_.Func.Text == nil {
return
}
- pc := func_.Text.Pc
+ pc := func_.Func.Text.Pc
if dbg {
- ctxt.Logf("%6x %6d %v\n", uint64(pc), val, func_.Text)
+ ctxt.Logf("%6x %6d %v\n", uint64(pc), val, func_.Func.Text)
}
started := false
var delta uint32
- for p := func_.Text; p != nil; p = p.Link {
+ for p := func_.Func.Text; p != nil; p = p.Link {
// Update val. If it's not changing, keep going.
val = valfunc(ctxt, func_, val, p, 0, arg)
if started {
if dbg {
- ctxt.Logf("%6x done\n", uint64(func_.Text.Pc+func_.Size))
+ ctxt.Logf("%6x done\n", uint64(func_.Func.Text.Pc+func_.Size))
}
addvarint(dst, uint32((func_.Size-pc)/int64(ctxt.Arch.MinLC)))
addvarint(dst, 0) // terminator
}
func linkpcln(ctxt *Link, cursym *LSym) {
- pcln := &cursym.Pcln
+ pcln := &cursym.Func.Pcln
npcdata := 0
nfuncdata := 0
- for p := cursym.Text; p != nil; p = p.Link {
+ for p := cursym.Func.Text; p != nil; p = p.Link {
// Find the highest ID of any used PCDATA table. This ignores PCDATA table
// that consist entirely of "-1", since that's the assumed default value.
// From.Offset is table ID
// tabulate which pc and func data we have.
havepc := make([]uint32, (npcdata+31)/32)
havefunc := make([]uint32, (nfuncdata+31)/32)
- for p := cursym.Text; p != nil; p = p.Link {
+ for p := cursym.Func.Text; p != nil; p = p.Link {
if p.As == AFUNCDATA {
if (havefunc[p.From.Offset/32]>>uint64(p.From.Offset%32))&1 != 0 {
ctxt.Diag("multiple definitions for FUNCDATA $%d", p.From.Offset)
// funcdata
if nfuncdata > 0 {
var i int
- for p := cursym.Text; p != nil; p = p.Link {
+ for p := cursym.Func.Text; p != nil; p = p.Link {
if p.As == AFUNCDATA {
i = int(p.From.Offset)
pcln.Funcdataoff[i] = p.To.Offset
continue
}
found := false
- for p := s.Text; p != nil; p = p.Link {
+ for p := s.Func.Text; p != nil; p = p.Link {
if p.As == AFUNCDATA && p.From.Type == TYPE_CONST && p.From.Offset == FUNCDATA_ArgsPointerMaps {
found = true
break
}
if !found {
- p := Appendp(s.Text, newprog)
+ p := Appendp(s.Func.Text, newprog)
p.As = AFUNCDATA
p.From.Type = TYPE_CONST
p.From.Offset = FUNCDATA_ArgsPointerMaps
// func _() { }
return
}
- if s.FuncInfo != nil {
+ if s.Func != nil {
ctxt.Diag("InitTextSym double init for %s", s.Name)
}
- s.FuncInfo = new(FuncInfo)
- if s.Text != nil {
+ s.Func = new(FuncInfo)
+ if s.Func.Text != nil {
ctxt.Diag("duplicate TEXT for %s", s.Name)
}
if s.OnList() {
// Set up the function's gcargs and gclocals.
// They will be filled in later if needed.
- gcargs := &s.FuncInfo.GCArgs
+ gcargs := &s.Func.GCArgs
gcargs.Set(AttrDuplicateOK, true)
gcargs.Type = SRODATA
- gclocals := &s.FuncInfo.GCLocals
+ gclocals := &s.Func.GCLocals
gclocals.Set(AttrDuplicateOK, true)
gclocals.Type = SRODATA
}
var xcmp [C_NCLASS][C_NCLASS]bool
func span9(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
- p := cursym.Text
+ p := cursym.Func.Text
if p == nil || p.Link == nil { // handle external functions and ELF section symbols
return
}
for bflag != 0 {
bflag = 0
pc = 0
- for p = c.cursym.Text.Link; p != nil; p = p.Link {
+ for p = c.cursym.Func.Text.Link; p != nil; p = p.Link {
p.Pc = pc
o = c.oplook(p)
bp := c.cursym.P
var i int32
var out [6]uint32
- for p := c.cursym.Text.Link; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text.Link; p != nil; p = p.Link {
c.pc = p.Pc
o = c.oplook(p)
if int(o.size) > 4*len(out) {
func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
// TODO(minux): add morestack short-cuts with small fixed frame-size.
- if cursym.Text == nil || cursym.Text.Link == nil {
+ if cursym.Func.Text == nil || cursym.Func.Text.Link == nil {
return
}
c := ctxt9{ctxt: ctxt, cursym: cursym, newprog: newprog}
- p := c.cursym.Text
+ p := c.cursym.Func.Text
textstksiz := p.To.Offset
if textstksiz == -8 {
// Compatibility hack.
}
}
- c.cursym.Args = p.To.Val.(int32)
- c.cursym.Locals = int32(textstksiz)
+ c.cursym.Func.Args = p.To.Val.(int32)
+ c.cursym.Func.Locals = int32(textstksiz)
/*
* find leaf subroutines
var q *obj.Prog
var q1 *obj.Prog
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
switch p.As {
/* too hard, just leave alone */
case obj.ATEXT:
ABCL,
obj.ADUFFZERO,
obj.ADUFFCOPY:
- c.cursym.Text.Mark &^= LEAF
+ c.cursym.Func.Text.Mark &^= LEAF
fallthrough
case ABC,
autosize := int32(0)
var p1 *obj.Prog
var p2 *obj.Prog
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
o := p.As
switch o {
case obj.ATEXT:
rel.Type = obj.R_ADDRPOWER_PCREL
}
- if !c.cursym.Text.From.Sym.NoSplit() {
+ if !c.cursym.Func.Text.From.Sym.NoSplit() {
q = c.stacksplit(q, autosize) // emit split check
}
if autosize != 0 {
// Make sure to save link register for non-empty frame, even if
// it is a leaf function, so that traceback works.
- if c.cursym.Text.Mark&LEAF == 0 && autosize >= -BIG && autosize <= BIG {
+ if c.cursym.Func.Text.Mark&LEAF == 0 && autosize >= -BIG && autosize <= BIG {
// Use MOVDU to adjust R1 when saving R31, if autosize is small.
q = obj.Appendp(q, c.newprog)
q.As = AMOVD
q.To.Reg = REGSP
q.Spadj = +autosize
}
- } else if c.cursym.Text.Mark&LEAF == 0 {
+ } else if c.cursym.Func.Text.Mark&LEAF == 0 {
// A very few functions that do not return to their caller
// (e.g. gogo) are not identified as leaves but still have
// no frame.
- c.cursym.Text.Mark |= LEAF
+ c.cursym.Func.Text.Mark |= LEAF
}
- if c.cursym.Text.Mark&LEAF != 0 {
+ if c.cursym.Func.Text.Mark&LEAF != 0 {
c.cursym.Set(obj.AttrLeaf, true)
break
}
q.To.Offset = 24
}
- if c.cursym.Text.From.Sym.Wrapper() {
+ if c.cursym.Func.Text.From.Sym.Wrapper() {
// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
//
// MOVD g_panic(g), R3
retTarget := p.To.Sym
- if c.cursym.Text.Mark&LEAF != 0 {
+ if c.cursym.Func.Text.Mark&LEAF != 0 {
if autosize == 0 {
p.As = ABR
p.From = obj.Addr{}
var morestacksym *obj.LSym
if c.cursym.CFunc() {
morestacksym = c.ctxt.Lookup("runtime.morestackc", 0)
- } else if !c.cursym.Text.From.Sym.NeedCtxt() {
+ } else if !c.cursym.Func.Text.From.Sym.NeedCtxt() {
morestacksym = c.ctxt.Lookup("runtime.morestack_noctxt", 0)
} else {
morestacksym = c.ctxt.Lookup("runtime.morestack", 0)
var xcmp [C_NCLASS][C_NCLASS]bool
func spanz(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
- p := cursym.Text
+ p := cursym.Func.Text
if p == nil || p.Link == nil { // handle external functions and ELF section symbols
return
}
changed = false
buffer = buffer[:0]
c.cursym.R = make([]obj.Reloc, 0)
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
pc := int64(len(buffer))
if pc != p.Pc {
changed = true
func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
// TODO(minux): add morestack short-cuts with small fixed frame-size.
- if cursym.Text == nil || cursym.Text.Link == nil {
+ if cursym.Func.Text == nil || cursym.Func.Text.Link == nil {
return
}
c := ctxtz{ctxt: ctxt, cursym: cursym, newprog: newprog}
- p := c.cursym.Text
+ p := c.cursym.Func.Text
textstksiz := p.To.Offset
if textstksiz == -8 {
// Compatibility hack.
}
}
- c.cursym.Args = p.To.Val.(int32)
- c.cursym.Locals = int32(textstksiz)
+ c.cursym.Func.Args = p.To.Val.(int32)
+ c.cursym.Func.Locals = int32(textstksiz)
/*
* find leaf subroutines
*/
var q *obj.Prog
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
switch p.As {
case obj.ATEXT:
q = p
case ABL, ABCL:
q = p
- c.cursym.Text.Mark &^= LEAF
+ c.cursym.Func.Text.Mark &^= LEAF
fallthrough
case ABC,
var pPre *obj.Prog
var pPreempt *obj.Prog
wasSplit := false
- for p := c.cursym.Text; p != nil; p = p.Link {
+ for p := c.cursym.Func.Text; p != nil; p = p.Link {
pLast = p
switch p.As {
case obj.ATEXT:
q.To.Type = obj.TYPE_REG
q.To.Reg = REGSP
q.Spadj = autosize
- } else if c.cursym.Text.Mark&LEAF == 0 {
+ } else if c.cursym.Func.Text.Mark&LEAF == 0 {
// A very few functions that do not return to their caller
// (e.g. gogo) are not identified as leaves but still have
// no frame.
- c.cursym.Text.Mark |= LEAF
+ c.cursym.Func.Text.Mark |= LEAF
}
- if c.cursym.Text.Mark&LEAF != 0 {
+ if c.cursym.Func.Text.Mark&LEAF != 0 {
c.cursym.Set(obj.AttrLeaf, true)
break
}
- if c.cursym.Text.From.Sym.Wrapper() {
+ if c.cursym.Func.Text.From.Sym.Wrapper() {
// if(g->panic != nil && g->panic->argp == FP) g->panic->argp = bottom-of-frame
//
// MOVD g_panic(g), R3
case obj.ARET:
retTarget := p.To.Sym
- if c.cursym.Text.Mark&LEAF != 0 {
+ if c.cursym.Func.Text.Mark&LEAF != 0 {
if autosize == 0 {
p.As = ABR
p.From = obj.Addr{}
spfix.Spadj = -framesize
pcdata := obj.Appendp(spfix, c.newprog)
- pcdata.Pos = c.cursym.Text.Pos
+ pcdata.Pos = c.cursym.Func.Text.Pos
pcdata.As = obj.APCDATA
pcdata.From.Type = obj.TYPE_CONST
pcdata.From.Offset = obj.PCDATA_StackMapIndex
p.To.Type = obj.TYPE_BRANCH
if c.cursym.CFunc() {
p.To.Sym = c.ctxt.Lookup("runtime.morestackc", 0)
- } else if !c.cursym.Text.From.Sym.NeedCtxt() {
+ } else if !c.cursym.Func.Text.From.Sym.NeedCtxt() {
p.To.Sym = c.ctxt.Lookup("runtime.morestack_noctxt", 0)
} else {
p.To.Sym = c.ctxt.Lookup("runtime.morestack", 0)
p.As = ABR
p.To.Type = obj.TYPE_BRANCH
- p.Pcond = c.cursym.Text.Link
+ p.Pcond = c.cursym.Func.Text.Link
return p
}
var asmbuf AsmBuf
- for p := s.Text; p != nil; p = p.Link {
+ for p := s.Func.Text; p != nil; p = p.Link {
if p.To.Type == obj.TYPE_BRANCH {
if p.Pcond == nil {
p.Pcond = p
var q *obj.Prog
var count int64 // rough count of number of instructions
- for p := s.Text; p != nil; p = p.Link {
+ for p := s.Func.Text; p != nil; p = p.Link {
count++
p.Back = 2 // use short branches first time through
q = p.Pcond
s.R = s.R[:0]
s.P = s.P[:0]
c = 0
- for p := s.Text; p != nil; p = p.Link {
+ for p := s.Func.Text; p != nil; p = p.Link {
if ctxt.Headtype == obj.Hnacl && p.Isize > 0 {
// pad everything to avoid crossing 32-byte boundary
}
func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
- if cursym.Text == nil || cursym.Text.Link == nil {
+ if cursym.Func.Text == nil || cursym.Func.Text.Link == nil {
return
}
- p := cursym.Text
+ p := cursym.Func.Text
autoffset := int32(p.To.Offset)
if autoffset < 0 {
autoffset = 0
}
textarg := int64(p.To.Val.(int32))
- cursym.Args = int32(textarg)
- cursym.Locals = int32(p.To.Offset)
+ cursym.Func.Args = int32(textarg)
+ cursym.Func.Locals = int32(p.To.Offset)
// TODO(rsc): Remove.
- if ctxt.Arch.Family == sys.I386 && cursym.Locals < 0 {
- cursym.Locals = 0
+ if ctxt.Arch.Family == sys.I386 && cursym.Func.Locals < 0 {
+ cursym.Func.Locals = 0
}
// TODO(rsc): Remove 'ctxt.Arch.Family == sys.AMD64 &&'.
p = load_g_cx(ctxt, p, newprog) // load g into CX
}
- if !cursym.Text.From.Sym.NoSplit() {
+ if !cursym.Func.Text.From.Sym.NoSplit() {
p = stacksplit(ctxt, cursym, p, newprog, autoffset, int32(textarg)) // emit split check
}
p.To.Reg = REG_BP
}
- if cursym.Text.From.Sym.Wrapper() {
+ if cursym.Func.Text.From.Sym.Wrapper() {
// if g._panic != nil && g._panic.argp == FP {
// g._panic.argp = bottom-of-frame
// }
jls.To.Type = obj.TYPE_BRANCH
var last *obj.Prog
- for last = cursym.Text; last.Link != nil; last = last.Link {
+ for last = cursym.Func.Text; last.Link != nil; last = last.Link {
}
// Now we are at the end of the function, but logically
spfix.Spadj = -framesize
pcdata := obj.Appendp(spfix, newprog)
- pcdata.Pos = cursym.Text.Pos
+ pcdata.Pos = cursym.Func.Text.Pos
pcdata.As = obj.APCDATA
pcdata.From.Type = obj.TYPE_CONST
pcdata.From.Offset = obj.PCDATA_StackMapIndex
pcdata.To.Offset = -1 // pcdata starts at -1 at function entry
call := obj.Appendp(pcdata, newprog)
- call.Pos = cursym.Text.Pos
+ call.Pos = cursym.Func.Text.Pos
call.As = obj.ACALL
call.To.Type = obj.TYPE_BRANCH
call.To.Name = obj.NAME_EXTERN
switch {
case cursym.CFunc():
morestack = "runtime.morestackc"
- case !cursym.Text.From.Sym.NeedCtxt():
+ case !cursym.Func.Text.From.Sym.NeedCtxt():
morestack = "runtime.morestack_noctxt"
}
call.To.Sym = ctxt.Lookup(morestack, 0)
jmp := obj.Appendp(callend, newprog)
jmp.As = obj.AJMP
jmp.To.Type = obj.TYPE_BRANCH
- jmp.Pcond = cursym.Text.Link
+ jmp.Pcond = cursym.Func.Text.Link
jmp.Spadj = +framesize
jls.Pcond = call