]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: keep JMPs around with -N
authorKeith Randall <khr@golang.org>
Tue, 23 Feb 2016 18:54:36 +0000 (10:54 -0800)
committerKeith Randall <khr@golang.org>
Wed, 24 Feb 2016 00:16:23 +0000 (00:16 +0000)
When -N, make sure we don't drop every instruction from
a block, even ones which would otherwise be empty.
Helps keep line numbers around for debugging, particularly
for break and continue statements (which often compile
down to nothing).

Fixes #14379

Change-Id: I33722c4f0dcd502f146fa48af262ba3a477c959a
Reviewed-on: https://go-review.googlesource.com/19854
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Minux Ma <minux@golang.org>
src/cmd/compile/internal/gc/lex.go
src/cmd/compile/internal/gc/popt.go
src/cmd/internal/obj/link.go
src/cmd/internal/obj/objfile.go
src/cmd/internal/obj/pass.go
src/cmd/internal/obj/sym.go

index 89b442796ba4edc3eefc104fa5e085925cc07641..6298bbbbba93217aefdb5b9fbfdd788231bc6a0f 100644 (file)
@@ -236,6 +236,7 @@ func Main() {
        }
        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'])
index b70822284557a49a31f7648a0d2e09d72048f331..87460875b75b3358a4c0b5cc567df8c7ae1a5bad 100644 (file)
@@ -138,15 +138,16 @@ func fixjmp(firstp *obj.Prog) {
                        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")
        }
@@ -186,7 +187,7 @@ func fixjmp(firstp *obj.Prog) {
 
        // 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 {
index 762a49ecf2a7b728465002665105ad02b73dea5e..0fe3275a8ebad674b926bb00e2164a40ea78c7f8 100644 (file)
@@ -572,6 +572,7 @@ type Link struct {
        Debugpcln          int32
        Flag_shared        int32
        Flag_dynlink       bool
+       Flag_optimize      bool
        Bso                *Biobuf
        Pathname           string
        Windows            int32
index bae64f4a29bc077ca91b8f7c0456c27927b4000f..40c92dd15280720fa8b6b710964a6c5ee99fa362 100644 (file)
@@ -295,7 +295,9 @@ func Flushplist(ctxt *Link) {
        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)
index b92dfe23fb4c5bd3cc055d857950a9063b8de01e..ae38c4130a149375a8691064322b0e0150d7a75b 100644 (file)
@@ -202,13 +202,15 @@ func linkpatch(ctxt *Link, sym *LSym) {
                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
+                                       }
                                }
                        }
                }
index dd5297edc512507af9d9198daa5f89efe73accff..d9935b3d5139cfe144f0ed4e79074414f5b66790 100644 (file)
@@ -110,6 +110,7 @@ func Linknew(arch *LinkArch) *Link {
                ctxt.Goarm = Getgoarm()
        }
 
+       ctxt.Flag_optimize = true
        return ctxt
 }