]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.cc] cmd/new6g, etc: reconvert to add profiling
authorRuss Cox <rsc@golang.org>
Mon, 23 Feb 2015 15:22:26 +0000 (10:22 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 23 Feb 2015 16:52:11 +0000 (16:52 +0000)
Converted from rsc.io/c2go rev a9bc7f2.
Adds profiling support.

Change-Id: Ie04f86b71e0713c7294416c77d349e0d93798403
Reviewed-on: https://go-review.googlesource.com/5574
Reviewed-by: Rob Pike <r@golang.org>
src/cmd/internal/gc/lex.go
src/cmd/internal/gc/util.go
src/cmd/new5g/galign.go
src/cmd/new6g/galign.go
src/cmd/new8g/galign.go
src/cmd/new9g/galign.go

index 651ba5f65fc3e301d093c79a4714918c1074acf5..555a8fddd650bcbb0c043fe1911e7539e61b12b7 100644 (file)
@@ -72,7 +72,7 @@ const (
 func usage() {
        fmt.Printf("usage: %cg [options] file.go...\n", Thearch.Thechar)
        obj.Flagprint(1)
-       os.Exit(2)
+       Exit(2)
 }
 
 func fault(s int) {
@@ -225,6 +225,8 @@ func Main() {
                obj.Flagcount("largemodel", "generate code that assumes a large memory model", &flag_largemodel)
        }
 
+       obj.Flagstr("cpuprofile", "file: write cpu profile to file", &cpuprofile)
+       obj.Flagstr("memprofile", "file: write memory profile to file", &memprofile)
        obj.Flagparse(usage)
        Ctxt.Debugasm = int32(Debug['S'])
        Ctxt.Debugvlog = int32(Debug['v'])
@@ -233,6 +235,8 @@ func Main() {
                usage()
        }
 
+       startProfile()
+
        if flag_race != 0 {
                racepkg = mkpkg(newstrlit("runtime/race"))
                racepkg.Name = "race"
index ceb3eead35321f7c45b888a7faf2a5633f5e12a5..df68d50058209ea84552c7fe784041d2cf39eb36 100644 (file)
@@ -2,6 +2,8 @@ package gc
 
 import (
        "cmd/internal/obj"
+       "os"
+       "runtime/pprof"
        "strconv"
        "strings"
 )
@@ -68,3 +70,45 @@ func stringsCompare(a, b string) int {
        }
        return +1
 }
+
+var atExitFuncs []func()
+
+func AtExit(f func()) {
+       atExitFuncs = append(atExitFuncs, f)
+}
+
+func Exit(code int) {
+       for i := len(atExitFuncs) - 1; i >= 0; i-- {
+               f := atExitFuncs[i]
+               atExitFuncs = atExitFuncs[:i]
+               f()
+       }
+       os.Exit(code)
+}
+
+var cpuprofile string
+var memprofile string
+
+func startProfile() {
+       if cpuprofile != "" {
+               f, err := os.Create(cpuprofile)
+               if err != nil {
+                       Fatal("%v", err)
+               }
+               if err := pprof.StartCPUProfile(f); err != nil {
+                       Fatal("%v", err)
+               }
+               AtExit(pprof.StopCPUProfile)
+       }
+       if memprofile != "" {
+               f, err := os.Create(memprofile)
+               if err != nil {
+                       Fatal("%v", err)
+               }
+               AtExit(func() {
+                       if err := pprof.WriteHeapProfile(f); err != nil {
+                               Fatal("%v", err)
+                       }
+               })
+       }
+}
index 95f11ec7dc7eefd1b111ec6bce820722128ee3a0..d2eeeab4560763e8d94893ca42a1679c6d0f2849 100644 (file)
@@ -81,4 +81,5 @@ func main() {
        gc.Thearch.Regnames = regnames
 
        gc.Main()
+       gc.Exit(0)
 }
index d5d1e9ad59e76b32f18ab99db730341d1e81d54a..bdd8a3c2264517221fe725286f125db7beb041a1 100644 (file)
@@ -106,4 +106,5 @@ func main() {
        gc.Thearch.Regnames = regnames
 
        gc.Main()
+       gc.Exit(0)
 }
index a4f844dfff8d0c559c6607cc1b407803169e18c6..45ef1302f35aa07117582c9c4e4ac1c707105201 100644 (file)
@@ -81,4 +81,5 @@ func main() {
        gc.Thearch.Regnames = regnames
 
        gc.Main()
+       gc.Exit(0)
 }
index a3ce760e0e055ef1e97307272aad7b263a155214..99425c3929d43ea630f566cf2b7cfac605eaa928 100644 (file)
@@ -89,4 +89,5 @@ func main() {
        gc.Thearch.Regnames = regnames
 
        gc.Main()
+       gc.Exit(0)
 }