}
Ctxt.Flag_shared = int32(flag_shared)
Ctxt.Flag_dynlink = flag_dynlink
+ Ctxt.Flag_optimize = Debug['N'] == 0
Ctxt.Debugasm = int32(Debug['S'])
Ctxt.Debugvlog = int32(Debug['v'])
fmt.Printf("%v\n", p)
}
if p.As != obj.ACALL && p.To.Type == obj.TYPE_BRANCH && p.To.Val.(*obj.Prog) != nil && p.To.Val.(*obj.Prog).As == obj.AJMP {
- p.To.Val = chasejmp(p.To.Val.(*obj.Prog), &jmploop)
- if Debug['R'] != 0 && Debug['v'] != 0 {
- fmt.Printf("->%v\n", p)
+ if Debug['N'] == 0 {
+ p.To.Val = chasejmp(p.To.Val.(*obj.Prog), &jmploop)
+ if Debug['R'] != 0 && Debug['v'] != 0 {
+ fmt.Printf("->%v\n", p)
+ }
}
}
p.Opt = dead
}
-
if Debug['R'] != 0 && Debug['v'] != 0 {
fmt.Printf("\n")
}
// pass 4: elide JMP to next instruction.
// only safe if there are no jumps to JMPs anymore.
- if jmploop == 0 {
+ if jmploop == 0 && Debug['N'] == 0 {
var last *obj.Prog
for p := firstp; p != nil; p = p.Link {
if p.As == obj.AJMP && p.To.Type == obj.TYPE_BRANCH && p.To.Val == p.Link {
Debugpcln int32
Flag_shared int32
Flag_dynlink bool
+ Flag_optimize bool
Bso *Biobuf
Pathname string
Windows int32
for s := text; s != nil; s = s.Next {
mkfwd(s)
linkpatch(ctxt, s)
- ctxt.Arch.Follow(ctxt, s)
+ if ctxt.Flag_optimize {
+ ctxt.Arch.Follow(ctxt, s)
+ }
ctxt.Arch.Preprocess(ctxt, s)
ctxt.Arch.Assemble(ctxt, s)
fieldtrack(ctxt, s)
p.Pcond = q
}
- for p := sym.Text; p != nil; p = p.Link {
- p.Mark = 0 /* initialization for follow */
- if p.Pcond != nil {
- p.Pcond = brloop(ctxt, p.Pcond)
+ if ctxt.Flag_optimize {
+ for p := sym.Text; p != nil; p = p.Link {
+ p.Mark = 0 /* initialization for follow */
if p.Pcond != nil {
- if p.To.Type == TYPE_BRANCH {
- p.To.Offset = p.Pcond.Pc
+ p.Pcond = brloop(ctxt, p.Pcond)
+ if p.Pcond != nil {
+ if p.To.Type == TYPE_BRANCH {
+ p.To.Offset = p.Pcond.Pc
+ }
}
}
}
ctxt.Goarm = Getgoarm()
}
+ ctxt.Flag_optimize = true
return ctxt
}