if p.As == obj.AVARDEF || p.As == obj.AVARKILL {
continue
}
- proginfo(&info, p)
+ info = proginfo(p)
if info.Flags&gc.Call != 0 {
return false
}
obj.ARET: gc.ProgInfo{gc.Break, 0, 0, 0},
}
-func proginfo(info *gc.ProgInfo, p *obj.Prog) {
- *info = progtable[p.As]
+func proginfo(p *obj.Prog) (info gc.ProgInfo) {
+ info = progtable[p.As]
if info.Flags == 0 {
gc.Fatal("unknown instruction %v", p)
}
arm.AMODU:
info.Regset |= RtoB(arm.REG_R12)
}
+
+ return
}
var info gc.ProgInfo
for p != nil {
- proginfo(&info, p)
+ info = proginfo(p)
if info.Flags&gc.UseCarry != 0 {
return true
}
for r := (*gc.Flow)(gc.Uniqp(r0)); r != nil; r = gc.Uniqp(r) {
p = r.Prog
if p.To.Type == obj.TYPE_REG && int(p.To.Reg) == reg {
- proginfo(&info, p)
+ info = proginfo(p)
if info.Flags&gc.RightWrite != 0 {
if info.Flags&gc.SizeL != 0 {
return true
if p.As == obj.AVARDEF || p.As == obj.AVARKILL {
continue
}
- proginfo(&info, p)
+ info = proginfo(p)
if info.Flags&gc.Call != 0 {
if gc.Debug['P'] != 0 && gc.Debug['v'] != 0 {
fmt.Printf("\tfound %v; return 0\n", p)
return 0
}
var info gc.ProgInfo
- proginfo(&info, p)
+ info = proginfo(p)
if (info.Reguse|info.Regset)&RtoB(int(v.Reg)) != 0 {
return 2
x86.AXORW: gc.ProgInfo{gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
}
-func proginfo(info *gc.ProgInfo, p *obj.Prog) {
- *info = progtable[p.As]
+func proginfo(p *obj.Prog) (info gc.ProgInfo) {
+ info = progtable[p.As]
if info.Flags == 0 {
gc.Fatal("unknown instruction %v", p)
}
if p.To.Index != x86.REG_NONE {
info.Regindex |= RtoB(int(p.To.Index))
}
+
+ return
}
var info gc.ProgInfo
for p != nil {
- proginfo(&info, p)
+ info = proginfo(p)
if info.Flags&gc.UseCarry != 0 {
return true
}
if p.As == obj.AVARDEF || p.As == obj.AVARKILL {
continue
}
- proginfo(&info, p)
+ info = proginfo(p)
if info.Flags&gc.Call != 0 {
return false
}
return 0
}
var info gc.ProgInfo
- proginfo(&info, p)
+ info = proginfo(p)
if (info.Reguse|info.Regset)&RtoB(int(v.Reg)) != 0 {
return 2
i386.AXORW: gc.ProgInfo{gc.SizeW | gc.LeftRead | RightRdwr | gc.SetCarry, 0, 0, 0},
}
-func proginfo(info *gc.ProgInfo, p *obj.Prog) {
- *info = progtable[p.As]
+func proginfo(p *obj.Prog) (info gc.ProgInfo) {
+ info = progtable[p.As]
if info.Flags == 0 {
gc.Fatal("unknown instruction %v", p)
}
if p.To.Index != i386.REG_NONE {
info.Regindex |= RtoB(int(p.To.Index))
}
+
+ return info
}
if p.As == obj.AVARDEF || p.As == obj.AVARKILL {
continue
}
- proginfo(&info, p)
+ info = proginfo(p)
if info.Flags&gc.Call != 0 {
return false
}
}
}
-func proginfo(info *gc.ProgInfo, p *obj.Prog) {
+func proginfo(p *obj.Prog) (info gc.ProgInfo) {
initproginfo()
- *info = progtable[p.As]
+ info = progtable[p.As]
if info.Flags == 0 {
- *info = progtable[ppc64.AADD]
+ info = progtable[ppc64.AADD]
gc.Fatal("proginfo: unknown instruction %v", p)
}
info.Regset |= RtoB(ppc64.REG_R3) | RtoB(ppc64.REG_R4)
}
+
+ return
}
// Instruction variants table. Initially this contains entries only
Igen func(*Node, *Node, *Node)
Linkarchinit func()
Peep func(*obj.Prog)
- Proginfo func(*ProgInfo, *obj.Prog)
+ Proginfo func(*obj.Prog) ProgInfo
Regalloc func(*Node, *Type, *Node)
Regfree func(*Node)
Regtyp func(*obj.Addr) bool
r, w := utf8.DecodeRune(buf[:i+1])
if r == utf8.RuneError && w == 1 {
lineno = lexlineno
- Yyerror("illegal UTF-8 sequence % x", buf[:i+1])
+ // The string conversion here makes a copy for passing
+ // to fmt.Printf, so that buf itself does not escape and can
+ // be allocated on the stack.
+ Yyerror("illegal UTF-8 sequence % x", string(buf[:i+1]))
}
return int32(r)
}
bvresetall(varkill)
bvresetall(avarinit)
- Thearch.Proginfo(&info, prog)
+ info = Thearch.Proginfo(prog)
if prog.As == obj.ARET {
// Return instructions implicitly read all the arguments. For
// the sake of correctness, out arguments must be read. For the
// to allocate in every f->data field, for use by the client.
// If size == 0, f->data will be nil.
+var flowmark int
+
func Flowstart(firstp *obj.Prog, newData func() interface{}) *Graph {
var info ProgInfo
for p := firstp; p != nil; p = p.Link {
p.Opt = nil // should be already, but just in case
- Thearch.Proginfo(&info, p)
+ info = Thearch.Proginfo(p)
if info.Flags&Skip != 0 {
continue
}
- p.Opt = interface{}(1)
+ p.Opt = &flowmark
nf++
}
var p *obj.Prog
for f := start; f != nil; f = f.Link {
p = f.Prog
- Thearch.Proginfo(&info, p)
+ info = Thearch.Proginfo(p)
if info.Flags&Break == 0 {
f1 = f.Link
f.S1 = f1
var info ProgInfo
for f := g.Start; f != nil; f = f.Link {
p = f.Prog
- Thearch.Proginfo(&info, p)
+ info = Thearch.Proginfo(p)
if p.From.Node != nil && ((p.From.Node).(*Node)).Opt != nil && p.To.Node != nil && ((p.To.Node).(*Node)).Opt != nil {
Fatal("double node %v", p)
f = v.use
if f != nil && f.Data.(*Flow) == nil {
p = f.Prog
- Thearch.Proginfo(&info, p)
+ info = Thearch.Proginfo(p)
if p.To.Node == v.node && (info.Flags&RightWrite != 0) && info.Flags&RightRead == 0 {
p.As = obj.ANOP
p.To = obj.Addr{}
f = v.use
if f != nil && f.Link == f.Data.(*Flow) && (f.Data.(*Flow)).Data.(*Flow) == nil && Uniqp(f.Link) == f {
p = f.Prog
- Thearch.Proginfo(&info, p)
+ info = Thearch.Proginfo(p)
p1 = f.Link.Prog
- Thearch.Proginfo(&info1, p1)
+ info1 = Thearch.Proginfo(p1)
const (
SizeAny = SizeB | SizeW | SizeL | SizeQ | SizeF | SizeD
)
for f := fcheck; f != nil; f = Uniqp(f) {
p = f.Prog
- Thearch.Proginfo(&info, p)
+ info = Thearch.Proginfo(p)
if (info.Flags&RightWrite != 0) && Thearch.Sameaddr(&p.To, &fcheck.Prog.From) {
// Found initialization of value we're checking for nil.
// without first finding the check, so this one is unchecked.
for f := Uniqs(fcheck); f != nil; f = Uniqs(f) {
p = f.Prog
- Thearch.Proginfo(&info, p)
+ info = Thearch.Proginfo(p)
if (info.Flags&LeftRead != 0) && Thearch.Smallindir(&p.From, &fcheck.Prog.From) {
fcheck.Data = &killed
if p.As == obj.AVARDEF || p.As == obj.AVARKILL {
continue
}
- Thearch.Proginfo(&info, p)
+ info = Thearch.Proginfo(p)
// Avoid making variables for direct-called functions.
if p.As == obj.ACALL && p.To.Type == obj.TYPE_MEM && p.To.Name == obj.NAME_EXTERN {