if pp.Text != nil {
Fatalf("Progs.settext called twice")
}
-
ptxt := pp.Prog(obj.ATEXT)
- if nam := fn.Func.Nname; !isblank(nam) {
+ if fn.Func.lsym != nil {
+ fn.Func.lsym.Text = ptxt
ptxt.From.Type = obj.TYPE_MEM
ptxt.From.Name = obj.NAME_EXTERN
- ptxt.From.Sym = Linksym(nam.Sym)
- if fn.Func.Pragma&Systemstack != 0 {
- ptxt.From.Sym.Set(obj.AttrCFunc, true)
+ ptxt.From.Sym = fn.Func.lsym
+ }
+ pp.Text = ptxt
+}
+
+func (f *Func) initLSym() {
+ if f.lsym != nil {
+ Fatalf("Func.initLSym called twice")
+ }
+
+ if nam := f.Nname; !isblank(nam) {
+ f.lsym = Linksym(nam.Sym)
+ if f.Pragma&Systemstack != 0 {
+ f.lsym.Set(obj.AttrCFunc, true)
}
}
var flag int
- if fn.Func.Dupok() {
+ if f.Dupok() {
flag |= obj.DUPOK
}
- if fn.Func.Wrapper() {
+ if f.Wrapper() {
flag |= obj.WRAPPER
}
- if fn.Func.NoFramePointer() {
+ if f.NoFramePointer() {
flag |= obj.NOFRAME
}
- if fn.Func.Needctxt() {
+ if f.Needctxt() {
flag |= obj.NEEDCTXT
}
- if fn.Func.Pragma&Nosplit != 0 {
+ if f.Pragma&Nosplit != 0 {
flag |= obj.NOSPLIT
}
- if fn.Func.ReflectMethod() {
+ if f.ReflectMethod() {
flag |= obj.REFLECTMETHOD
}
// See test/recover.go for test cases and src/reflect/value.go
// for the actual functions being considered.
if myimportpath == "reflect" {
- switch fn.Func.Nname.Sym.Name {
+ switch f.Nname.Sym.Name {
case "callReflect", "callMethod":
flag |= obj.WRAPPER
}
}
- Ctxt.InitTextSym(ptxt, flag)
-
- pp.Text = ptxt
+ Ctxt.InitTextSym(f.lsym, flag)
}
func ggloblnod(nam *Node) {
ctxt.Text = append(ctxt.Text, text...)
}
-func (ctxt *Link) InitTextSym(p *Prog, flag int) {
- if p.As != ATEXT {
- ctxt.Diag("InitTextSym non-ATEXT: %v", p)
- }
- s := p.From.Sym
+func (ctxt *Link) InitTextSym(s *LSym, flag int) {
if s == nil {
// func _() { }
return
s.Set(AttrNeedCtxt, flag&NEEDCTXT != 0)
s.Set(AttrNoFrame, flag&NOFRAME != 0)
s.Type = STEXT
- s.Text = p
}
func (ctxt *Link) Globl(s *LSym, size int64, flag int) {